chef 12.0.0.alpha.0 → 12.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +3 -5
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/application.rb +16 -8
- data/lib/chef/chef_fs/chef_fs_data_store.rb +1 -1
- data/lib/chef/chef_fs/command_line.rb +1 -1
- data/lib/chef/chef_fs/file_system.rb +1 -1
- data/lib/chef/chef_fs/file_system/acl_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +3 -3
- data/lib/chef/chef_fs/file_system/cookbook_file.rb +2 -2
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +4 -4
- data/lib/chef/config.rb +6 -5
- data/lib/chef/config_fetcher.rb +1 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +126 -43
- data/lib/chef/cookbook/metadata.rb +102 -53
- data/lib/chef/cookbook/syntax_check.rb +1 -1
- data/lib/chef/cookbook_loader.rb +62 -14
- data/lib/chef/cookbook_site_streaming_uploader.rb +12 -1
- data/lib/chef/cookbook_version.rb +13 -4
- data/lib/chef/data_bag.rb +28 -15
- data/lib/chef/data_bag_item.rb +5 -7
- data/lib/chef/digester.rb +5 -9
- data/lib/chef/dsl/recipe.rb +14 -0
- data/lib/chef/encrypted_data_bag_item.rb +1 -0
- data/lib/chef/encrypted_data_bag_item/assertions.rb +57 -0
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +52 -28
- data/lib/chef/encrypted_data_bag_item/encrypted_data_bag_item_assertions.rb +37 -0
- data/lib/chef/encrypted_data_bag_item/encryption_failure.rb +22 -0
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +79 -8
- data/lib/chef/environment.rb +1 -3
- data/lib/chef/exceptions.rb +18 -3
- data/lib/chef/formatters/base.rb +7 -0
- data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +1 -1
- data/lib/chef/handler/json_file.rb +0 -1
- data/lib/chef/http/json_output.rb +1 -1
- data/lib/chef/json_compat.rb +24 -6
- data/lib/chef/knife/bootstrap.rb +2 -2
- data/lib/chef/knife/client_delete.rb +1 -1
- data/lib/chef/knife/cookbook_site_download.rb +1 -1
- data/lib/chef/knife/cookbook_site_list.rb +1 -1
- data/lib/chef/knife/cookbook_site_search.rb +1 -1
- data/lib/chef/knife/cookbook_site_share.rb +2 -2
- data/lib/chef/knife/cookbook_site_show.rb +3 -3
- data/lib/chef/knife/cookbook_site_unshare.rb +1 -1
- data/lib/chef/knife/core/node_editor.rb +2 -3
- data/lib/chef/knife/core/ui.rb +2 -2
- data/lib/chef/knife/deps.rb +2 -3
- data/lib/chef/mixin/shell_out.rb +1 -1
- data/lib/chef/mixin/windows_architecture_helper.rb +1 -0
- data/lib/chef/node.rb +1 -2
- data/lib/chef/platform/provider_mapping.rb +33 -6
- data/lib/chef/provider.rb +0 -2
- data/lib/chef/provider/cookbook_file/content.rb +1 -1
- data/lib/chef/provider/cron.rb +11 -0
- data/lib/chef/provider/deploy.rb +3 -2
- data/lib/chef/provider/deploy/revision.rb +2 -2
- data/lib/chef/provider/env.rb +1 -1
- data/lib/chef/provider/env/windows.rb +5 -9
- data/lib/chef/provider/file.rb +84 -33
- data/lib/chef/provider/git.rb +2 -1
- data/lib/chef/provider/group/aix.rb +17 -2
- data/lib/chef/provider/group/dscl.rb +27 -9
- data/lib/chef/provider/group/pw.rb +8 -1
- data/lib/chef/provider/http_request.rb +4 -4
- data/lib/chef/provider/log.rb +4 -14
- data/lib/chef/provider/mount/mount.rb +2 -2
- data/lib/chef/provider/package/ips.rb +17 -23
- data/lib/chef/provider/package/paludis.rb +2 -2
- data/lib/chef/provider/package/rpm.rb +2 -2
- data/lib/chef/provider/package/rubygems.rb +2 -0
- data/lib/chef/provider/package/yum.rb +2 -0
- data/lib/chef/provider/package/zypper.rb +1 -1
- data/lib/chef/provider/remote_file/cache_control_data.rb +2 -2
- data/lib/chef/provider/service/windows.rb +87 -21
- data/lib/chef/provider/user/aix.rb +95 -0
- data/lib/chef/provider/user/dscl.rb +544 -156
- data/lib/chef/provider/user/useradd.rb +1 -0
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/resource.rb +4 -3
- data/lib/chef/resource/freebsd_package.rb +10 -2
- data/lib/chef/resource/paludis_package.rb +1 -0
- data/lib/chef/resource/scm.rb +10 -0
- data/lib/chef/resource/user.rb +27 -0
- data/lib/chef/resource/windows_service.rb +53 -0
- data/lib/chef/resource_collection.rb +23 -12
- data/lib/chef/resource_reporter.rb +10 -10
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/role.rb +3 -3
- data/lib/chef/run_list.rb +6 -3
- data/lib/chef/user.rb +1 -1
- data/lib/chef/util/diff.rb +1 -2
- data/lib/chef/version.rb +1 -1
- data/lib/chef/version_constraint.rb +4 -4
- data/spec/data/cookbooks/angrybash/metadata.rb +2 -0
- data/spec/data/cookbooks/apache2/metadata.rb +2 -0
- data/spec/data/cookbooks/borken/metadata.rb +2 -0
- data/spec/data/cookbooks/ignorken/metadata.rb +2 -0
- data/spec/data/cookbooks/java/metadata.rb +2 -0
- data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -0
- data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -0
- data/spec/data/cookbooks/name-mismatch-versionnumber/recipes/default.rb +8 -0
- data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -0
- data/spec/data/cookbooks/preseed/metadata.rb +2 -0
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -0
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -0
- data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/recipes/default.rb +8 -0
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -0
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/metadata.rb +10 -0
- data/spec/data/invalid-metadata-chef-repo/invalid-metadata/recipes/default.rb +8 -0
- data/spec/data/mac_users/10.7-8.plist.xml +559 -0
- data/spec/data/mac_users/10.7-8.shadow.xml +11 -0
- data/spec/data/mac_users/10.7.plist.xml +559 -0
- data/spec/data/mac_users/10.7.shadow.xml +11 -0
- data/spec/data/mac_users/10.8.plist.xml +559 -0
- data/spec/data/mac_users/10.8.shadow.xml +21 -0
- data/spec/data/mac_users/10.9.plist.xml +560 -0
- data/spec/data/mac_users/10.9.shadow.xml +21 -0
- data/spec/data/object_loader/environments/test.json +2 -0
- data/spec/data/object_loader/environments/test_json_class.json +2 -0
- data/spec/data/object_loader/nodes/test.json +2 -0
- data/spec/data/object_loader/nodes/test_json_class.json +2 -0
- data/spec/data/object_loader/roles/test.json +2 -0
- data/spec/data/object_loader/roles/test_json_class.json +2 -0
- data/spec/functional/resource/bff_spec.rb +1 -1
- data/spec/functional/resource/cron_spec.rb +20 -1
- data/spec/functional/resource/env_spec.rb +137 -0
- data/spec/functional/resource/group_spec.rb +7 -5
- data/spec/functional/resource/remote_file_spec.rb +12 -1
- data/spec/functional/resource/user/dscl_spec.rb +198 -0
- data/spec/functional/resource/{user_spec.rb → user/useradd_spec.rb} +175 -37
- data/spec/integration/client/client_spec.rb +6 -4
- data/spec/integration/client/ipv6_spec.rb +16 -14
- data/spec/integration/knife/chef_fs_data_store_spec.rb +57 -46
- data/spec/integration/knife/chef_repo_path_spec.rb +105 -78
- data/spec/integration/knife/chef_repository_file_system_spec.rb +100 -84
- data/spec/integration/knife/chefignore_spec.rb +76 -46
- data/spec/integration/knife/common_options_spec.rb +16 -21
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +3 -3
- data/spec/integration/knife/delete_spec.rb +66 -46
- data/spec/integration/knife/deps_spec.rb +145 -94
- data/spec/integration/knife/diff_spec.rb +176 -110
- data/spec/integration/knife/download_spec.rb +229 -133
- data/spec/integration/knife/list_spec.rb +62 -54
- data/spec/integration/knife/raw_spec.rb +24 -9
- data/spec/integration/knife/redirection_spec.rb +2 -2
- data/spec/integration/knife/serve_spec.rb +2 -2
- data/spec/integration/knife/show_spec.rb +32 -26
- data/spec/integration/knife/upload_spec.rb +308 -165
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +10 -8
- data/spec/integration/solo/solo_spec.rb +22 -11
- data/spec/spec_helper.rb +3 -0
- data/spec/support/lib/chef/resource/zen_follower.rb +46 -0
- data/spec/support/platform_helpers.rb +12 -0
- data/spec/support/shared/functional/file_resource.rb +10 -0
- data/spec/support/shared/integration/chef_zero_support.rb +130 -0
- data/spec/support/shared/integration/integration_helper.rb +100 -98
- data/spec/support/shared/integration/knife_support.rb +0 -1
- data/spec/support/shared/unit/provider/file.rb +6 -4
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +10 -1
- data/spec/unit/api_client/registration_spec.rb +83 -74
- data/spec/unit/application_spec.rb +32 -9
- data/spec/unit/cookbook/cookbook_version_loader_spec.rb +179 -0
- data/spec/unit/cookbook/metadata_spec.rb +190 -150
- data/spec/unit/cookbook/syntax_check_spec.rb +3 -2
- data/spec/unit/cookbook_loader_spec.rb +114 -53
- data/spec/unit/{cookbook_site_streaming_uploader.rb → cookbook_site_streaming_uploader_spec.rb} +21 -1
- data/spec/unit/data_bag_spec.rb +88 -13
- data/spec/unit/deprecation_spec.rb +1 -2
- data/spec/unit/encrypted_data_bag_item_spec.rb +145 -9
- data/spec/unit/environment_spec.rb +1 -1
- data/spec/unit/formatters/base_spec.rb +48 -0
- data/spec/unit/json_compat_spec.rb +48 -17
- data/spec/unit/knife/client_delete_spec.rb +4 -4
- data/spec/unit/knife/client_show_spec.rb +15 -5
- data/spec/unit/knife/cookbook_site_download_spec.rb +1 -1
- data/spec/unit/knife/cookbook_site_share_spec.rb +3 -3
- data/spec/unit/knife/data_bag_from_file_spec.rb +0 -2
- data/spec/unit/knife/data_bag_show_spec.rb +23 -14
- data/spec/unit/knife/node_show_spec.rb +32 -15
- data/spec/unit/knife/role_show_spec.rb +59 -0
- data/spec/unit/platform_spec.rb +10 -0
- data/spec/unit/provider/deploy_spec.rb +4 -0
- data/spec/unit/provider/env_spec.rb +19 -0
- data/spec/unit/provider/git_spec.rb +22 -2
- data/spec/unit/provider/group/dscl_spec.rb +38 -1
- data/spec/unit/provider/group/pw_spec.rb +2 -2
- data/spec/unit/provider/http_request_spec.rb +8 -8
- data/spec/unit/provider/log_spec.rb +33 -53
- data/spec/unit/provider/mount/mount_spec.rb +12 -3
- data/spec/unit/provider/package/ips_spec.rb +96 -63
- data/spec/unit/provider/package/paludis_spec.rb +5 -5
- data/spec/unit/provider/package/rpm_spec.rb +12 -0
- data/spec/unit/provider/package/zypper_spec.rb +28 -16
- data/spec/unit/provider/service/windows_spec.rb +77 -17
- data/spec/unit/provider/user/dscl_spec.rb +659 -264
- data/spec/unit/provider/user/useradd_spec.rb +1 -0
- data/spec/unit/recipe_spec.rb +41 -0
- data/spec/unit/resource/scm_spec.rb +11 -0
- data/spec/unit/resource/user_spec.rb +4 -0
- data/spec/unit/resource/windows_service_spec.rb +46 -0
- data/spec/unit/resource_collection_spec.rb +33 -0
- data/spec/unit/resource_reporter_spec.rb +48 -0
- data/spec/unit/resource_spec.rb +9 -2
- data/spec/unit/role_spec.rb +6 -0
- data/spec/unit/version_constraint_spec.rb +28 -0
- metadata +61 -4
@@ -19,18 +19,11 @@ require 'support/shared/integration/integration_helper'
|
|
19
19
|
require 'chef/knife/raw'
|
20
20
|
|
21
21
|
describe 'knife common options' do
|
22
|
-
|
22
|
+
include IntegrationSupport
|
23
23
|
include KnifeSupport
|
24
24
|
|
25
25
|
when_the_repository "has a node" do
|
26
|
-
file 'nodes/x.json', {}
|
27
|
-
|
28
|
-
before(:each) do
|
29
|
-
if ChefZero::RSpec.server
|
30
|
-
ChefZero::RSpec.server.stop
|
31
|
-
ChefZero::RSpec.server = nil
|
32
|
-
end
|
33
|
-
end
|
26
|
+
before { file 'nodes/x.json', {} }
|
34
27
|
|
35
28
|
context 'When chef_zero.enabled is true' do
|
36
29
|
before(:each) do
|
@@ -38,14 +31,14 @@ describe 'knife common options' do
|
|
38
31
|
end
|
39
32
|
|
40
33
|
it 'knife raw /nodes/x should retrieve the node' do
|
41
|
-
knife('raw /nodes/x').should_succeed /"name": "x"/
|
34
|
+
knife('raw /nodes/x').should_succeed( /"name": "x"/ )
|
42
35
|
end
|
43
36
|
|
44
37
|
context 'And chef_zero.port is 9999' do
|
45
38
|
before(:each) { Chef::Config.chef_zero.port = 9999 }
|
46
39
|
|
47
40
|
it 'knife raw /nodes/x should retrieve the node' do
|
48
|
-
knife('raw /nodes/x').should_succeed /"name": "x"/
|
41
|
+
knife('raw /nodes/x').should_succeed( /"name": "x"/ )
|
49
42
|
Chef::Config.chef_server_url.should == 'http://localhost:9999'
|
50
43
|
end
|
51
44
|
end
|
@@ -55,12 +48,13 @@ describe 'knife common options' do
|
|
55
48
|
before(:each) { Chef::Config.chef_zero.host = '0.0.0.0' }
|
56
49
|
|
57
50
|
it 'knife raw /nodes/x should retrieve the role' do
|
58
|
-
knife('raw /nodes/x').should_succeed /"name": "x"/
|
51
|
+
knife('raw /nodes/x').should_succeed( /"name": "x"/ )
|
59
52
|
end
|
60
53
|
end
|
61
54
|
|
62
55
|
context 'and there is a private key' do
|
63
|
-
|
56
|
+
before do
|
57
|
+
file 'mykey.pem', <<EOM
|
64
58
|
-----BEGIN RSA PRIVATE KEY-----
|
65
59
|
MIIEogIBAAKCAQEApubutqtYYQ5UiA9QhWP7UvSmsfHsAoPKEVVPdVW/e8Svwpyf
|
66
60
|
0Xef6OFWVmBE+W442ZjLOe2y6p2nSnaq4y7dg99NFz6X+16mcKiCbj0RCiGqCvCk
|
@@ -89,23 +83,24 @@ syHLXYFNy0OxMtH/bBAXBGNHd9gf5uOnqh0pYcbe/uRAxumC7Rl0cL509eURiA2T
|
|
89
83
|
+vFmf54y9YdnLXaqv+FhJT6B6V7WX7IpU9BMqJY1cJYXHuHG2KA=
|
90
84
|
-----END RSA PRIVATE KEY-----
|
91
85
|
EOM
|
86
|
+
end
|
92
87
|
|
93
88
|
it 'knife raw /nodes/x should retrieve the node' do
|
94
|
-
knife('raw /nodes/x').should_succeed /"name": "x"/
|
89
|
+
knife('raw /nodes/x').should_succeed( /"name": "x"/ )
|
95
90
|
end
|
96
91
|
end
|
97
92
|
end
|
98
93
|
|
99
94
|
it 'knife raw -z /nodes/x retrieves the node' do
|
100
|
-
knife('raw -z /nodes/x').should_succeed /"name": "x"/
|
95
|
+
knife('raw -z /nodes/x').should_succeed( /"name": "x"/ )
|
101
96
|
end
|
102
97
|
|
103
98
|
it 'knife raw --local-mode /nodes/x retrieves the node' do
|
104
|
-
knife('raw --local-mode /nodes/x').should_succeed /"name": "x"/
|
99
|
+
knife('raw --local-mode /nodes/x').should_succeed( /"name": "x"/ )
|
105
100
|
end
|
106
101
|
|
107
102
|
it 'knife raw -z --chef-zero-port=9999 /nodes/x retrieves the node' do
|
108
|
-
knife('raw -z --chef-zero-port=9999 /nodes/x').should_succeed /"name": "x"/
|
103
|
+
knife('raw -z --chef-zero-port=9999 /nodes/x').should_succeed( /"name": "x"/ )
|
109
104
|
Chef::Config.chef_server_url.should == 'http://localhost:9999'
|
110
105
|
end
|
111
106
|
|
@@ -123,7 +118,7 @@ EOM
|
|
123
118
|
end
|
124
119
|
|
125
120
|
it 'knife raw -z /nodes/x retrieves the node' do
|
126
|
-
knife('raw -z /nodes/x').should_succeed /"name": "x"/
|
121
|
+
knife('raw -z /nodes/x').should_succeed( /"name": "x"/ )
|
127
122
|
expect(URI(Chef::Config.chef_server_url).port).to be > 8889
|
128
123
|
end
|
129
124
|
end
|
@@ -142,18 +137,18 @@ EOM
|
|
142
137
|
end
|
143
138
|
|
144
139
|
it 'knife raw -z --chef-zero-port=9999-20000 /nodes/x' do
|
145
|
-
knife('raw -z --chef-zero-port=9999-20000 /nodes/x').should_succeed /"name": "x"/
|
140
|
+
knife('raw -z --chef-zero-port=9999-20000 /nodes/x').should_succeed( /"name": "x"/ )
|
146
141
|
expect(URI(Chef::Config.chef_server_url).port).to be > 9999
|
147
142
|
end
|
148
143
|
|
149
144
|
it 'knife raw -z --chef-zero-port=9999-9999,19423' do
|
150
|
-
knife('raw -z --chef-zero-port=9999-9999,19423 /nodes/x').should_succeed /"name": "x"/
|
145
|
+
knife('raw -z --chef-zero-port=9999-9999,19423 /nodes/x').should_succeed( /"name": "x"/ )
|
151
146
|
expect(URI(Chef::Config.chef_server_url).port).to be == 19423
|
152
147
|
end
|
153
148
|
end
|
154
149
|
|
155
150
|
it 'knife raw -z --chef-zero-port=9999 /nodes/x retrieves the node' do
|
156
|
-
knife('raw -z --chef-zero-port=9999 /nodes/x').should_succeed /"name": "x"/
|
151
|
+
knife('raw -z --chef-zero-port=9999 /nodes/x').should_succeed( /"name": "x"/ )
|
157
152
|
Chef::Config.chef_server_url.should == 'http://localhost:9999'
|
158
153
|
end
|
159
154
|
end
|
@@ -19,7 +19,7 @@ require 'support/shared/integration/integration_helper'
|
|
19
19
|
require 'chef/mixin/shell_out'
|
20
20
|
|
21
21
|
describe "Knife cookbook API integration with IPv6" do
|
22
|
-
|
22
|
+
include IntegrationSupport
|
23
23
|
include Chef::Mixin::ShellOut
|
24
24
|
|
25
25
|
when_the_chef_server "is bound to IPv6" do
|
@@ -100,8 +100,8 @@ END_CLIENT_RB
|
|
100
100
|
end
|
101
101
|
|
102
102
|
it "downloads the cookbook" do
|
103
|
-
|
104
|
-
Dir["#{cache_path}/*"].map {|entry| File.basename(entry)}.should include("apache2-0.0.
|
103
|
+
shell_out!("knife cookbook download apache2 #{knife_config_flag} -d #{cache_path}", :cwd => chef_dir)
|
104
|
+
Dir["#{cache_path}/*"].map {|entry| File.basename(entry)}.should include("apache2-0.0.1")
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
@@ -21,7 +21,7 @@ require 'chef/knife/list'
|
|
21
21
|
require 'chef/knife/raw'
|
22
22
|
|
23
23
|
describe 'knife delete' do
|
24
|
-
|
24
|
+
include IntegrationSupport
|
25
25
|
include KnifeSupport
|
26
26
|
|
27
27
|
let :everything do
|
@@ -99,23 +99,27 @@ EOM
|
|
99
99
|
end
|
100
100
|
|
101
101
|
when_the_chef_server "has one of each thing" do
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
102
|
+
before do
|
103
|
+
client 'x', '{}'
|
104
|
+
cookbook 'x', '1.0.0'
|
105
|
+
data_bag 'x', { 'y' => '{}' }
|
106
|
+
environment 'x', '{}'
|
107
|
+
node 'x', '{}'
|
108
|
+
role 'x', '{}'
|
109
|
+
user 'x', '{}'
|
110
|
+
end
|
109
111
|
|
110
112
|
when_the_repository 'also has one of each thing' do
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
113
|
+
before do
|
114
|
+
file 'clients/x.json', {}
|
115
|
+
file 'cookbooks/x/metadata.rb', ''
|
116
|
+
file 'data_bags/x/y.json', {}
|
117
|
+
file 'environments/_default.json', {}
|
118
|
+
file 'environments/x.json', {}
|
119
|
+
file 'nodes/x.json', {}
|
120
|
+
file 'roles/x.json', {}
|
121
|
+
file 'users/x.json', {}
|
122
|
+
end
|
119
123
|
|
120
124
|
it 'knife delete --both /cookbooks/x fails' do
|
121
125
|
knife('delete --both /cookbooks/x').should_fail <<EOM
|
@@ -216,8 +220,11 @@ EOM
|
|
216
220
|
|
217
221
|
# TODO delete empty data bag (particularly different on local side)
|
218
222
|
context 'with an empty data bag on both' do
|
219
|
-
|
220
|
-
|
223
|
+
before do
|
224
|
+
data_bag 'empty', {}
|
225
|
+
directory 'data_bags/empty'
|
226
|
+
end
|
227
|
+
|
221
228
|
it 'knife delete --both /data_bags/empty fails but deletes local version' do
|
222
229
|
knife('delete --both /data_bags/empty').should_fail <<EOM
|
223
230
|
ERROR: /data_bags/empty (remote) must be deleted recursively! Pass -r to knife delete.
|
@@ -468,13 +475,15 @@ EOM
|
|
468
475
|
end
|
469
476
|
|
470
477
|
when_the_repository 'has only top-level directories' do
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
+
before do
|
479
|
+
directory 'clients'
|
480
|
+
directory 'cookbooks'
|
481
|
+
directory 'data_bags'
|
482
|
+
directory 'environments'
|
483
|
+
directory 'nodes'
|
484
|
+
directory 'roles'
|
485
|
+
directory 'users'
|
486
|
+
end
|
478
487
|
|
479
488
|
it 'knife delete --both /cookbooks/x fails' do
|
480
489
|
knife('delete --both /cookbooks/x').should_fail "ERROR: /cookbooks/x (remote) must be deleted recursively! Pass -r to knife delete.\n"
|
@@ -632,7 +641,7 @@ EOM
|
|
632
641
|
end
|
633
642
|
|
634
643
|
context 'and cwd is at the top level' do
|
635
|
-
cwd '.'
|
644
|
+
before { cwd '.' }
|
636
645
|
it 'knife delete fails' do
|
637
646
|
knife('delete').should_fail "FATAL: Must specify at least one argument. If you want to delete everything in this directory, type \"knife delete --recurse .\"\n", :stdout => /USAGE/
|
638
647
|
knife('list -Rf /').should_succeed <<EOM
|
@@ -673,14 +682,16 @@ EOM
|
|
673
682
|
|
674
683
|
when_the_chef_server 'is empty' do
|
675
684
|
when_the_repository 'has one of each thing' do
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
685
|
+
before do
|
686
|
+
file 'clients/x.json', {}
|
687
|
+
file 'cookbooks/x/metadata.rb', ''
|
688
|
+
file 'data_bags/x/y.json', {}
|
689
|
+
file 'environments/_default.json', {}
|
690
|
+
file 'environments/x.json', {}
|
691
|
+
file 'nodes/x.json', {}
|
692
|
+
file 'roles/x.json', {}
|
693
|
+
file 'users/x.json', {}
|
694
|
+
end
|
684
695
|
|
685
696
|
it 'knife delete --both /cookbooks/x fails' do
|
686
697
|
knife('delete --both /cookbooks/x').should_fail "ERROR: /cookbooks/x (local) must be deleted recursively! Pass -r to knife delete.\n"
|
@@ -843,7 +854,7 @@ EOM
|
|
843
854
|
end
|
844
855
|
|
845
856
|
context 'and cwd is at the top level' do
|
846
|
-
cwd '.'
|
857
|
+
before { cwd '.' }
|
847
858
|
it 'knife delete fails' do
|
848
859
|
knife('delete').should_fail "FATAL: Must specify at least one argument. If you want to delete everything in this directory, type \"knife delete --recurse .\"\n", :stdout => /USAGE/
|
849
860
|
knife('list -Rf /').should_succeed <<EOM
|
@@ -884,12 +895,16 @@ EOM
|
|
884
895
|
end
|
885
896
|
|
886
897
|
when_the_repository 'has a cookbook' do
|
887
|
-
|
888
|
-
|
898
|
+
before do
|
899
|
+
file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
|
900
|
+
file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
|
901
|
+
end
|
889
902
|
|
890
903
|
when_the_chef_server 'has a later version for the cookbook' do
|
891
|
-
|
892
|
-
|
904
|
+
before do
|
905
|
+
cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => '' }
|
906
|
+
cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => 'hi' }
|
907
|
+
end
|
893
908
|
|
894
909
|
# TODO this seems wrong
|
895
910
|
it 'knife delete --both -r /cookbooks/x deletes the latest version on the server and the local version' do
|
@@ -900,8 +915,10 @@ EOM
|
|
900
915
|
end
|
901
916
|
|
902
917
|
when_the_chef_server 'has an earlier version for the cookbook' do
|
903
|
-
|
904
|
-
|
918
|
+
before do
|
919
|
+
cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => ''}
|
920
|
+
cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => 'hi' }
|
921
|
+
end
|
905
922
|
|
906
923
|
it 'knife delete --both /cookbooks/x deletes the latest version on the server and the local version' do
|
907
924
|
knife('delete --both -r /cookbooks/x').should_succeed "Deleted /cookbooks/x\n"
|
@@ -911,7 +928,7 @@ EOM
|
|
911
928
|
end
|
912
929
|
|
913
930
|
when_the_chef_server 'has a later version for the cookbook, and no current version' do
|
914
|
-
cookbook 'x', '1.0.1', { '
|
931
|
+
before { cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => 'hi' } }
|
915
932
|
|
916
933
|
it 'knife delete --both /cookbooks/x deletes the server and client version of the cookbook' do
|
917
934
|
knife('delete --both -r /cookbooks/x').should_succeed "Deleted /cookbooks/x\n"
|
@@ -921,7 +938,7 @@ EOM
|
|
921
938
|
end
|
922
939
|
|
923
940
|
when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
|
924
|
-
cookbook 'x', '0.9.9', { '
|
941
|
+
before { cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => 'hi' } }
|
925
942
|
|
926
943
|
it 'knife delete --both /cookbooks/x deletes the server and client version of the cookbook' do
|
927
944
|
knife('delete --both -r /cookbooks/x').should_succeed "Deleted /cookbooks/x\n"
|
@@ -933,11 +950,14 @@ EOM
|
|
933
950
|
|
934
951
|
when_the_repository 'is empty' do
|
935
952
|
when_the_chef_server 'has two versions of a cookbook' do
|
936
|
-
|
937
|
-
|
953
|
+
before do
|
954
|
+
cookbook 'x', '2.0.11'
|
955
|
+
cookbook 'x', '11.0.0'
|
956
|
+
end
|
957
|
+
|
938
958
|
it 'knife delete deletes the latest version' do
|
939
959
|
knife('delete --both -r /cookbooks/x').should_succeed "Deleted /cookbooks/x\n"
|
940
|
-
knife('raw /cookbooks/x').should_succeed /2.0.11/
|
960
|
+
knife('raw /cookbooks/x').should_succeed( /2.0.11/ )
|
941
961
|
end
|
942
962
|
end
|
943
963
|
end
|
@@ -20,24 +20,26 @@ require 'support/shared/context/config'
|
|
20
20
|
require 'chef/knife/deps'
|
21
21
|
|
22
22
|
describe 'knife deps' do
|
23
|
-
|
23
|
+
include IntegrationSupport
|
24
24
|
include KnifeSupport
|
25
25
|
|
26
26
|
context 'local' do
|
27
27
|
when_the_repository 'has a role with no run_list' do
|
28
|
-
file 'roles/starring.json', {}
|
28
|
+
before { file 'roles/starring.json', {} }
|
29
29
|
it 'knife deps reports no dependencies' do
|
30
30
|
knife('deps /roles/starring.json').should_succeed "/roles/starring.json\n"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
when_the_repository 'has a role with a default run_list' do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
before do
|
36
|
+
file 'roles/starring.json', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
37
|
+
file 'roles/minor.json', {}
|
38
|
+
file 'cookbooks/quiche/metadata.rb', 'name "quiche"'
|
39
|
+
file 'cookbooks/quiche/recipes/default.rb', ''
|
40
|
+
file 'cookbooks/soup/metadata.rb', 'name "soup"'
|
41
|
+
file 'cookbooks/soup/recipes/chicken.rb', ''
|
42
|
+
end
|
41
43
|
it 'knife deps reports all dependencies' do
|
42
44
|
knife('deps /roles/starring.json').should_succeed <<EOM
|
43
45
|
/roles/minor.json
|
@@ -49,12 +51,14 @@ EOM
|
|
49
51
|
end
|
50
52
|
|
51
53
|
when_the_repository 'has a role with an env_run_list' do
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
before do
|
55
|
+
file 'roles/starring.json', { 'env_run_lists' => { 'desert' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) } }
|
56
|
+
file 'roles/minor.json', {}
|
57
|
+
file 'cookbooks/quiche/metadata.rb', 'name "quiche"'
|
58
|
+
file 'cookbooks/quiche/recipes/default.rb', ''
|
59
|
+
file 'cookbooks/soup/metadata.rb', 'name "soup"'
|
60
|
+
file 'cookbooks/soup/recipes/chicken.rb', ''
|
61
|
+
end
|
58
62
|
it 'knife deps reports all dependencies' do
|
59
63
|
knife('deps /roles/starring.json').should_succeed <<EOM
|
60
64
|
/roles/minor.json
|
@@ -66,25 +70,29 @@ EOM
|
|
66
70
|
end
|
67
71
|
|
68
72
|
when_the_repository 'has a node with no environment or run_list' do
|
69
|
-
file 'nodes/mort.json', {}
|
73
|
+
before { file 'nodes/mort.json', {} }
|
70
74
|
it 'knife deps reports just the node' do
|
71
75
|
knife('deps /nodes/mort.json').should_succeed "/nodes/mort.json\n"
|
72
76
|
end
|
73
77
|
end
|
74
78
|
when_the_repository 'has a node with an environment' do
|
75
|
-
|
76
|
-
|
79
|
+
before do
|
80
|
+
file 'environments/desert.json', {}
|
81
|
+
file 'nodes/mort.json', { 'chef_environment' => 'desert' }
|
82
|
+
end
|
77
83
|
it 'knife deps reports just the node' do
|
78
84
|
knife('deps /nodes/mort.json').should_succeed "/environments/desert.json\n/nodes/mort.json\n"
|
79
85
|
end
|
80
86
|
end
|
81
87
|
when_the_repository 'has a node with roles and recipes in its run_list' do
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
+
before do
|
89
|
+
file 'roles/minor.json', {}
|
90
|
+
file 'cookbooks/quiche/metadata.rb', 'name "quiche"'
|
91
|
+
file 'cookbooks/quiche/recipes/default.rb', ''
|
92
|
+
file 'cookbooks/soup/metadata.rb', 'name "soup"'
|
93
|
+
file 'cookbooks/soup/recipes/chicken.rb', ''
|
94
|
+
file 'nodes/mort.json', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
95
|
+
end
|
88
96
|
it 'knife deps reports just the node' do
|
89
97
|
knife('deps /nodes/mort.json').should_succeed <<EOM
|
90
98
|
/roles/minor.json
|
@@ -95,42 +103,48 @@ EOM
|
|
95
103
|
end
|
96
104
|
end
|
97
105
|
when_the_repository 'has a cookbook with no dependencies' do
|
98
|
-
|
99
|
-
|
106
|
+
before do
|
107
|
+
file 'cookbooks/quiche/metadata.rb', 'name "quiche"'
|
108
|
+
file 'cookbooks/quiche/recipes/default.rb', ''
|
109
|
+
end
|
100
110
|
it 'knife deps reports just the cookbook' do
|
101
111
|
knife('deps /cookbooks/quiche').should_succeed "/cookbooks/quiche\n"
|
102
112
|
end
|
103
113
|
end
|
104
114
|
when_the_repository 'has a cookbook with dependencies' do
|
105
|
-
|
106
|
-
|
107
|
-
|
115
|
+
before do
|
116
|
+
file 'cookbooks/kettle/metadata.rb', 'name "kettle"'
|
117
|
+
file 'cookbooks/quiche/metadata.rb', "name 'quiche'\ndepends 'kettle'\n"
|
118
|
+
file 'cookbooks/quiche/recipes/default.rb', ''
|
119
|
+
end
|
108
120
|
it 'knife deps reports just the cookbook' do
|
109
121
|
knife('deps /cookbooks/quiche').should_succeed "/cookbooks/kettle\n/cookbooks/quiche\n"
|
110
122
|
end
|
111
123
|
end
|
112
124
|
when_the_repository 'has a data bag' do
|
113
|
-
file 'data_bags/bag/item.json', {}
|
125
|
+
before { file 'data_bags/bag/item.json', {} }
|
114
126
|
it 'knife deps reports just the data bag' do
|
115
127
|
knife('deps /data_bags/bag/item.json').should_succeed "/data_bags/bag/item.json\n"
|
116
128
|
end
|
117
129
|
end
|
118
130
|
when_the_repository 'has an environment' do
|
119
|
-
file 'environments/desert.json', {}
|
131
|
+
before { file 'environments/desert.json', {} }
|
120
132
|
it 'knife deps reports just the environment' do
|
121
133
|
knife('deps /environments/desert.json').should_succeed "/environments/desert.json\n"
|
122
134
|
end
|
123
135
|
end
|
124
136
|
when_the_repository 'has a deep dependency tree' do
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
137
|
+
before do
|
138
|
+
file 'roles/starring.json', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
139
|
+
file 'roles/minor.json', {}
|
140
|
+
file 'cookbooks/quiche/metadata.rb', 'name "quiche"'
|
141
|
+
file 'cookbooks/quiche/recipes/default.rb', ''
|
142
|
+
file 'cookbooks/soup/metadata.rb', 'name "soup"'
|
143
|
+
file 'cookbooks/soup/recipes/chicken.rb', ''
|
144
|
+
file 'environments/desert.json', {}
|
145
|
+
file 'nodes/mort.json', { 'chef_environment' => 'desert', 'run_list' => [ 'role[starring]' ] }
|
146
|
+
file 'nodes/bart.json', { 'run_list' => [ 'role[minor]' ] }
|
147
|
+
end
|
134
148
|
|
135
149
|
it 'knife deps reports all dependencies' do
|
136
150
|
knife('deps /nodes/mort.json').should_succeed <<EOM
|
@@ -189,10 +203,13 @@ EOM
|
|
189
203
|
|
190
204
|
context 'circular dependencies' do
|
191
205
|
when_the_repository 'has cookbooks with circular dependencies' do
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
206
|
+
before do
|
207
|
+
file 'cookbooks/foo/metadata.rb', "name 'foo'\ndepends 'bar'\n"
|
208
|
+
file 'cookbooks/bar/metadata.rb', "name 'bar'\ndepends 'baz'\n"
|
209
|
+
file 'cookbooks/baz/metadata.rb', "name 'baz'\ndepends 'foo'\n"
|
210
|
+
file 'cookbooks/self/metadata.rb', "name 'self'\ndepends 'self'\n"
|
211
|
+
end
|
212
|
+
|
196
213
|
it 'knife deps prints each once' do
|
197
214
|
knife('deps /cookbooks/foo /cookbooks/self').should_succeed <<EOM
|
198
215
|
/cookbooks/baz
|
@@ -213,10 +230,12 @@ EOM
|
|
213
230
|
end
|
214
231
|
end
|
215
232
|
when_the_repository 'has roles with circular dependencies' do
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
233
|
+
before do
|
234
|
+
file 'roles/foo.json', { 'run_list' => [ 'role[bar]' ] }
|
235
|
+
file 'roles/bar.json', { 'run_list' => [ 'role[baz]' ] }
|
236
|
+
file 'roles/baz.json', { 'run_list' => [ 'role[foo]' ] }
|
237
|
+
file 'roles/self.json', { 'run_list' => [ 'role[self]' ] }
|
238
|
+
end
|
220
239
|
it 'knife deps prints each once' do
|
221
240
|
knife('deps /roles/foo.json /roles/self.json').should_succeed <<EOM
|
222
241
|
/roles/baz.json
|
@@ -280,7 +299,9 @@ EOM
|
|
280
299
|
end
|
281
300
|
end
|
282
301
|
when_the_repository 'is missing a dependent cookbook' do
|
283
|
-
|
302
|
+
before do
|
303
|
+
file 'roles/starring.json', { 'run_list' => [ 'recipe[quiche]'] }
|
304
|
+
end
|
284
305
|
it 'knife deps reports the cookbook, along with an error' do
|
285
306
|
knife('deps /roles/starring.json').should_fail(
|
286
307
|
:exit_code => 2,
|
@@ -290,7 +311,9 @@ EOM
|
|
290
311
|
end
|
291
312
|
end
|
292
313
|
when_the_repository 'is missing a dependent environment' do
|
293
|
-
|
314
|
+
before do
|
315
|
+
file 'nodes/mort.json', { 'chef_environment' => 'desert' }
|
316
|
+
end
|
294
317
|
it 'knife deps reports the environment, along with an error' do
|
295
318
|
knife('deps /nodes/mort.json').should_fail(
|
296
319
|
:exit_code => 2,
|
@@ -300,7 +323,9 @@ EOM
|
|
300
323
|
end
|
301
324
|
end
|
302
325
|
when_the_repository 'is missing a dependent role' do
|
303
|
-
|
326
|
+
before do
|
327
|
+
file 'roles/starring.json', { 'run_list' => [ 'role[minor]'] }
|
328
|
+
end
|
304
329
|
it 'knife deps reports the role, along with an error' do
|
305
330
|
knife('deps /roles/starring.json').should_fail(
|
306
331
|
:exit_code => 2,
|
@@ -324,13 +349,13 @@ EOM
|
|
324
349
|
end
|
325
350
|
end
|
326
351
|
when_the_repository 'has a data bag' do
|
327
|
-
file 'data_bags/bag/item.json', ''
|
352
|
+
before { file 'data_bags/bag/item.json', '' }
|
328
353
|
it 'knife deps /data_bags/bag shows no dependencies' do
|
329
354
|
knife('deps /data_bags/bag').should_succeed("/data_bags/bag\n")
|
330
355
|
end
|
331
356
|
end
|
332
357
|
when_the_repository 'has a cookbook' do
|
333
|
-
file 'cookbooks/blah/metadata.rb', 'name "blah"'
|
358
|
+
before { file 'cookbooks/blah/metadata.rb', 'name "blah"' }
|
334
359
|
it 'knife deps on a cookbook file shows no dependencies' do
|
335
360
|
knife('deps /cookbooks/blah/metadata.rb').should_succeed(
|
336
361
|
"/cookbooks/blah/metadata.rb\n"
|
@@ -342,19 +367,21 @@ EOM
|
|
342
367
|
|
343
368
|
context 'remote' do
|
344
369
|
include_context "default config options"
|
345
|
-
|
370
|
+
|
346
371
|
when_the_chef_server 'has a role with no run_list' do
|
347
|
-
role 'starring', {}
|
372
|
+
before { role 'starring', {} }
|
348
373
|
it 'knife deps reports no dependencies' do
|
349
374
|
knife('deps --remote /roles/starring.json').should_succeed "/roles/starring.json\n"
|
350
375
|
end
|
351
376
|
end
|
352
377
|
|
353
378
|
when_the_chef_server 'has a role with a default run_list' do
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
379
|
+
before do
|
380
|
+
role 'starring', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
381
|
+
role 'minor', {}
|
382
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\nversion '1.0.0'\n", 'recipes' => { 'default.rb' => '' } }
|
383
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => "name 'soup'\nversion '1.0.0'\n", 'recipes' => { 'chicken.rb' => '' } }
|
384
|
+
end
|
358
385
|
it 'knife deps reports all dependencies' do
|
359
386
|
knife('deps --remote /roles/starring.json').should_succeed <<EOM
|
360
387
|
/roles/minor.json
|
@@ -366,10 +393,12 @@ EOM
|
|
366
393
|
end
|
367
394
|
|
368
395
|
when_the_chef_server 'has a role with an env_run_list' do
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
396
|
+
before do
|
397
|
+
role 'starring', { 'env_run_lists' => { 'desert' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) } }
|
398
|
+
role 'minor', {}
|
399
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\nversion '1.0.0'\n", 'recipes' => { 'default.rb' => '' } }
|
400
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => "name 'soup'\nversion '1.0.0'\n", 'recipes' => { 'chicken.rb' => '' } }
|
401
|
+
end
|
373
402
|
it 'knife deps reports all dependencies' do
|
374
403
|
knife('deps --remote /roles/starring.json').should_succeed <<EOM
|
375
404
|
/roles/minor.json
|
@@ -381,23 +410,27 @@ EOM
|
|
381
410
|
end
|
382
411
|
|
383
412
|
when_the_chef_server 'has a node with no environment or run_list' do
|
384
|
-
node 'mort', {}
|
413
|
+
before { node 'mort', {} }
|
385
414
|
it 'knife deps reports just the node' do
|
386
415
|
knife('deps --remote /nodes/mort.json').should_succeed "/nodes/mort.json\n"
|
387
416
|
end
|
388
417
|
end
|
389
418
|
when_the_chef_server 'has a node with an environment' do
|
390
|
-
|
391
|
-
|
419
|
+
before do
|
420
|
+
environment 'desert', {}
|
421
|
+
node 'mort', { 'chef_environment' => 'desert' }
|
422
|
+
end
|
392
423
|
it 'knife deps reports just the node' do
|
393
424
|
knife('deps --remote /nodes/mort.json').should_succeed "/environments/desert.json\n/nodes/mort.json\n"
|
394
425
|
end
|
395
426
|
end
|
396
427
|
when_the_chef_server 'has a node with roles and recipes in its run_list' do
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
428
|
+
before do
|
429
|
+
role 'minor', {}
|
430
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\nversion '1.0.0'\n", 'recipes' => { 'default.rb' => '' } }
|
431
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => "name 'soup'\nversion '1.0.0'\n", 'recipes' => { 'chicken.rb' => '' } }
|
432
|
+
node 'mort', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
433
|
+
end
|
401
434
|
it 'knife deps reports just the node' do
|
402
435
|
knife('deps --remote /nodes/mort.json').should_succeed <<EOM
|
403
436
|
/roles/minor.json
|
@@ -408,38 +441,44 @@ EOM
|
|
408
441
|
end
|
409
442
|
end
|
410
443
|
when_the_chef_server 'has a cookbook with no dependencies' do
|
411
|
-
|
444
|
+
before do
|
445
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\nversion '1.0.0'\n", 'recipes' => { 'default.rb' => '' } }
|
446
|
+
end
|
412
447
|
it 'knife deps reports just the cookbook' do
|
413
448
|
knife('deps --remote /cookbooks/quiche').should_succeed "/cookbooks/quiche\n"
|
414
449
|
end
|
415
450
|
end
|
416
451
|
when_the_chef_server 'has a cookbook with dependencies' do
|
417
|
-
|
418
|
-
|
452
|
+
before do
|
453
|
+
cookbook 'kettle', '1.0.0', { 'metadata.rb' => "name 'kettle'\nversion '1.0.0'\n" }
|
454
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\ndepends 'kettle'\n", 'recipes' => { 'default.rb' => '' } }
|
455
|
+
end
|
419
456
|
it 'knife deps reports the cookbook and its dependencies' do
|
420
457
|
knife('deps --remote /cookbooks/quiche').should_succeed "/cookbooks/kettle\n/cookbooks/quiche\n"
|
421
458
|
end
|
422
459
|
end
|
423
460
|
when_the_chef_server 'has a data bag' do
|
424
|
-
data_bag 'bag', { 'item' => {} }
|
461
|
+
before { data_bag 'bag', { 'item' => {} } }
|
425
462
|
it 'knife deps reports just the data bag' do
|
426
463
|
knife('deps --remote /data_bags/bag/item.json').should_succeed "/data_bags/bag/item.json\n"
|
427
464
|
end
|
428
465
|
end
|
429
466
|
when_the_chef_server 'has an environment' do
|
430
|
-
environment 'desert', {}
|
467
|
+
before { environment 'desert', {} }
|
431
468
|
it 'knife deps reports just the environment' do
|
432
469
|
knife('deps --remote /environments/desert.json').should_succeed "/environments/desert.json\n"
|
433
470
|
end
|
434
471
|
end
|
435
472
|
when_the_chef_server 'has a deep dependency tree' do
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
473
|
+
before do
|
474
|
+
role 'starring', { 'run_list' => %w(role[minor] recipe[quiche] recipe[soup::chicken]) }
|
475
|
+
role 'minor', {}
|
476
|
+
cookbook 'quiche', '1.0.0', { 'metadata.rb' => "name 'quiche'\nversion '1.0.0'\n", 'recipes' => { 'default.rb' => '' } }
|
477
|
+
cookbook 'soup', '1.0.0', { 'metadata.rb' => "name 'soup'\nversion '1.0.0'\n", 'recipes' => { 'chicken.rb' => '' } }
|
478
|
+
environment 'desert', {}
|
479
|
+
node 'mort', { 'chef_environment' => 'desert', 'run_list' => [ 'role[starring]' ] }
|
480
|
+
node 'bart', { 'run_list' => [ 'role[minor]' ] }
|
481
|
+
end
|
443
482
|
|
444
483
|
it 'knife deps reports all dependencies' do
|
445
484
|
knife('deps --remote /nodes/mort.json').should_succeed <<EOM
|
@@ -498,10 +537,12 @@ EOM
|
|
498
537
|
|
499
538
|
context 'circular dependencies' do
|
500
539
|
when_the_chef_server 'has cookbooks with circular dependencies' do
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
540
|
+
before do
|
541
|
+
cookbook 'foo', '1.0.0', { 'metadata.rb' => "name 'foo'\ndepends 'bar'\n" }
|
542
|
+
cookbook 'bar', '1.0.0', { 'metadata.rb' => "name 'bar'\ndepends 'baz'\n" }
|
543
|
+
cookbook 'baz', '1.0.0', { 'metadata.rb' => "name 'baz'\ndepends 'foo'\n" }
|
544
|
+
cookbook 'self', '1.0.0', { 'metadata.rb' => "name 'self'\ndepends 'self'\n" }
|
545
|
+
end
|
505
546
|
it 'knife deps prints each once' do
|
506
547
|
knife('deps --remote /cookbooks/foo /cookbooks/self').should_succeed <<EOM
|
507
548
|
/cookbooks/baz
|
@@ -522,10 +563,12 @@ EOM
|
|
522
563
|
end
|
523
564
|
end
|
524
565
|
when_the_chef_server 'has roles with circular dependencies' do
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
566
|
+
before do
|
567
|
+
role 'foo', { 'run_list' => [ 'role[bar]' ] }
|
568
|
+
role 'bar', { 'run_list' => [ 'role[baz]' ] }
|
569
|
+
role 'baz', { 'run_list' => [ 'role[foo]' ] }
|
570
|
+
role 'self', { 'run_list' => [ 'role[self]' ] }
|
571
|
+
end
|
529
572
|
it 'knife deps prints each once' do
|
530
573
|
knife('deps --remote /roles/foo.json /roles/self.json').should_succeed <<EOM
|
531
574
|
/roles/baz.json
|
@@ -589,7 +632,9 @@ EOM
|
|
589
632
|
end
|
590
633
|
end
|
591
634
|
when_the_chef_server 'is missing a dependent cookbook' do
|
592
|
-
|
635
|
+
before do
|
636
|
+
role 'starring', { 'run_list' => [ 'recipe[quiche]'] }
|
637
|
+
end
|
593
638
|
it 'knife deps reports the cookbook, along with an error' do
|
594
639
|
knife('deps --remote /roles/starring.json').should_fail(
|
595
640
|
:exit_code => 2,
|
@@ -599,7 +644,9 @@ EOM
|
|
599
644
|
end
|
600
645
|
end
|
601
646
|
when_the_chef_server 'is missing a dependent environment' do
|
602
|
-
|
647
|
+
before do
|
648
|
+
node 'mort', { 'chef_environment' => 'desert' }
|
649
|
+
end
|
603
650
|
it 'knife deps reports the environment, along with an error' do
|
604
651
|
knife('deps --remote /nodes/mort.json').should_fail(
|
605
652
|
:exit_code => 2,
|
@@ -609,7 +656,9 @@ EOM
|
|
609
656
|
end
|
610
657
|
end
|
611
658
|
when_the_chef_server 'is missing a dependent role' do
|
612
|
-
|
659
|
+
before do
|
660
|
+
role 'starring', { 'run_list' => [ 'role[minor]'] }
|
661
|
+
end
|
613
662
|
it 'knife deps reports the role, along with an error' do
|
614
663
|
knife('deps --remote /roles/starring.json').should_fail(
|
615
664
|
:exit_code => 2,
|
@@ -629,13 +678,15 @@ EOM
|
|
629
678
|
end
|
630
679
|
end
|
631
680
|
when_the_chef_server 'has a data bag' do
|
632
|
-
data_bag 'bag', { 'item' => {} }
|
681
|
+
before { data_bag 'bag', { 'item' => {} } }
|
633
682
|
it 'knife deps /data_bags/bag shows no dependencies' do
|
634
683
|
knife('deps --remote /data_bags/bag').should_succeed("/data_bags/bag\n")
|
635
684
|
end
|
636
685
|
end
|
637
686
|
when_the_chef_server 'has a cookbook' do
|
638
|
-
|
687
|
+
before do
|
688
|
+
cookbook 'blah', '1.0.0', { 'metadata.rb' => 'name "blah"' }
|
689
|
+
end
|
639
690
|
it 'knife deps on a cookbook file shows no dependencies' do
|
640
691
|
knife('deps --remote /cookbooks/blah/metadata.rb').should_succeed(
|
641
692
|
"/cookbooks/blah/metadata.rb\n"
|