berkshelf 2.0.18 → 3.0.0.beta1
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/.ruby-version +1 -1
- data/.travis.yml +4 -1
- data/CHANGELOG.md +2 -26
- data/Gemfile +12 -2
- data/README.md +9 -1
- data/berkshelf.gemspec +9 -18
- data/bin/berks +3 -13
- data/features/apply_command.feature +11 -9
- data/features/berksfile.feature +8 -10
- data/features/config.feature +1 -2
- data/features/configure_command.feature +13 -14
- data/features/contingent_command.feature +13 -1
- data/features/cookbook_command.feature +2 -4
- data/features/groups_install.feature +10 -2
- data/features/help.feature +1 -1
- data/features/init_command.feature +5 -7
- data/features/install_command.feature +157 -228
- data/features/json_formatter.feature +27 -15
- data/features/licenses.feature +18 -12
- data/features/list_command.feature +6 -1
- data/features/lockfile.feature +116 -72
- data/features/outdated_command.feature +3 -47
- data/features/package_command.feature +10 -7
- data/features/shelf/show.feature +2 -2
- data/features/shelf/uninstall.feature +2 -2
- data/features/show_command.feature +10 -3
- data/features/step_definitions/chef/config_steps.rb +12 -0
- data/features/step_definitions/chef_server_steps.rb +16 -16
- data/features/step_definitions/cli_steps.rb +3 -79
- data/features/step_definitions/config_steps.rb +43 -0
- data/features/step_definitions/environment_steps.rb +7 -0
- data/features/step_definitions/filesystem_steps.rb +12 -57
- data/features/step_definitions/gem_steps.rb +1 -2
- data/features/step_definitions/json_steps.rb +3 -1
- data/features/step_definitions/lockfile_steps.rb +4 -0
- data/features/step_definitions/utility_steps.rb +0 -19
- data/features/support/aruba.rb +12 -0
- data/features/support/env.rb +52 -57
- data/features/update_command.feature +37 -23
- data/features/upload_command.feature +96 -160
- data/generator_files/Berksfile.erb +2 -1
- data/generator_files/Vagrantfile.erb +3 -0
- data/generator_files/default_test.rb.erb +1 -1
- data/generator_files/helpers.rb.erb +1 -1
- data/lib/berkshelf.rb +43 -24
- data/lib/berkshelf/api_client.rb +67 -0
- data/lib/berkshelf/api_client/remote_cookbook.rb +42 -0
- data/lib/berkshelf/berksfile.rb +232 -420
- data/lib/berkshelf/cached_cookbook.rb +22 -10
- data/lib/berkshelf/chef/config.rb +1 -0
- data/lib/berkshelf/cli.rb +66 -68
- data/lib/berkshelf/commands/shelf.rb +1 -1
- data/lib/berkshelf/community_rest.rb +10 -17
- data/lib/berkshelf/config.rb +23 -27
- data/lib/berkshelf/cookbook_generator.rb +3 -4
- data/lib/berkshelf/cookbook_store.rb +74 -17
- data/lib/berkshelf/core_ext/file.rb +2 -2
- data/lib/berkshelf/core_ext/pathname.rb +7 -5
- data/lib/berkshelf/{cookbook_source.rb → dependency.rb} +47 -67
- data/lib/berkshelf/downloader.rb +49 -106
- data/lib/berkshelf/errors.rb +64 -71
- data/lib/berkshelf/formatters.rb +11 -9
- data/lib/berkshelf/formatters/human_readable.rb +9 -9
- data/lib/berkshelf/formatters/json.rb +14 -4
- data/lib/berkshelf/init_generator.rb +3 -3
- data/lib/berkshelf/installer.rb +136 -0
- data/lib/berkshelf/location.rb +91 -131
- data/lib/berkshelf/locations/git_location.rb +9 -11
- data/lib/berkshelf/locations/github_location.rb +1 -1
- data/lib/berkshelf/locations/path_location.rb +10 -27
- data/lib/berkshelf/lockfile.rb +92 -70
- data/lib/berkshelf/logger.rb +4 -7
- data/lib/berkshelf/mixin/config.rb +21 -4
- data/lib/berkshelf/resolver.rb +60 -150
- data/lib/berkshelf/resolver/graph.rb +44 -0
- data/lib/berkshelf/source.rb +55 -0
- data/lib/berkshelf/source_uri.rb +38 -0
- data/lib/berkshelf/version.rb +1 -1
- data/spec/config/knife.rb +1 -1
- data/spec/fixtures/cassettes/Berkshelf_Resolver/_initialize/adds_the_dependencies_of_the_dependency_as_dependencies.yml +3694 -0
- data/spec/fixtures/cookbooks/example_cookbook/Berksfile.lock +1 -1
- data/spec/fixtures/lockfiles/default.lock +1 -1
- data/spec/spec_helper.rb +20 -121
- data/spec/support/chef_api.rb +3 -4
- data/spec/support/chef_server.rb +20 -11
- data/spec/support/git.rb +127 -0
- data/spec/support/kitchen.rb +12 -0
- data/spec/support/path_helpers.rb +69 -0
- data/spec/unit/berkshelf/api_client/remote_cookbook_spec.rb +23 -0
- data/spec/unit/berkshelf/api_client_spec.rb +57 -0
- data/spec/unit/berkshelf/berksfile_spec.rb +206 -324
- data/spec/unit/berkshelf/cached_cookbook_spec.rb +73 -38
- data/spec/unit/berkshelf/community_rest_spec.rb +30 -71
- data/spec/unit/berkshelf/config_spec.rb +3 -14
- data/spec/unit/berkshelf/cookbook_generator_spec.rb +1 -2
- data/spec/unit/berkshelf/cookbook_store_spec.rb +12 -7
- data/spec/unit/berkshelf/dependency_spec.rb +285 -0
- data/spec/unit/berkshelf/downloader_spec.rb +4 -183
- data/spec/unit/berkshelf/formatters/null_spec.rb +1 -1
- data/spec/unit/berkshelf/formatters_spec.rb +4 -2
- data/spec/unit/berkshelf/git_spec.rb +15 -15
- data/spec/unit/berkshelf/installer_spec.rb +39 -0
- data/spec/unit/berkshelf/location_spec.rb +87 -114
- data/spec/unit/berkshelf/locations/git_location_spec.rb +41 -53
- data/spec/unit/berkshelf/locations/path_location_spec.rb +13 -23
- data/spec/unit/berkshelf/lockfile_spec.rb +38 -40
- data/spec/unit/berkshelf/resolver/graph_spec.rb +44 -0
- data/spec/unit/berkshelf/resolver_spec.rb +34 -83
- data/spec/unit/berkshelf/source_spec.rb +23 -0
- data/spec/unit/berkshelf/source_uri_spec.rb +29 -0
- metadata +149 -188
- checksums.yaml +0 -7
- data/features/default_locations.feature +0 -127
- data/features/step_definitions/berksfile_steps.rb +0 -8
- data/features/step_definitions/configure_cli_steps.rb +0 -19
- data/features/vendor_install.feature +0 -19
- data/lib/berkshelf/core_ext/openuri.rb +0 -36
- data/lib/berkshelf/core_ext/rbzip2.rb +0 -8
- data/lib/berkshelf/locations/chef_api_location.rb +0 -228
- data/lib/berkshelf/locations/site_location.rb +0 -92
- data/lib/berkshelf/test.rb +0 -35
- data/spec/knife.rb.sample +0 -12
- data/spec/support/test_generators.rb +0 -27
- data/spec/unit/berkshelf/cli_spec.rb +0 -16
- data/spec/unit/berkshelf/cookbook_source_spec.rb +0 -358
- data/spec/unit/berkshelf/core_ext/pathname_spec.rb +0 -46
- data/spec/unit/berkshelf/locations/chef_api_location_spec.rb +0 -139
- data/spec/unit/berkshelf/locations/site_location_spec.rb +0 -19
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
Given /^the gem "(.*)" is not installed$/ do |gem_name|
|
|
2
|
-
|
|
3
|
-
set_env 'MISSING_GEMS', [ENV['MISSING_GEMS'], gem_name].compact.join(',')
|
|
2
|
+
Gem::Specification.stub(:find_by_name).with(gem_name).and_raise(Gem::LoadError)
|
|
4
3
|
end
|
|
5
4
|
|
|
6
5
|
Then /^the output should contain a warning to suggest supporting the option "(.*?)" by installing "(.*?)"$/ do |option, gem_name|
|
|
@@ -5,7 +5,9 @@ class Hash
|
|
|
5
5
|
if seed[key].is_a?(Hash)
|
|
6
6
|
seed[key] = seed[key].sort_by_key(&block)
|
|
7
7
|
elsif seed[key].is_a?(Array)
|
|
8
|
-
seed[key] = seed[key].map
|
|
8
|
+
seed[key] = seed[key].map do |i|
|
|
9
|
+
i.respond_to?(:sort_by_key) ? i.sort_by_key(&block) : i
|
|
10
|
+
end
|
|
9
11
|
end
|
|
10
12
|
seed
|
|
11
13
|
end
|
|
@@ -2,27 +2,8 @@ Given /^pending\s+"([^\"]+)"$/ do |msg|
|
|
|
2
2
|
pending
|
|
3
3
|
end
|
|
4
4
|
|
|
5
|
-
Given(/^the BERKSHELF_EDITOR and VISUAL environment variables are not set$/) do
|
|
6
|
-
set_env "BERKSHELF_EDITOR", nil
|
|
7
|
-
set_env "VISUAL", nil
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
Given /^the environment variable (.+) is nil$/ do |variable|
|
|
11
|
-
set_env variable, nil
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
Given /^the environment variable (.+) is "(.+)"$/ do |variable, value|
|
|
15
|
-
set_env variable, value
|
|
16
|
-
end
|
|
17
|
-
|
|
18
5
|
Then /^the output should be the same as \`(.+)\`$/ do |command|
|
|
19
6
|
run_simple(command)
|
|
20
7
|
output = output_from(command)
|
|
21
8
|
expect(all_output).to include(output)
|
|
22
9
|
end
|
|
23
|
-
|
|
24
|
-
# The built-in regex matcher does not support multi-line matching :(
|
|
25
|
-
Then /^the output should match multiline:$/ do |expected|
|
|
26
|
-
regex = Regexp.new(expected.strip, Regexp::MULTILINE)
|
|
27
|
-
expect(regex).to match(all_output)
|
|
28
|
-
end
|
data/features/support/env.rb
CHANGED
|
@@ -1,78 +1,73 @@
|
|
|
1
|
-
require 'rubygems'
|
|
2
|
-
require 'bundler'
|
|
3
1
|
require 'spork'
|
|
4
2
|
|
|
5
3
|
Spork.prefork do
|
|
6
|
-
require 'rspec'
|
|
7
|
-
require 'pp'
|
|
8
4
|
require 'aruba/cucumber'
|
|
5
|
+
require 'aruba/in_process'
|
|
6
|
+
require 'aruba/spawn_process'
|
|
7
|
+
require 'cucumber/rspec/doubles'
|
|
8
|
+
require 'berkshelf/api/rspec'
|
|
9
|
+
require 'berkshelf/api/cucumber'
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
Dir['spec/support/**/*.rb'].each { |f| require File.expand_path(f) }
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ENV['BERKSHELF_CHEF_CONFIG'] = File.join(APP_ROOT, 'spec', 'config', 'knife.rb')
|
|
13
|
+
World(Berkshelf::RSpec::PathHelpers)
|
|
14
|
+
World(Berkshelf::RSpec::Kitchen)
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
unless File.exist? git_ssh_path
|
|
19
|
-
git_ssh = File.new(git_ssh_path, 'w+')
|
|
20
|
-
git_ssh.puts 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $1 $2'
|
|
21
|
-
git_ssh.chmod 0775
|
|
22
|
-
git_ssh.flush
|
|
23
|
-
git_ssh.close
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
ENV['GIT_SSH'] = git_ssh_path
|
|
27
|
-
|
|
28
|
-
Dir[File.join(APP_ROOT, 'spec/support/**/*.rb')].each {|f| require f}
|
|
29
|
-
|
|
30
|
-
World(Berkshelf::TestGenerators)
|
|
31
|
-
|
|
32
|
-
Before do
|
|
33
|
-
set_env 'RUBY_ENV', 'test'
|
|
34
|
-
clean_cookbook_store
|
|
35
|
-
generate_berks_config(File.join(ENV['BERKSHELF_PATH'], 'config.json'))
|
|
36
|
-
@aruba_io_wait_seconds = 5
|
|
37
|
-
@aruba_timeout_seconds = 30
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
Before('@slow_process') do
|
|
41
|
-
@aruba_timeout_seconds = 60
|
|
42
|
-
@aruba_io_wait_seconds = 30
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Chef Zero
|
|
46
|
-
require 'chef_zero/server'
|
|
47
|
-
@server = ChefZero::Server.new(port: 4000, generate_real_keys: false)
|
|
48
|
-
@server.start_background
|
|
16
|
+
CHEF_SERVER_PORT = 26310
|
|
17
|
+
BERKS_API_PORT = 26210
|
|
49
18
|
|
|
50
19
|
at_exit do
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def cookbook_store
|
|
55
|
-
Pathname.new(File.join(ENV['BERKSHELF_PATH'], 'cookbooks'))
|
|
20
|
+
Berkshelf::RSpec::ChefServer.stop
|
|
21
|
+
Berkshelf::API::RSpec::Server.stop
|
|
56
22
|
end
|
|
57
23
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
24
|
+
Before do
|
|
25
|
+
# Legacy ENV variables until we can move over to all InProcess
|
|
26
|
+
ENV['BERKSHELF_PATH'] = berkshelf_path.to_s
|
|
27
|
+
ENV['BERKSHELF_CONFIG'] = Berkshelf.config.path.to_s
|
|
28
|
+
ENV['BERKSHELF_CHEF_CONFIG'] = chef_config_path.to_s
|
|
29
|
+
|
|
30
|
+
Aruba::InProcess.main_class = Berkshelf::Cli::Runner
|
|
31
|
+
Aruba.process = Aruba::InProcess
|
|
32
|
+
|
|
33
|
+
stub_kitchen!
|
|
34
|
+
clean_tmp_path
|
|
35
|
+
Berkshelf.initialize_filesystem
|
|
36
|
+
Berkshelf::CookbookStore.instance.initialize_filesystem
|
|
37
|
+
reload_configs
|
|
38
|
+
|
|
39
|
+
endpoints = [
|
|
40
|
+
{
|
|
41
|
+
type: "chef_server",
|
|
42
|
+
options: {
|
|
43
|
+
url: "http://localhost:#{CHEF_SERVER_PORT}",
|
|
44
|
+
client_name: "reset",
|
|
45
|
+
client_key: fixtures_path.join("reset.pem")
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
Berkshelf::RSpec::ChefServer.start(port: CHEF_SERVER_PORT)
|
|
51
|
+
Berkshelf::API::RSpec::Server.start(port: BERKS_API_PORT, endpoints: endpoints)
|
|
52
|
+
|
|
53
|
+
@aruba_io_wait_seconds = Cucumber::JRUBY ? 7 : 5
|
|
54
|
+
@aruba_timeout_seconds = Cucumber::JRUBY ? 35 : 15
|
|
61
55
|
end
|
|
62
56
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
end
|
|
57
|
+
Before('@spawn') do
|
|
58
|
+
Aruba.process = Aruba::SpawnProcess
|
|
66
59
|
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
set_env('BERKSHELF_PATH', berkshelf_path.to_s)
|
|
61
|
+
set_env('BERKSHELF_CONFIG', Berkshelf.config.path.to_s)
|
|
62
|
+
set_env('BERKSHELF_CHEF_CONFIG', chef_config_path.to_s)
|
|
69
63
|
end
|
|
70
64
|
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
Before('@slow_process') do
|
|
66
|
+
@aruba_io_wait_seconds = Cucumber::JRUBY ? 70 : 30
|
|
67
|
+
@aruba_timeout_seconds = Cucumber::JRUBY ? 140 : 60
|
|
73
68
|
end
|
|
74
69
|
end
|
|
75
70
|
|
|
76
71
|
Spork.each_run do
|
|
77
|
-
require 'berkshelf'
|
|
72
|
+
require 'berkshelf/cli'
|
|
78
73
|
end
|
|
@@ -8,7 +8,8 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
8
8
|
| berkshelf-cookbook-fixture | 0.1.0 |
|
|
9
9
|
And I write to "Berksfile" with:
|
|
10
10
|
"""
|
|
11
|
-
|
|
11
|
+
source "http://localhost:26210"
|
|
12
|
+
|
|
12
13
|
cookbook 'berkshelf-cookbook-fixture', '~> 0.1'
|
|
13
14
|
"""
|
|
14
15
|
And I write to "Berksfile.lock" with:
|
|
@@ -16,13 +17,14 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
16
17
|
cookbook 'berkshelf-cookbook-fixture', :locked_version => '0.1.0'
|
|
17
18
|
"""
|
|
18
19
|
When I successfully run `berks update`
|
|
19
|
-
Then the output should
|
|
20
|
+
Then the output should warn about the old lockfile format
|
|
20
21
|
Then the file "Berksfile.lock" should contain JSON:
|
|
21
22
|
"""
|
|
22
23
|
{
|
|
23
|
-
"
|
|
24
|
+
"dependencies":{
|
|
24
25
|
"berkshelf-cookbook-fixture":{
|
|
25
|
-
"locked_version":"0.1.0"
|
|
26
|
+
"locked_version":"0.1.0",
|
|
27
|
+
"constraint":"~> 0.1"
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
}
|
|
@@ -35,19 +37,22 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
35
37
|
| hostsfile | 1.0.1 |
|
|
36
38
|
And I write to "Berksfile" with:
|
|
37
39
|
"""
|
|
38
|
-
|
|
40
|
+
source "http://localhost:26210"
|
|
41
|
+
|
|
39
42
|
cookbook 'berkshelf-cookbook-fixture', '~> 0.1'
|
|
40
43
|
cookbook 'hostsfile', '~> 1.0.0'
|
|
41
44
|
"""
|
|
42
45
|
And I write to "Berksfile.lock" with:
|
|
43
46
|
"""
|
|
44
47
|
{
|
|
45
|
-
"
|
|
48
|
+
"dependencies":{
|
|
46
49
|
"berkshelf-cookbook-fixture":{
|
|
47
|
-
"locked_version":"0.1.0"
|
|
50
|
+
"locked_version":"0.1.0",
|
|
51
|
+
"constraint":"~> 0.1"
|
|
48
52
|
},
|
|
49
53
|
"hostsfile":{
|
|
50
|
-
"locked_version":"1.0.1"
|
|
54
|
+
"locked_version":"1.0.1",
|
|
55
|
+
"constraint":"= 1.0.1"
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
58
|
}
|
|
@@ -56,12 +61,14 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
56
61
|
Then the file "Berksfile.lock" should contain JSON:
|
|
57
62
|
"""
|
|
58
63
|
{
|
|
59
|
-
"
|
|
64
|
+
"dependencies":{
|
|
60
65
|
"berkshelf-cookbook-fixture":{
|
|
61
|
-
"locked_version":"0.2.0"
|
|
66
|
+
"locked_version":"0.2.0",
|
|
67
|
+
"constraint":"~> 0.1"
|
|
62
68
|
},
|
|
63
69
|
"hostsfile":{
|
|
64
|
-
"locked_version":"1.0.1"
|
|
70
|
+
"locked_version":"1.0.1",
|
|
71
|
+
"constraint":"~> 1.0.0"
|
|
65
72
|
}
|
|
66
73
|
}
|
|
67
74
|
}
|
|
@@ -74,19 +81,22 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
74
81
|
| hostsfile | 1.0.1 |
|
|
75
82
|
Given I write to "Berksfile" with:
|
|
76
83
|
"""
|
|
77
|
-
|
|
84
|
+
source "http://localhost:26210"
|
|
85
|
+
|
|
78
86
|
cookbook 'berkshelf-cookbook-fixture', '~> 0.1'
|
|
79
87
|
cookbook 'hostsfile', '~> 1.0.0'
|
|
80
88
|
"""
|
|
81
89
|
And I write to "Berksfile.lock" with:
|
|
82
90
|
"""
|
|
83
91
|
{
|
|
84
|
-
"
|
|
92
|
+
"dependencies":{
|
|
85
93
|
"berkshelf-cookbook-fixture":{
|
|
86
|
-
"locked_version":"0.1.0"
|
|
94
|
+
"locked_version":"0.1.0",
|
|
95
|
+
"constraint":"~> 0.1"
|
|
87
96
|
},
|
|
88
97
|
"hostsfile":{
|
|
89
|
-
"locked_version":"1.0.0"
|
|
98
|
+
"locked_version":"1.0.0",
|
|
99
|
+
"constraint":"~> 1.0.0"
|
|
90
100
|
}
|
|
91
101
|
}
|
|
92
102
|
}
|
|
@@ -95,12 +105,14 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
95
105
|
Then the file "Berksfile.lock" should contain JSON:
|
|
96
106
|
"""
|
|
97
107
|
{
|
|
98
|
-
"
|
|
108
|
+
"dependencies":{
|
|
99
109
|
"berkshelf-cookbook-fixture":{
|
|
100
|
-
"locked_version":"0.2.0"
|
|
110
|
+
"locked_version":"0.2.0",
|
|
111
|
+
"constraint":"~> 0.1"
|
|
101
112
|
},
|
|
102
113
|
"hostsfile":{
|
|
103
|
-
"locked_version":"1.0.0"
|
|
114
|
+
"locked_version":"1.0.0",
|
|
115
|
+
"constraint":"~> 1.0.0"
|
|
104
116
|
}
|
|
105
117
|
}
|
|
106
118
|
}
|
|
@@ -111,15 +123,17 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
111
123
|
| berkshelf-cookbook-fixture | 0.1.0 |
|
|
112
124
|
Given I write to "Berksfile" with:
|
|
113
125
|
"""
|
|
114
|
-
|
|
126
|
+
source "http://localhost:26210"
|
|
127
|
+
|
|
115
128
|
cookbook 'berkshelf-cookbook-fixture', '~> 0.1'
|
|
116
129
|
"""
|
|
117
130
|
Given I write to "Berksfile.lock" with:
|
|
118
131
|
"""
|
|
119
132
|
{
|
|
120
|
-
"
|
|
133
|
+
"dependencies":{
|
|
121
134
|
"berkshelf-cookbook-fixture":{
|
|
122
|
-
"locked_version":"0.1.0"
|
|
135
|
+
"locked_version":"0.1.0",
|
|
136
|
+
"constraint":"~> 0.1"
|
|
123
137
|
}
|
|
124
138
|
}
|
|
125
139
|
}
|
|
@@ -127,6 +141,6 @@ Feature: Updating a cookbook defined by a Berksfile
|
|
|
127
141
|
When I run `berks update non-existent-cookbook`
|
|
128
142
|
Then the output should contain:
|
|
129
143
|
"""
|
|
130
|
-
Could not find
|
|
144
|
+
Could not find cookbook(s) 'non-existent-cookbook' in any of the configured dependencies. Is it in your Berksfile?
|
|
131
145
|
"""
|
|
132
|
-
And the
|
|
146
|
+
And the exit status should be "CookbookNotFound"
|
|
@@ -1,139 +1,146 @@
|
|
|
1
1
|
Feature: Uploading cookbooks to a Chef Server
|
|
2
2
|
As a Berkshelf CLI user
|
|
3
|
-
I need a way to upload cookbooks to a Chef
|
|
3
|
+
I need a way to upload cookbooks to a Chef Server that I have installed into my Bookshelf
|
|
4
4
|
So they are available to Chef clients
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
Background:
|
|
7
|
+
Given the Berkshelf API server's cache is empty
|
|
8
|
+
And the Chef Server is empty
|
|
9
|
+
And the cookbook store is empty
|
|
10
|
+
|
|
11
|
+
Scenario: multiple cookbooks with no arguments
|
|
8
12
|
Given the cookbook store has the cookbooks:
|
|
9
|
-
|
|
|
10
|
-
|
|
|
13
|
+
| ruby | 1.0.0 |
|
|
14
|
+
| elixir | 2.0.0 |
|
|
11
15
|
And I write to "Berksfile" with:
|
|
12
16
|
"""
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
source "http://localhost:26210"
|
|
18
|
+
|
|
19
|
+
cookbook 'ruby', '1.0.0'
|
|
20
|
+
cookbook 'elixir', '2.0.0'
|
|
15
21
|
"""
|
|
16
|
-
And the Chef server does not have the cookbooks:
|
|
17
|
-
| fake | 1.0.0 |
|
|
18
|
-
| ekaf | 2.0.0 |
|
|
19
22
|
When I successfully run `berks upload`
|
|
20
23
|
Then the output should contain:
|
|
21
24
|
"""
|
|
22
|
-
Uploading
|
|
23
|
-
Uploading
|
|
25
|
+
Uploading ruby (1.0.0) to: 'http://localhost:26310/'
|
|
26
|
+
Uploading elixir (2.0.0) to: 'http://localhost:26310/'
|
|
24
27
|
"""
|
|
25
|
-
And the Chef
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
And the exit status should be 0
|
|
28
|
+
And the Chef Server should have the cookbooks:
|
|
29
|
+
| ruby | 1.0.0 |
|
|
30
|
+
| elixir | 2.0.0 |
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Given a cookbook named "fake"
|
|
32
|
+
Scenario: a cookbook with a path location
|
|
33
|
+
Given a cookbook named "ruby"
|
|
33
34
|
And I write to "Berksfile" with:
|
|
34
35
|
"""
|
|
35
|
-
|
|
36
|
+
source "http://localhost:26210"
|
|
37
|
+
|
|
38
|
+
cookbook 'ruby', path: './ruby'
|
|
36
39
|
"""
|
|
37
|
-
And the Chef server does not have the cookbooks:
|
|
38
|
-
| fake | 0.0.0 |
|
|
39
40
|
When I successfully run `berks upload`
|
|
40
41
|
Then the output should contain:
|
|
41
42
|
"""
|
|
42
|
-
Uploading
|
|
43
|
+
Uploading ruby (0.0.0) to: 'http://localhost:26310/'
|
|
43
44
|
"""
|
|
44
|
-
And the Chef
|
|
45
|
-
|
|
|
46
|
-
And the exit status should be 0
|
|
45
|
+
And the Chef Server should have the cookbooks:
|
|
46
|
+
| ruby | 0.0.0 |
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
Scenario: With a git location in the Berksfile
|
|
48
|
+
Scenario: a cookbook with a git location
|
|
50
49
|
Given the cookbook store has the cookbooks:
|
|
51
50
|
| berkshelf-cookbook-fixture | 0.1.0 |
|
|
52
51
|
And I write to "Berksfile" with:
|
|
53
52
|
"""
|
|
53
|
+
source "http://localhost:26210"
|
|
54
|
+
|
|
54
55
|
cookbook 'berkshelf-cookbook-fixture', ref: 'v0.1.0'
|
|
55
56
|
"""
|
|
56
|
-
And the Chef server does not have the cookbooks:
|
|
57
|
-
| berkshelf-cookbook-fixture | 0.1.0 |
|
|
58
57
|
When I successfully run `berks upload`
|
|
59
58
|
Then the output should contain:
|
|
60
59
|
"""
|
|
61
|
-
Uploading berkshelf-cookbook-fixture (0.1.0) to: 'http://localhost:
|
|
60
|
+
Uploading berkshelf-cookbook-fixture (0.1.0) to: 'http://localhost:26310/'
|
|
62
61
|
"""
|
|
63
|
-
And the Chef
|
|
62
|
+
And the Chef Server should have the cookbooks:
|
|
64
63
|
| berkshelf-cookbook-fixture | 0.1.0 |
|
|
65
|
-
And the exit status should be 0
|
|
66
64
|
|
|
67
|
-
|
|
68
|
-
Scenario: With a single cookbook
|
|
65
|
+
Scenario: specifying a single cookbook with dependencies
|
|
69
66
|
Given the cookbook store has the cookbooks:
|
|
70
67
|
| fake | 1.0.0 |
|
|
71
68
|
| ekaf | 2.0.0 |
|
|
72
69
|
And the cookbook store contains a cookbook "reset" "3.4.5" with dependencies:
|
|
73
|
-
| fake |
|
|
70
|
+
| fake | = 1.0.0 |
|
|
74
71
|
And I write to "Berksfile" with:
|
|
75
72
|
"""
|
|
73
|
+
source "http://localhost:26210"
|
|
74
|
+
|
|
76
75
|
cookbook 'fake', '1.0.0'
|
|
77
76
|
cookbook 'ekaf', '2.0.0'
|
|
78
77
|
cookbook 'reset', '3.4.5'
|
|
79
78
|
"""
|
|
80
|
-
And the Chef server does not have the cookbooks:
|
|
81
|
-
| fake | 1.0.0 |
|
|
82
|
-
| ekaf | 2.0.0 |
|
|
83
|
-
| reset | 3.4.5 |
|
|
84
79
|
When I successfully run `berks upload reset`
|
|
85
80
|
Then the output should contain:
|
|
86
81
|
"""
|
|
87
|
-
Uploading reset (3.4.5) to: 'http://localhost:
|
|
88
|
-
Uploading fake (1.0.0) to: 'http://localhost:
|
|
82
|
+
Uploading reset (3.4.5) to: 'http://localhost:26310/'
|
|
83
|
+
Uploading fake (1.0.0) to: 'http://localhost:26310/'
|
|
84
|
+
"""
|
|
85
|
+
And the output should not contain:
|
|
86
|
+
"""
|
|
87
|
+
Uploading ekaf (2.0.0) to: 'http://localhost:26310/'
|
|
89
88
|
"""
|
|
90
|
-
And the Chef
|
|
89
|
+
And the Chef Server should have the cookbooks:
|
|
91
90
|
| reset | 3.4.5 |
|
|
92
91
|
| fake | 1.0.0 |
|
|
93
|
-
And the Chef
|
|
92
|
+
And the Chef Server should not have the cookbooks:
|
|
94
93
|
| ekaf | 2.0.0 |
|
|
95
|
-
And the exit status should be 0
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
Scenario: specifying a dependency not defined in the Berksfile
|
|
96
|
+
Given I write to "Berksfile" with:
|
|
97
|
+
"""
|
|
98
|
+
source "http://localhost:26210"
|
|
99
|
+
"""
|
|
100
|
+
When I run `berks upload reset`
|
|
101
|
+
Then the output should contain:
|
|
102
|
+
"""
|
|
103
|
+
Failed to upload cookbook 'reset'. Not defined in Berksfile.
|
|
104
|
+
"""
|
|
105
|
+
And the exit status should be "DependencyNotFound"
|
|
106
|
+
|
|
107
|
+
Scenario: specifying multiple cookbooks to upload
|
|
99
108
|
Given the cookbook store has the cookbooks:
|
|
100
109
|
| ntp | 1.0.0 |
|
|
101
110
|
| vim | 1.0.0 |
|
|
102
111
|
| apt | 1.0.0 |
|
|
103
112
|
Given I write to "Berksfile" with:
|
|
104
113
|
"""
|
|
114
|
+
source "http://localhost:26210"
|
|
115
|
+
|
|
116
|
+
cookbook 'apt', '1.0.0'
|
|
105
117
|
cookbook 'ntp', '1.0.0'
|
|
106
118
|
cookbook 'vim', '1.0.0'
|
|
107
|
-
cookbook 'apt', '1.0.0'
|
|
108
119
|
"""
|
|
109
|
-
And the Chef server does not have the cookbooks:
|
|
110
|
-
| ntp |
|
|
111
|
-
| vim |
|
|
112
|
-
| apt |
|
|
113
120
|
When I successfully run `berks upload ntp vim`
|
|
114
121
|
Then the output should contain:
|
|
115
122
|
"""
|
|
116
|
-
Uploading ntp (1.0.0) to: 'http://localhost:
|
|
117
|
-
Uploading vim (1.0.0) to: 'http://localhost:
|
|
123
|
+
Uploading ntp (1.0.0) to: 'http://localhost:26310/'
|
|
124
|
+
Uploading vim (1.0.0) to: 'http://localhost:26310/'
|
|
118
125
|
"""
|
|
119
126
|
And the output should not contain:
|
|
120
127
|
"""
|
|
121
|
-
Uploading apt (1.0.0) to: 'http://localhost:
|
|
128
|
+
Uploading apt (1.0.0) to: 'http://localhost:26310/'
|
|
122
129
|
"""
|
|
123
|
-
And the Chef
|
|
130
|
+
And the Chef Server should have the cookbooks:
|
|
124
131
|
| ntp |
|
|
125
132
|
| vim |
|
|
126
|
-
And the Chef
|
|
133
|
+
And the Chef Server should not have the cookbooks:
|
|
127
134
|
| apt |
|
|
128
|
-
And the exit status should be 0
|
|
129
135
|
|
|
130
|
-
|
|
131
|
-
Scenario: With the --only flag
|
|
136
|
+
Scenario: uploading a single groups of demands with the --only flag
|
|
132
137
|
Given the cookbook store has the cookbooks:
|
|
133
138
|
| core | 1.0.0 |
|
|
134
139
|
| system | 1.0.0 |
|
|
135
140
|
Given I write to "Berksfile" with:
|
|
136
141
|
"""
|
|
142
|
+
source "http://localhost:26210"
|
|
143
|
+
|
|
137
144
|
group :group_a do
|
|
138
145
|
cookbook 'core', '1.0.0'
|
|
139
146
|
end
|
|
@@ -142,31 +149,28 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
142
149
|
cookbook 'system', '1.0.0'
|
|
143
150
|
end
|
|
144
151
|
"""
|
|
145
|
-
And the Chef server does not have the cookbooks:
|
|
146
|
-
| core | 1.0.0 |
|
|
147
|
-
| system | 1.0.0 |
|
|
148
152
|
When I successfully run `berks upload --only group_a`
|
|
149
153
|
Then the output should contain:
|
|
150
154
|
"""
|
|
151
|
-
Uploading core (1.0.0) to: 'http://localhost:
|
|
155
|
+
Uploading core (1.0.0) to: 'http://localhost:26310/'
|
|
152
156
|
"""
|
|
153
157
|
And the output should not contain:
|
|
154
158
|
"""
|
|
155
|
-
Uploading system (1.0.0) to: 'http://localhost:
|
|
159
|
+
Uploading system (1.0.0) to: 'http://localhost:26310/'
|
|
156
160
|
"""
|
|
157
|
-
And the Chef
|
|
161
|
+
And the Chef Server should have the cookbooks:
|
|
158
162
|
| core | 1.0.0 |
|
|
159
|
-
And the Chef
|
|
163
|
+
And the Chef Server should not have the cookbooks:
|
|
160
164
|
| system | 1.0.0 |
|
|
161
|
-
And the exit status should be 0
|
|
162
165
|
|
|
163
|
-
|
|
164
|
-
Scenario: With the --only flag specifying multiple groups
|
|
166
|
+
Scenario: uploading multiple groups of demands with the --only flag
|
|
165
167
|
Given the cookbook store has the cookbooks:
|
|
166
168
|
| core | 1.0.0 |
|
|
167
169
|
| system | 1.0.0 |
|
|
168
170
|
Given I write to "Berksfile" with:
|
|
169
171
|
"""
|
|
172
|
+
source "http://localhost:26210"
|
|
173
|
+
|
|
170
174
|
group :group_a do
|
|
171
175
|
cookbook 'core', '1.0.0'
|
|
172
176
|
end
|
|
@@ -175,27 +179,24 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
175
179
|
cookbook 'system', '1.0.0'
|
|
176
180
|
end
|
|
177
181
|
"""
|
|
178
|
-
And the Chef server does not have the cookbooks:
|
|
179
|
-
| core | 1.0.0 |
|
|
180
|
-
| system | 1.0.0 |
|
|
181
182
|
When I successfully run `berks upload --only group_a group_b`
|
|
182
183
|
Then the output should contain:
|
|
183
184
|
"""
|
|
184
|
-
Uploading core (1.0.0) to: 'http://localhost:
|
|
185
|
-
Uploading system (1.0.0) to: 'http://localhost:
|
|
185
|
+
Uploading core (1.0.0) to: 'http://localhost:26310/'
|
|
186
|
+
Uploading system (1.0.0) to: 'http://localhost:26310/'
|
|
186
187
|
"""
|
|
187
|
-
And the Chef
|
|
188
|
+
And the Chef Server should have the cookbooks:
|
|
188
189
|
| core | 1.0.0 |
|
|
189
190
|
| system | 1.0.0 |
|
|
190
|
-
And the exit status should be 0
|
|
191
191
|
|
|
192
|
-
|
|
193
|
-
Scenario: With the --except flag
|
|
192
|
+
Scenario: skipping a single group to upload with the --except flag
|
|
194
193
|
Given the cookbook store has the cookbooks:
|
|
195
194
|
| core | 1.0.0 |
|
|
196
195
|
| system | 1.0.0 |
|
|
197
196
|
Given I write to "Berksfile" with:
|
|
198
197
|
"""
|
|
198
|
+
source "http://localhost:26210"
|
|
199
|
+
|
|
199
200
|
group :group_a do
|
|
200
201
|
cookbook 'core', '1.0.0'
|
|
201
202
|
end
|
|
@@ -204,31 +205,28 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
204
205
|
cookbook 'system', '1.0.0'
|
|
205
206
|
end
|
|
206
207
|
"""
|
|
207
|
-
And the Chef server does not have the cookbooks:
|
|
208
|
-
| core | 1.0.0 |
|
|
209
|
-
| system | 1.0.0 |
|
|
210
208
|
When I successfully run `berks upload --except group_b`
|
|
211
209
|
Then the output should contain:
|
|
212
210
|
"""
|
|
213
|
-
Uploading core (1.0.0) to: 'http://localhost:
|
|
211
|
+
Uploading core (1.0.0) to: 'http://localhost:26310/'
|
|
214
212
|
"""
|
|
215
213
|
And the output should not contain:
|
|
216
214
|
"""
|
|
217
|
-
Uploading system (1.0.0) to: 'http://localhost:
|
|
215
|
+
Uploading system (1.0.0) to: 'http://localhost:26310/'
|
|
218
216
|
"""
|
|
219
|
-
And the Chef
|
|
217
|
+
And the Chef Server should have the cookbooks:
|
|
220
218
|
| core | 1.0.0 |
|
|
221
|
-
And the Chef
|
|
219
|
+
And the Chef Server should not have the cookbooks:
|
|
222
220
|
| system | 1.0.0 |
|
|
223
|
-
And the exit status should be 0
|
|
224
221
|
|
|
225
|
-
|
|
226
|
-
Scenario: With the --except flag specifying multiple groups
|
|
222
|
+
Scenario: skipping multiple groups with the --except flag
|
|
227
223
|
Given the cookbook store has the cookbooks:
|
|
228
224
|
| core | 1.0.0 |
|
|
229
225
|
| system | 1.0.0 |
|
|
230
226
|
Given I write to "Berksfile" with:
|
|
231
227
|
"""
|
|
228
|
+
source "http://localhost:26210"
|
|
229
|
+
|
|
232
230
|
group :group_a do
|
|
233
231
|
cookbook 'core', '1.0.0'
|
|
234
232
|
end
|
|
@@ -237,24 +235,22 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
237
235
|
cookbook 'system', '1.0.0'
|
|
238
236
|
end
|
|
239
237
|
"""
|
|
240
|
-
And the Chef server does not have the cookbooks:
|
|
241
|
-
| core | 1.0.0 |
|
|
242
|
-
| system | 1.0.0 |
|
|
243
238
|
When I successfully run `berks upload --except group_a group_b`
|
|
244
239
|
Then the output should not contain:
|
|
245
240
|
"""
|
|
246
|
-
Uploading core (1.0.0) to: 'http://localhost:
|
|
247
|
-
Uploading system (1.0.0) to: 'http://localhost:
|
|
241
|
+
Uploading core (1.0.0) to: 'http://localhost:26310/'
|
|
242
|
+
Uploading system (1.0.0) to: 'http://localhost:26310/'
|
|
248
243
|
"""
|
|
249
|
-
And the Chef
|
|
244
|
+
And the Chef Server should not have the cookbooks:
|
|
250
245
|
| core | 1.0.0 |
|
|
251
246
|
| system | 1.0.0 |
|
|
252
|
-
And the exit status should be 0
|
|
253
247
|
|
|
254
|
-
Scenario:
|
|
248
|
+
Scenario: attempting to upload an invalid cookbook
|
|
255
249
|
Given a cookbook named "cookbook with spaces"
|
|
256
250
|
And I write to "Berksfile" with:
|
|
257
251
|
"""
|
|
252
|
+
source "http://localhost:26210"
|
|
253
|
+
|
|
258
254
|
cookbook 'cookbook with spaces', path: './cookbook with spaces'
|
|
259
255
|
"""
|
|
260
256
|
When I run `berks upload`
|
|
@@ -262,39 +258,8 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
262
258
|
"""
|
|
263
259
|
The cookbook 'cookbook with spaces' has invalid filenames:
|
|
264
260
|
"""
|
|
265
|
-
And the
|
|
261
|
+
And the exit status should be "InvalidCookbookFiles"
|
|
266
262
|
|
|
267
|
-
@chef_server @slow_process
|
|
268
|
-
Scenario: With the --skip-dependencies flag
|
|
269
|
-
Given the cookbook store has the cookbooks:
|
|
270
|
-
| fake | 1.0.0 |
|
|
271
|
-
| ekaf | 2.0.0 |
|
|
272
|
-
And the cookbook store contains a cookbook "reset" "3.4.5" with dependencies:
|
|
273
|
-
| fake | ~> 1.0.0 |
|
|
274
|
-
And I write to "Berksfile" with:
|
|
275
|
-
"""
|
|
276
|
-
cookbook 'fake', '1.0.0'
|
|
277
|
-
cookbook 'ekaf', '2.0.0'
|
|
278
|
-
cookbook 'reset', '3.4.5'
|
|
279
|
-
"""
|
|
280
|
-
And the Chef server does not have the cookbooks:
|
|
281
|
-
| fake | 1.0.0 |
|
|
282
|
-
| ekaf | 2.0.0 |
|
|
283
|
-
| reset | 3.4.5 |
|
|
284
|
-
When I successfully run `berks upload reset -D`
|
|
285
|
-
Then the output should contain:
|
|
286
|
-
"""
|
|
287
|
-
Uploading reset (3.4.5) to: 'http://localhost:4000/'
|
|
288
|
-
Uploading fake (1.0.0) to: 'http://localhost:4000/'
|
|
289
|
-
"""
|
|
290
|
-
And the Chef server should have the cookbooks:
|
|
291
|
-
| reset | 3.4.5 |
|
|
292
|
-
| fake | 1.0.0 |
|
|
293
|
-
And the Chef server should not have the cookbooks:
|
|
294
|
-
| ekaf | 2.0.0 |
|
|
295
|
-
And the exit status should be 0
|
|
296
|
-
|
|
297
|
-
@focus
|
|
298
263
|
Scenario: With unicode characters
|
|
299
264
|
Given a cookbook named "fake"
|
|
300
265
|
And the cookbook "fake" has the file "README.md" with:
|
|
@@ -306,7 +271,8 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
306
271
|
"""
|
|
307
272
|
And the cookbook "fake" has the file "Berksfile" with:
|
|
308
273
|
"""
|
|
309
|
-
|
|
274
|
+
source "http://localhost:26210"
|
|
275
|
+
|
|
310
276
|
metadata
|
|
311
277
|
"""
|
|
312
278
|
When I cd to "fake"
|
|
@@ -315,33 +281,3 @@ Feature: Uploading cookbooks to a Chef Server
|
|
|
315
281
|
"""
|
|
316
282
|
Uploading fake (0.0.0)
|
|
317
283
|
"""
|
|
318
|
-
And the exit status should be 0
|
|
319
|
-
Scenario: When the syntax check is skipped
|
|
320
|
-
Given a cookbook named "fake"
|
|
321
|
-
And the cookbook "fake" has the file "recipes/default.rb" with:
|
|
322
|
-
"""
|
|
323
|
-
Totally not valid Ruby syntax
|
|
324
|
-
"""
|
|
325
|
-
And the cookbook "fake" has the file "templates/default/file.erb" with:
|
|
326
|
-
"""
|
|
327
|
-
<% for %>
|
|
328
|
-
"""
|
|
329
|
-
And the cookbook "fake" has the file "recipes/template.rb" with:
|
|
330
|
-
"""
|
|
331
|
-
template "/tmp/wadus" do
|
|
332
|
-
source "file.erb"
|
|
333
|
-
end
|
|
334
|
-
"""
|
|
335
|
-
And the cookbook "fake" has the file "Berksfile" with:
|
|
336
|
-
"""
|
|
337
|
-
site :opscode
|
|
338
|
-
|
|
339
|
-
metadata
|
|
340
|
-
"""
|
|
341
|
-
And I cd to "fake"
|
|
342
|
-
When I successfully run `berks upload --skip-syntax-check`
|
|
343
|
-
Then the output should contain:
|
|
344
|
-
"""
|
|
345
|
-
Using fake (0.0.0) from metadata
|
|
346
|
-
Uploading fake (0.0.0) to: 'http://localhost:4000/'
|
|
347
|
-
"""
|