berkshelf 0.1.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.
- data/.gitignore +20 -0
- data/.rbenv-version +1 -0
- data/Gemfile +3 -0
- data/Guardfile +23 -0
- data/LICENSE +22 -0
- data/README.rdoc +102 -0
- data/Thorfile +47 -0
- data/berkshelf.gemspec +39 -0
- data/features/config.sample.yml +3 -0
- data/features/init_command.feature +40 -0
- data/features/install.feature +55 -0
- data/features/lockfile.feature +22 -0
- data/features/step_definitions/chef_server_steps.rb +13 -0
- data/features/step_definitions/cli_steps.rb +56 -0
- data/features/step_definitions/filesystem_steps.rb +79 -0
- data/features/support/env.rb +55 -0
- data/features/update.feature +23 -0
- data/features/upload_command.feature +43 -0
- data/features/without.feature +25 -0
- data/lib/berkshelf.rb +90 -0
- data/lib/berkshelf/berksfile.rb +170 -0
- data/lib/berkshelf/cached_cookbook.rb +253 -0
- data/lib/berkshelf/cookbook_source.rb +139 -0
- data/lib/berkshelf/cookbook_source/git_location.rb +54 -0
- data/lib/berkshelf/cookbook_source/path_location.rb +27 -0
- data/lib/berkshelf/cookbook_source/site_location.rb +206 -0
- data/lib/berkshelf/cookbook_store.rb +77 -0
- data/lib/berkshelf/core_ext.rb +3 -0
- data/lib/berkshelf/core_ext/file.rb +14 -0
- data/lib/berkshelf/core_ext/kernel.rb +33 -0
- data/lib/berkshelf/core_ext/pathname.rb +24 -0
- data/lib/berkshelf/downloader.rb +92 -0
- data/lib/berkshelf/dsl.rb +39 -0
- data/lib/berkshelf/errors.rb +20 -0
- data/lib/berkshelf/generator_files/Berksfile.erb +3 -0
- data/lib/berkshelf/generator_files/chefignore +44 -0
- data/lib/berkshelf/git.rb +70 -0
- data/lib/berkshelf/init_generator.rb +38 -0
- data/lib/berkshelf/lockfile.rb +42 -0
- data/lib/berkshelf/resolver.rb +176 -0
- data/lib/berkshelf/tx_result.rb +12 -0
- data/lib/berkshelf/tx_result_set.rb +37 -0
- data/lib/berkshelf/uploader.rb +153 -0
- data/lib/berkshelf/version.rb +3 -0
- data/lib/chef/knife/berks_init.rb +29 -0
- data/lib/chef/knife/berks_install.rb +27 -0
- data/lib/chef/knife/berks_update.rb +23 -0
- data/lib/chef/knife/berks_upload.rb +39 -0
- data/spec/fixtures/Berksfile +3 -0
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/README.md +12 -0
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/metadata.rb +6 -0
- data/spec/fixtures/cookbooks/example_cookbook-0.5.0/recipes/default.rb +8 -0
- data/spec/fixtures/cookbooks/example_cookbook/README.md +12 -0
- data/spec/fixtures/cookbooks/example_cookbook/metadata.rb +6 -0
- data/spec/fixtures/cookbooks/example_cookbook/recipes/default.rb +8 -0
- data/spec/fixtures/cookbooks/invalid_ruby_files-1.0.0/recipes/default.rb +1 -0
- data/spec/fixtures/cookbooks/invalid_template_files-1.0.0/templates/default/broken.erb +1 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/README.md +77 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/attributes/default.rb +65 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/definitions/nginx_site.rb +35 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/files/default/mime.types +73 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/files/ubuntu/mime.types +73 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/libraries/nginxlib.rb +1 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/metadata.rb +91 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/providers/defprovider.rb +1 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/recipes/default.rb +59 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/resources/defresource.rb +1 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/templates/default/nginx.pill.erb +15 -0
- data/spec/fixtures/cookbooks/nginx-0.100.5/templates/default/plugins/nginx.rb.erb +66 -0
- data/spec/fixtures/lockfile_spec/with_lock/Berksfile +1 -0
- data/spec/fixtures/lockfile_spec/without_lock/Berksfile.lock +5 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/chef_api.rb +27 -0
- data/spec/support/matchers/file_system_matchers.rb +115 -0
- data/spec/support/matchers/filepath_matchers.rb +19 -0
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +420 -0
- data/spec/unit/berkshelf/cookbook_source/git_location_spec.rb +59 -0
- data/spec/unit/berkshelf/cookbook_source/path_location_spec.rb +34 -0
- data/spec/unit/berkshelf/cookbook_source/site_location_spec.rb +166 -0
- data/spec/unit/berkshelf/cookbook_source_spec.rb +194 -0
- data/spec/unit/berkshelf/cookbook_store_spec.rb +71 -0
- data/spec/unit/berkshelf/cookbookfile_spec.rb +160 -0
- data/spec/unit/berkshelf/downloader_spec.rb +82 -0
- data/spec/unit/berkshelf/dsl_spec.rb +42 -0
- data/spec/unit/berkshelf/git_spec.rb +63 -0
- data/spec/unit/berkshelf/init_generator_spec.rb +52 -0
- data/spec/unit/berkshelf/lockfile_spec.rb +25 -0
- data/spec/unit/berkshelf/resolver_spec.rb +126 -0
- data/spec/unit/berkshelf/tx_result_set_spec.rb +77 -0
- data/spec/unit/berkshelf/tx_result_spec.rb +21 -0
- data/spec/unit/berkshelf/uploader_spec.rb +71 -0
- data/spec/unit/berkshelf_spec.rb +29 -0
- metadata +411 -0
data/.gitignore
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
*.gem
|
|
2
|
+
*.rbc
|
|
3
|
+
.bundle
|
|
4
|
+
.config
|
|
5
|
+
.yardoc
|
|
6
|
+
/Gemfile.lock
|
|
7
|
+
_yardoc
|
|
8
|
+
/coverage
|
|
9
|
+
/doc/
|
|
10
|
+
/pkg
|
|
11
|
+
/spec/reports
|
|
12
|
+
/Berksfile*
|
|
13
|
+
tmp
|
|
14
|
+
*~
|
|
15
|
+
*.tar*
|
|
16
|
+
\#*
|
|
17
|
+
.DS_Store
|
|
18
|
+
/spec/fixtures/vcr_cassettes/*
|
|
19
|
+
/features/config.yml
|
|
20
|
+
*.sw[op]
|
data/.rbenv-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.9.3-p125
|
data/Gemfile
ADDED
data/Guardfile
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
guard 'spork' do
|
|
2
|
+
watch('Gemfile')
|
|
3
|
+
watch('spec/spec_helper.rb') { :rspec }
|
|
4
|
+
watch(%r{^features/support/}) { :cucumber }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
guard 'yard', :stdout => '/dev/null', :stderr => '/dev/null' do
|
|
8
|
+
watch(%r{app/.+\.rb})
|
|
9
|
+
watch(%r{lib/.+\.rb})
|
|
10
|
+
watch(%r{ext/.+\.c})
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
guard 'rspec', :version => 2, :cli => "--color --drb --format Fuubar", :all_on_start => false, :all_after_pass => false, :notification => false do
|
|
14
|
+
watch(%r{^spec/unit/.+_spec\.rb$})
|
|
15
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
|
|
16
|
+
watch('spec/spec_helper.rb') { "spec" }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
guard 'cucumber', :cli => "--drb --format pretty --tags ~@wip", :all_on_start => false, :all_after_pass => false, :notification => false do
|
|
20
|
+
watch(%r{^features/.+\.feature$})
|
|
21
|
+
watch(%r{^features/support/.+$}) { 'features' }
|
|
22
|
+
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
|
|
23
|
+
end
|
data/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2012 Riot Games
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
= Berkshelf
|
|
2
|
+
|
|
3
|
+
Manages a Cookbook's, or an Application's, Cookbook dependencies
|
|
4
|
+
|
|
5
|
+
== Getting Started
|
|
6
|
+
|
|
7
|
+
=== Install
|
|
8
|
+
|
|
9
|
+
$ gem install berkshelf
|
|
10
|
+
|
|
11
|
+
=== Use
|
|
12
|
+
|
|
13
|
+
==== Berksfile
|
|
14
|
+
|
|
15
|
+
Dependencies are managed via a `Berksfile` in the directory where you want the cookbooks to be installed. The Berksfile, like Bundler's Gemfile, contains which cookbooks are needed and, optionally, where to find them:
|
|
16
|
+
|
|
17
|
+
cookbook 'memcached'
|
|
18
|
+
cookbook 'nginx'
|
|
19
|
+
cookbook 'my_app', path: '/path/to/cookbook'
|
|
20
|
+
cookbook 'mysql', git: 'git://github.com/opscode-cookbooks/mysql.git'
|
|
21
|
+
|
|
22
|
+
==== CLI
|
|
23
|
+
|
|
24
|
+
The CLI consists of 2 commands: install, update
|
|
25
|
+
|
|
26
|
+
$ knife berks (install|update) [(--without|-W) group_to_exclude]
|
|
27
|
+
|
|
28
|
+
[install] Installs the from the Berksfile.lock, or Berksfile if the the lockfile does not exist.
|
|
29
|
+
|
|
30
|
+
[update] Skips the lockfile and installs fresh
|
|
31
|
+
|
|
32
|
+
[init] Prepares a local path to have it's Cookbook dependencies managed by Berkshelf. If the target path is a Cookbook itself, additional Berkshelf support files will be generated to get you started.
|
|
33
|
+
|
|
34
|
+
== The Berksfile
|
|
35
|
+
|
|
36
|
+
Cookbooks are defined as dependencies by declaring them in the `Berksfile`
|
|
37
|
+
|
|
38
|
+
cookbook 'nginx'
|
|
39
|
+
|
|
40
|
+
Cookbooks without additional options are assumed to come from the Opscode Community site at the latest available version: http://community.opscode.com/cookbooks
|
|
41
|
+
|
|
42
|
+
Options available include:
|
|
43
|
+
|
|
44
|
+
version constraint
|
|
45
|
+
|
|
46
|
+
cookbook "nginx", "= 0.101.2" # precisely 0.101.2
|
|
47
|
+
cookbook "mysql", "< 1.2.4" # less than and not including 1.2.4
|
|
48
|
+
cookbook "openssl", "~> 1.0.0" # greater than 1.0.0, and up to but not including 1.1.0
|
|
49
|
+
|
|
50
|
+
git
|
|
51
|
+
|
|
52
|
+
# ref can be a branch name, tag, or commit hash. If ref is not provided, HEAD is used.
|
|
53
|
+
cookbook "mysql", git: "https://github.com/opscode-cookbooks/mysql.git", ref: "<any git ref>"
|
|
54
|
+
|
|
55
|
+
path
|
|
56
|
+
|
|
57
|
+
# knife berks will look in /path/to/location/of/my_application for the cookbook
|
|
58
|
+
cookbook "my_application", path: "/path/to/location/of"
|
|
59
|
+
|
|
60
|
+
=== Groups
|
|
61
|
+
|
|
62
|
+
Groups can be defined via blocks or inline as an option:
|
|
63
|
+
|
|
64
|
+
group :solo do
|
|
65
|
+
cookbook 'base'
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
cookbook 'base', :group => 'solo'
|
|
69
|
+
|
|
70
|
+
When using install or update, groups can be excluded with the --without GROUP_NAME or -W GROUP_NAME flags.
|
|
71
|
+
|
|
72
|
+
= Contributing
|
|
73
|
+
|
|
74
|
+
== Running tests
|
|
75
|
+
|
|
76
|
+
=== Install prerequisites
|
|
77
|
+
|
|
78
|
+
Install the latest version of {Bundler}[http://gembundler.com]
|
|
79
|
+
|
|
80
|
+
$ gem install bundler
|
|
81
|
+
|
|
82
|
+
Clone the project
|
|
83
|
+
|
|
84
|
+
$ git clone git://github.com/RiotGames/berkshelf.git
|
|
85
|
+
|
|
86
|
+
and run:
|
|
87
|
+
|
|
88
|
+
$ cd berkshelf
|
|
89
|
+
$ bundle install
|
|
90
|
+
|
|
91
|
+
Bundler will install all gems and their dependencies required for testing and developing.
|
|
92
|
+
|
|
93
|
+
=== Running unit (RSpec) and acceptance (Cucumber) tests
|
|
94
|
+
|
|
95
|
+
$ bundle exec guard start
|
|
96
|
+
|
|
97
|
+
= Authors and Contributors
|
|
98
|
+
|
|
99
|
+
* Josiah Kiehl (<josiah@skirmisher.net>)
|
|
100
|
+
* Jamie Winsor (<jamie@vialstudios.com>)
|
|
101
|
+
* Erik Hollensbe (<erik@hollensbe.org>)
|
|
102
|
+
* Michael Ivey (<ivey@gweezlebur.com>)
|
data/Thorfile
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
|
|
4
|
+
require 'bundler'
|
|
5
|
+
require 'bundler/setup'
|
|
6
|
+
|
|
7
|
+
require 'berkshelf'
|
|
8
|
+
require 'thor/rake_compat'
|
|
9
|
+
|
|
10
|
+
class Berks < Thor
|
|
11
|
+
include Thor::RakeCompat
|
|
12
|
+
Bundler::GemHelper.install_tasks
|
|
13
|
+
|
|
14
|
+
desc "build", "Build berkshelf-#{Berkshelf::VERSION}.gem into the pkg directory"
|
|
15
|
+
def build
|
|
16
|
+
Rake::Task["build"].execute
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
desc "install", "Build and install berkshelf-#{Berkshelf::VERSION}.gem into system gems"
|
|
20
|
+
def install
|
|
21
|
+
Rake::Task["install"].execute
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
desc "release", "Create tag v#{Berkshelf::VERSION} and build and push berkshelf-#{Berkshelf::VERSION}.gem to Rubygems"
|
|
25
|
+
def release
|
|
26
|
+
Rake::Task["release"].execute
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
desc "spec", "Run RSpec code examples"
|
|
30
|
+
def spec
|
|
31
|
+
exec "rspec --color --format=documentation spec"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
desc "cucumber", "Run Cucumber features"
|
|
35
|
+
def cucumber
|
|
36
|
+
exec "cucumber --color --format=progress"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class VCR < Thor
|
|
40
|
+
namespace :vcr
|
|
41
|
+
|
|
42
|
+
desc "clean", "clean VCR cassettes"
|
|
43
|
+
def clean
|
|
44
|
+
FileUtils.rm_rf("spec/fixtures/vcr_cassettes/*")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
data/berkshelf.gemspec
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# -*- encoding: utf-8; mode: ruby -*-
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../lib/berkshelf/version', __FILE__)
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.authors = ["Josiah Kiehl", "Jamie Winsor", "Michael Ivey", "Erik Hollensbe"]
|
|
7
|
+
s.email = ["josiah@skirmisher.net", "jamie@vialstudios.com", "ivey@gweezlebur.com", "erik@hollensbe.org"]
|
|
8
|
+
s.description = %q{Manages a Cookbook's, or an Application's, Cookbook dependencies}
|
|
9
|
+
s.summary = s.description
|
|
10
|
+
s.homepage = "https://github.com/RiotGames/berkshelf"
|
|
11
|
+
s.files = `git ls-files`.split($\)
|
|
12
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
13
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
|
14
|
+
s.name = "berkshelf"
|
|
15
|
+
s.require_paths = ["lib"]
|
|
16
|
+
s.version = Berkshelf::VERSION
|
|
17
|
+
s.required_ruby_version = ">= 1.9.1"
|
|
18
|
+
|
|
19
|
+
s.add_runtime_dependency 'dep_selector'
|
|
20
|
+
s.add_runtime_dependency 'chef', '~> 0.10.0'
|
|
21
|
+
s.add_runtime_dependency 'minitar'
|
|
22
|
+
s.add_runtime_dependency 'thor', '~> 0.15.2'
|
|
23
|
+
|
|
24
|
+
s.add_development_dependency 'cucumber'
|
|
25
|
+
s.add_development_dependency 'vcr'
|
|
26
|
+
s.add_development_dependency 'webmock'
|
|
27
|
+
s.add_development_dependency 'aruba'
|
|
28
|
+
s.add_development_dependency 'rspec'
|
|
29
|
+
s.add_development_dependency 'json_spec'
|
|
30
|
+
s.add_development_dependency 'simplecov'
|
|
31
|
+
s.add_development_dependency 'fuubar'
|
|
32
|
+
s.add_development_dependency 'spork'
|
|
33
|
+
s.add_development_dependency 'yard'
|
|
34
|
+
s.add_development_dependency 'guard'
|
|
35
|
+
s.add_development_dependency 'guard-rspec'
|
|
36
|
+
s.add_development_dependency 'guard-cucumber'
|
|
37
|
+
s.add_development_dependency 'guard-spork'
|
|
38
|
+
s.add_development_dependency 'guard-yard'
|
|
39
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Feature: initialize command
|
|
2
|
+
As a Cookbook author
|
|
3
|
+
I want a way to quickly prepare a Cookbook on my local disk with Berkshelf files
|
|
4
|
+
So that I can resolve my Cookbook's dependencies with Berkshelf
|
|
5
|
+
|
|
6
|
+
Scenario: initializing a path containing a cookbook
|
|
7
|
+
Given a cookbook named "sparkle_motion"
|
|
8
|
+
When I run the init command with the cookbook "sparkle_motion" as the target
|
|
9
|
+
Then the cookbook "sparkle_motion" should have the following files:
|
|
10
|
+
| Berksfile |
|
|
11
|
+
| .chefignore |
|
|
12
|
+
And the file "Berksfile" in the cookbook "sparkle_motion" should contain:
|
|
13
|
+
"""
|
|
14
|
+
metadata
|
|
15
|
+
"""
|
|
16
|
+
And the output should contain "Successfully initialized"
|
|
17
|
+
And the exit status should be 0
|
|
18
|
+
|
|
19
|
+
Scenario: initializing a path that does not contain a cookbook
|
|
20
|
+
Given a directory named "not_a_cookbook"
|
|
21
|
+
When I run the init command with the directory "not_a_cookbook" as the target
|
|
22
|
+
Then the directory "not_a_cookbook" should have the following files:
|
|
23
|
+
| Berksfile |
|
|
24
|
+
And the directory "not_a_cookbook" should not have the following files:
|
|
25
|
+
| .chefignore |
|
|
26
|
+
And the file "Berksfile" in the directory "not_a_cookbook" should not contain:
|
|
27
|
+
"""
|
|
28
|
+
metadata
|
|
29
|
+
"""
|
|
30
|
+
And the output should contain "Successfully initialized"
|
|
31
|
+
And the exit status should be 0
|
|
32
|
+
|
|
33
|
+
Scenario: initializing with no value given for target
|
|
34
|
+
When I run the init command with no value for the target
|
|
35
|
+
Then the output should contain "Successfully initialized"
|
|
36
|
+
And the current directory should have the following files:
|
|
37
|
+
| Berksfile |
|
|
38
|
+
And the current directory should not have the following files:
|
|
39
|
+
| .chefignore |
|
|
40
|
+
And the exit status should be 0
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
Feature: install cookbooks from a Berksfile
|
|
2
|
+
As a user with a Berksfile
|
|
3
|
+
I want to be able to run knife berkshelf install to install my cookbooks
|
|
4
|
+
So that I don't have to download my cookbooks and their dependencies manually
|
|
5
|
+
|
|
6
|
+
Scenario: install cookbooks
|
|
7
|
+
Given I write to "Berksfile" with:
|
|
8
|
+
"""
|
|
9
|
+
cookbook "mysql", "1.2.4"
|
|
10
|
+
"""
|
|
11
|
+
When I run the install command
|
|
12
|
+
Then the cookbook store should have the cookbooks:
|
|
13
|
+
| mysql | 1.2.4 |
|
|
14
|
+
| openssl | 1.0.0 |
|
|
15
|
+
And the output should contain:
|
|
16
|
+
"""
|
|
17
|
+
Installing mysql (1.2.4) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
|
|
18
|
+
Installing openssl (1.0.0) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
Scenario: running install when current project is a cookbook and the 'metadata' is specified
|
|
22
|
+
Given a cookbook named "sparkle_motion"
|
|
23
|
+
And the cookbook "sparkle_motion" has the file "Berksfile" with:
|
|
24
|
+
"""
|
|
25
|
+
metadata
|
|
26
|
+
"""
|
|
27
|
+
When I cd to "sparkle_motion"
|
|
28
|
+
And I run the install command
|
|
29
|
+
Then the output should contain:
|
|
30
|
+
"""
|
|
31
|
+
Using sparkle_motion (0.0.0) at path:
|
|
32
|
+
"""
|
|
33
|
+
And the exit status should be 0
|
|
34
|
+
|
|
35
|
+
Scenario: running install with no Berksfile or Berksfile.lock
|
|
36
|
+
Given I do not have a Berksfile
|
|
37
|
+
And I do not have a Berksfile.lock
|
|
38
|
+
When I run the install command
|
|
39
|
+
Then the output should contain:
|
|
40
|
+
"""
|
|
41
|
+
No Berksfile or Berksfile.lock found at:
|
|
42
|
+
"""
|
|
43
|
+
And the CLI should exit with the status code for error "BerksfileNotFound"
|
|
44
|
+
|
|
45
|
+
Scenario: running install when the Cookbook is not found on the remote site
|
|
46
|
+
Given I write to "Berksfile" with:
|
|
47
|
+
"""
|
|
48
|
+
cookbook "doesntexist"
|
|
49
|
+
"""
|
|
50
|
+
And I run the install command
|
|
51
|
+
Then the output should contain:
|
|
52
|
+
"""
|
|
53
|
+
Cookbook 'doesntexist' not found at site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
|
|
54
|
+
"""
|
|
55
|
+
And the CLI should exit with the status code for error "DownloadFailure"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Feature: Berksfile.lock
|
|
2
|
+
As a user
|
|
3
|
+
I want my versions to be locked even when I don't specify versions in my Berksfile
|
|
4
|
+
So when I share my repository, all other developers get the same versions that I did when I installed.
|
|
5
|
+
|
|
6
|
+
@slow_process
|
|
7
|
+
Scenario: Writing the Berksfile.lock
|
|
8
|
+
Given I write to "Berksfile" with:
|
|
9
|
+
"""
|
|
10
|
+
cookbook 'ntp'
|
|
11
|
+
cookbook 'mysql', git: 'https://github.com/opscode-cookbooks/mysql.git', :ref => '190c0c2267785b7b9b303369b8a64ed04364d5f9'
|
|
12
|
+
"""
|
|
13
|
+
When I run the install command
|
|
14
|
+
Then a file named "Berksfile.lock" should exist in the current directory
|
|
15
|
+
And the file "Berksfile.lock" should contain in the current directory:
|
|
16
|
+
"""
|
|
17
|
+
cookbook 'ntp', :locked_version => '1.1.8'
|
|
18
|
+
cookbook 'mysql', :git => 'https://github.com/opscode-cookbooks/mysql.git', :ref => '190c0c2267785b7b9b303369b8a64ed04364d5f9'
|
|
19
|
+
cookbook 'openssl', :locked_version => '1.0.0'
|
|
20
|
+
cookbook 'chef_handler', :locked_version => '1.0.6'
|
|
21
|
+
cookbook 'windows', :locked_version => '1.3.0'
|
|
22
|
+
"""
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
World(Berkshelf::RSpec::ChefAPI)
|
|
2
|
+
|
|
3
|
+
Given /^the Chef server does not have the cookbooks:$/ do |cookbooks|
|
|
4
|
+
cookbooks.raw.each do |name, version|
|
|
5
|
+
purge_cookbook(name, version)
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
Then /^the Chef server should have the cookbooks:$/ do |cookbooks|
|
|
10
|
+
cookbooks.raw.each do |name, version|
|
|
11
|
+
server_has_cookbook?(name, version).should be_true
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'aruba/api'
|
|
2
|
+
|
|
3
|
+
World(Aruba::Api)
|
|
4
|
+
World(Berkshelf::RSpec::FileSystemMatchers)
|
|
5
|
+
|
|
6
|
+
Then /^I trace$/ do
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
When /^I sleep$/ do
|
|
10
|
+
sleep 10
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Then /^a file named "(.*?)" should exist in the current directory$/ do |filename|
|
|
14
|
+
in_current_dir do
|
|
15
|
+
File.exists?(filename).should be_true # not sure why Aruba's
|
|
16
|
+
# #check_file_presence
|
|
17
|
+
# doesn't work here. It
|
|
18
|
+
# looks in the wrong
|
|
19
|
+
# directory.
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Then /^the file "(.*?)" should contain in the current directory:$/ do |filename, string|
|
|
24
|
+
in_current_dir do
|
|
25
|
+
File.read(filename).should match(Regexp.new(string))
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
When /^I run the init command with the cookbook "(.*?)" as the target$/ do |cookbook_name|
|
|
30
|
+
run_simple(unescape("knife berks init #{cookbook_name}"), false)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
When /^I run the init command with the directory "(.*?)" as the target$/ do |directory_name|
|
|
34
|
+
run_simple(unescape("knife berks init #{directory_name}"), false)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
When /^I run the init command with no value for the target$/ do
|
|
38
|
+
run_simple(unescape("knife berks init"), false)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
When /^I run the install command$/ do
|
|
42
|
+
run_simple(unescape("knife berks install"), false)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
When /^I run the update command$/ do
|
|
46
|
+
run_simple(unescape("knife berks update"), false)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
When /^I run the upload command$/ do
|
|
50
|
+
run_simple(unescape("knife berks upload"), false)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Then /^the CLI should exit with the status code for error "(.*?)"$/ do |error_constant|
|
|
54
|
+
exit_status = Berkshelf.const_get(error_constant).status_code
|
|
55
|
+
assert_exit_status(exit_status)
|
|
56
|
+
end
|