berkshelf 2.0.18 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
"""
|