chef 12.0.0.alpha.0-x86-mingw32 → 12.0.0.alpha.1-x86-mingw32
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.
- 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
@@ -2,7 +2,7 @@ require 'support/shared/integration/integration_helper'
|
|
2
2
|
require 'chef/mixin/shell_out'
|
3
3
|
|
4
4
|
describe "LWRPs with inline resources" do
|
5
|
-
|
5
|
+
include IntegrationSupport
|
6
6
|
include Chef::Mixin::ShellOut
|
7
7
|
|
8
8
|
let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
|
@@ -19,22 +19,23 @@ describe "LWRPs with inline resources" do
|
|
19
19
|
let(:chef_client) { "ruby #{chef_dir}/chef-client" }
|
20
20
|
|
21
21
|
when_the_repository "has a cookbook with a nested LWRP" do
|
22
|
-
|
22
|
+
before do
|
23
|
+
directory 'cookbooks/x' do
|
23
24
|
|
24
|
-
|
25
|
+
file 'resources/do_nothing.rb', <<EOM
|
25
26
|
actions :create, :nothing
|
26
27
|
default_action :create
|
27
28
|
EOM
|
28
|
-
|
29
|
+
file 'providers/do_nothing.rb', <<EOM
|
29
30
|
action :create do
|
30
31
|
end
|
31
32
|
EOM
|
32
33
|
|
33
|
-
|
34
|
+
file 'resources/my_machine.rb', <<EOM
|
34
35
|
actions :create, :nothing
|
35
36
|
default_action :create
|
36
37
|
EOM
|
37
|
-
|
38
|
+
file 'providers/my_machine.rb', <<EOM
|
38
39
|
use_inline_resources
|
39
40
|
action :create do
|
40
41
|
x_do_nothing 'a'
|
@@ -42,12 +43,13 @@ action :create do
|
|
42
43
|
end
|
43
44
|
EOM
|
44
45
|
|
45
|
-
|
46
|
+
file 'recipes/default.rb', <<EOM
|
46
47
|
x_my_machine "me"
|
47
48
|
x_my_machine "you"
|
48
49
|
EOM
|
49
50
|
|
50
|
-
|
51
|
+
end # directory 'cookbooks/x'
|
52
|
+
end
|
51
53
|
|
52
54
|
it "should complete with success" do
|
53
55
|
file 'config/client.rb', <<EOM
|
@@ -6,14 +6,20 @@ require 'timeout'
|
|
6
6
|
require 'fileutils'
|
7
7
|
|
8
8
|
describe "chef-solo" do
|
9
|
-
|
9
|
+
include IntegrationSupport
|
10
10
|
include Chef::Mixin::ShellOut
|
11
11
|
|
12
12
|
let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..") }
|
13
13
|
|
14
|
+
let(:cookbook_x_100_metadata_rb) { cb_metadata("x", "1.0.0") }
|
15
|
+
|
16
|
+
let(:cookbook_ancient_100_metadata_rb) { cb_metadata("ancient", "1.0.0") }
|
17
|
+
|
14
18
|
when_the_repository "has a cookbook with a basic recipe" do
|
15
|
-
|
16
|
-
|
19
|
+
before do
|
20
|
+
file 'cookbooks/x/metadata.rb', cookbook_x_100_metadata_rb
|
21
|
+
file 'cookbooks/x/recipes/default.rb', 'puts "ITWORKS"'
|
22
|
+
end
|
17
23
|
|
18
24
|
it "should complete with success" do
|
19
25
|
file 'config/solo.rb', <<EOM
|
@@ -43,11 +49,13 @@ E
|
|
43
49
|
end
|
44
50
|
|
45
51
|
when_the_repository "has a cookbook with an undeclared dependency" do
|
46
|
-
|
47
|
-
|
52
|
+
before do
|
53
|
+
file 'cookbooks/x/metadata.rb', cookbook_x_100_metadata_rb
|
54
|
+
file 'cookbooks/x/recipes/default.rb', 'include_recipe "ancient::aliens"'
|
48
55
|
|
49
|
-
|
50
|
-
|
56
|
+
file 'cookbooks/ancient/metadata.rb', cookbook_ancient_100_metadata_rb
|
57
|
+
file 'cookbooks/ancient/recipes/aliens.rb', 'print "it was aliens"'
|
58
|
+
end
|
51
59
|
|
52
60
|
it "should exit with an error" do
|
53
61
|
file 'config/solo.rb', <<EOM
|
@@ -62,16 +70,19 @@ EOM
|
|
62
70
|
|
63
71
|
|
64
72
|
when_the_repository "has a cookbook with a recipe with sleep" do
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
73
|
+
before do
|
74
|
+
directory 'logs'
|
75
|
+
file 'logs/runs.log', ''
|
76
|
+
file 'cookbooks/x/metadata.rb', cookbook_x_100_metadata_rb
|
77
|
+
file 'cookbooks/x/recipes/default.rb', <<EOM
|
69
78
|
ruby_block "sleeping" do
|
70
79
|
block do
|
71
80
|
sleep 5
|
72
81
|
end
|
73
82
|
end
|
74
83
|
EOM
|
84
|
+
end
|
85
|
+
|
75
86
|
# Ruby 1.8.7 doesn't have Process.spawn :(
|
76
87
|
it "while running solo concurrently", :ruby_gte_19_only => true do
|
77
88
|
file 'config/solo.rb', <<EOM
|
data/spec/spec_helper.rb
CHANGED
@@ -124,6 +124,9 @@ RSpec.configure do |config|
|
|
124
124
|
config.filter_run_excluding :requires_root_or_running_windows => true unless (root? || windows?)
|
125
125
|
config.filter_run_excluding :requires_unprivileged_user => true if root?
|
126
126
|
config.filter_run_excluding :uses_diff => true unless has_diff?
|
127
|
+
config.filter_run_excluding :ruby_gte_20_and_openssl_gte_101 => true unless (ruby_gte_20? && openssl_gte_101?)
|
128
|
+
config.filter_run_excluding :openssl_lt_101 => true unless openssl_lt_101?
|
129
|
+
config.filter_run_excluding :ruby_lt_20 => true unless ruby_lt_20?
|
127
130
|
|
128
131
|
running_platform_arch = `uname -m`.strip
|
129
132
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2014 Chef Software, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require 'chef/knife'
|
19
|
+
require 'chef/json_compat'
|
20
|
+
|
21
|
+
class Chef
|
22
|
+
class Resource
|
23
|
+
class ZenFollower < Chef::Resource
|
24
|
+
attr_accessor :created_as_type
|
25
|
+
|
26
|
+
provides :follower, :on_platforms => ["zen"]
|
27
|
+
|
28
|
+
def initialize(name, run_context=nil)
|
29
|
+
@resource_name = :zen_follower
|
30
|
+
@created_as_type = "zen_follower"
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
"#{created_as_type}[#{name}]"
|
36
|
+
end
|
37
|
+
|
38
|
+
def master(arg=nil)
|
39
|
+
if !arg.nil?
|
40
|
+
@master = arg
|
41
|
+
end
|
42
|
+
@master
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -7,6 +7,10 @@ def ruby_gte_20?
|
|
7
7
|
RUBY_VERSION.to_f >= 2.0
|
8
8
|
end
|
9
9
|
|
10
|
+
def ruby_lt_20?
|
11
|
+
!ruby_gte_20?
|
12
|
+
end
|
13
|
+
|
10
14
|
def ruby_gte_19?
|
11
15
|
RUBY_VERSION.to_f >= 1.9
|
12
16
|
end
|
@@ -129,3 +133,11 @@ def root?
|
|
129
133
|
return false if windows?
|
130
134
|
Process.euid == 0
|
131
135
|
end
|
136
|
+
|
137
|
+
def openssl_gte_101?
|
138
|
+
OpenSSL::OPENSSL_VERSION_NUMBER >= 10001000
|
139
|
+
end
|
140
|
+
|
141
|
+
def openssl_lt_101?
|
142
|
+
!openssl_gte_101?
|
143
|
+
end
|
@@ -96,6 +96,16 @@ shared_examples_for "a file with the wrong content" do
|
|
96
96
|
selinux_security_context_restored?(path).should be_true
|
97
97
|
end
|
98
98
|
end
|
99
|
+
|
100
|
+
context "with a checksum that does not match the content to deploy" do
|
101
|
+
before do
|
102
|
+
resource.checksum("aAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaA")
|
103
|
+
end
|
104
|
+
|
105
|
+
it "raises an exception" do
|
106
|
+
expect{ resource.run_action(:create) }.to raise_error(Chef::Exceptions::ChecksumMismatch)
|
107
|
+
end
|
108
|
+
end
|
99
109
|
end
|
100
110
|
|
101
111
|
describe "when running action :create_if_missing" do
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'chef_zero/server'
|
3
|
+
require 'chef_zero/rest_request'
|
4
|
+
|
5
|
+
# This is a copy of chef_zero/rspec, modified to implement contextual
|
6
|
+
# helpers as instance_methods rather than class methods. This makes it
|
7
|
+
# possible to use them with let bindings and other RSpec code reuse
|
8
|
+
# mechanisms.
|
9
|
+
#
|
10
|
+
# Unfortunately, at the time of this writing, chef-zero master doesn't
|
11
|
+
# work for our rspec tests, so in the interests of making forward
|
12
|
+
# progress, we're using a modified version of the chef_zero/rspec code
|
13
|
+
# here.
|
14
|
+
#
|
15
|
+
# This file should be entirely replaced by chef_zero/rspec once these
|
16
|
+
# issues are fixed.
|
17
|
+
module ChefZeroSupport
|
18
|
+
module Server
|
19
|
+
|
20
|
+
def self.server
|
21
|
+
@server
|
22
|
+
end
|
23
|
+
def self.server=(value)
|
24
|
+
@server = value
|
25
|
+
end
|
26
|
+
def self.client_key
|
27
|
+
@client_key
|
28
|
+
end
|
29
|
+
def self.client_key=(value)
|
30
|
+
@client_key = value
|
31
|
+
end
|
32
|
+
def self.request_log
|
33
|
+
@request_log ||= []
|
34
|
+
end
|
35
|
+
def self.clear_request_log
|
36
|
+
@request_log = []
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def client(name, client)
|
42
|
+
ChefZeroSupport::Server.server.load_data({ 'clients' => { name => client }})
|
43
|
+
end
|
44
|
+
|
45
|
+
def cookbook(name, version, cookbook = {}, options = {})
|
46
|
+
|
47
|
+
auto_metadata = "name '#{name}'; version '#{version}'"
|
48
|
+
|
49
|
+
cookbook["metadata.rb"] ||= auto_metadata
|
50
|
+
|
51
|
+
ChefZeroSupport::Server.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => cookbook.merge(options) }})
|
52
|
+
end
|
53
|
+
|
54
|
+
def data_bag(name, data_bag)
|
55
|
+
ChefZeroSupport::Server.server.load_data({ 'data' => { name => data_bag }})
|
56
|
+
end
|
57
|
+
|
58
|
+
def environment(name, environment)
|
59
|
+
ChefZeroSupport::Server.server.load_data({ 'environments' => { name => environment }})
|
60
|
+
end
|
61
|
+
|
62
|
+
def node(name, node)
|
63
|
+
ChefZeroSupport::Server.server.load_data({ 'nodes' => { name => node }})
|
64
|
+
end
|
65
|
+
|
66
|
+
def role(name, role)
|
67
|
+
ChefZeroSupport::Server.server.load_data({ 'roles' => { name => role }})
|
68
|
+
end
|
69
|
+
|
70
|
+
def user(name, user)
|
71
|
+
ChefZeroSupport::Server.server.load_data({ 'users' => { name => user }})
|
72
|
+
end
|
73
|
+
|
74
|
+
RSpec.shared_context "With chef-zero running" do
|
75
|
+
before :each do
|
76
|
+
|
77
|
+
default_opts = {:port => 8900, :signals => false, :log_requests => true}
|
78
|
+
server_opts = if self.respond_to?(:chef_zero_opts)
|
79
|
+
default_opts.merge(chef_zero_opts)
|
80
|
+
else
|
81
|
+
default_opts
|
82
|
+
end
|
83
|
+
|
84
|
+
if ChefZeroSupport::Server.server && server_opts.any? { |opt, value| ChefZeroSupport::Server.server.options[opt] != value }
|
85
|
+
ChefZeroSupport::Server.server.stop
|
86
|
+
ChefZeroSupport::Server.server = nil
|
87
|
+
end
|
88
|
+
|
89
|
+
unless ChefZeroSupport::Server.server
|
90
|
+
# TODO: can this be logged easily?
|
91
|
+
# pp :zero_opts => server_opts
|
92
|
+
|
93
|
+
# Set up configuration so that clients will point to the server
|
94
|
+
ChefZeroSupport::Server.server = ChefZero::Server.new(server_opts)
|
95
|
+
ChefZeroSupport::Server.client_key = Tempfile.new(['chef_zero_client_key', '.pem'])
|
96
|
+
ChefZeroSupport::Server.client_key.write(ChefZero::PRIVATE_KEY)
|
97
|
+
ChefZeroSupport::Server.client_key.close
|
98
|
+
# Start the server
|
99
|
+
ChefZeroSupport::Server.server.start_background
|
100
|
+
ChefZeroSupport::Server.server.on_response do |request, response|
|
101
|
+
ChefZeroSupport::Server.request_log << [ request, response ]
|
102
|
+
end
|
103
|
+
else
|
104
|
+
ChefZeroSupport::Server.server.clear_data
|
105
|
+
end
|
106
|
+
ChefZeroSupport::Server.clear_request_log
|
107
|
+
|
108
|
+
if defined?(Chef::Config)
|
109
|
+
@old_chef_server_url = Chef::Config.chef_server_url
|
110
|
+
@old_node_name = Chef::Config.node_name
|
111
|
+
@old_client_key = Chef::Config.client_key
|
112
|
+
Chef::Config.chef_server_url = ChefZeroSupport::Server.server.url
|
113
|
+
Chef::Config.node_name = 'admin'
|
114
|
+
Chef::Config.client_key = ChefZeroSupport::Server.client_key.path
|
115
|
+
Chef::Config.http_retry_count = 0
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
if defined?(Chef::Config)
|
120
|
+
after :each do
|
121
|
+
Chef::Config.chef_server_url = @old_chef_server_url
|
122
|
+
Chef::Config.node_name = @old_node_name
|
123
|
+
Chef::Config.client_key = @old_client_key
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
@@ -20,131 +20,133 @@
|
|
20
20
|
require 'tmpdir'
|
21
21
|
require 'fileutils'
|
22
22
|
require 'chef/config'
|
23
|
-
|
24
|
-
|
23
|
+
|
24
|
+
# Temporarily use our own copy of chef-zero rspec integration.
|
25
|
+
# See support/shared/integration/chef_zero_support for details
|
26
|
+
#require 'chef_zero/rspec'
|
27
|
+
require 'support/shared/integration/chef_zero_support'
|
28
|
+
|
29
|
+
require 'chef/json_compat'
|
25
30
|
require 'support/shared/integration/knife_support'
|
26
31
|
require 'support/shared/integration/app_server_support'
|
27
32
|
require 'spec_helper'
|
28
33
|
|
29
34
|
module IntegrationSupport
|
30
|
-
include
|
31
|
-
|
32
|
-
def when_the_repository(description, *args, &block)
|
33
|
-
context "When the local repository #{description}", *args do
|
34
|
-
before :each do
|
35
|
-
raise "Can only create one directory per test" if @repository_dir
|
36
|
-
@repository_dir = Dir.mktmpdir('chef_repo')
|
37
|
-
Chef::Config.chef_repo_path = @repository_dir
|
38
|
-
%w(client cookbook data_bag environment node role user).each do |object_name|
|
39
|
-
Chef::Config.delete("#{object_name}_path".to_sym)
|
40
|
-
end
|
41
|
-
end
|
35
|
+
include ChefZeroSupport
|
42
36
|
|
43
|
-
|
44
|
-
if @repository_dir
|
45
|
-
begin
|
46
|
-
%w(client cookbook data_bag environment node role user).each do |object_name|
|
47
|
-
Chef::Config.delete("#{object_name}_path".to_sym)
|
48
|
-
end
|
49
|
-
Chef::Config.delete(:chef_repo_path)
|
50
|
-
FileUtils.remove_entry_secure(@repository_dir)
|
51
|
-
ensure
|
52
|
-
@repository_dir = nil
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
37
|
+
module ClassMethods
|
56
38
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
@parent_path = old_parent_path
|
39
|
+
def when_the_chef_server(desc, *tags, &block)
|
40
|
+
context("when the chef server #{desc}", *tags) do
|
41
|
+
#include ChefZero::RSpec::Fixtures
|
42
|
+
include_context "With chef-zero running"
|
43
|
+
module_eval(&block)
|
63
44
|
end
|
45
|
+
end
|
64
46
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
File.open(filename, 'w') do |file|
|
70
|
-
raw = case contents
|
71
|
-
when Hash
|
72
|
-
JSON.pretty_generate(contents)
|
73
|
-
when Array
|
74
|
-
contents.join("\n")
|
75
|
-
else
|
76
|
-
contents
|
77
|
-
end
|
78
|
-
file.write(raw)
|
79
|
-
end
|
47
|
+
def when_the_repository(desc, *tags, &block)
|
48
|
+
context("when the chef repo #{desc}", *tags) do
|
49
|
+
include_context "with a chef repo"
|
50
|
+
module_eval(&block)
|
80
51
|
end
|
52
|
+
end
|
81
53
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
dest_filename = path_to(relative_dest)
|
87
|
-
File.symlink(dest_filename, filename)
|
54
|
+
def with_versioned_cookbooks(&block)
|
55
|
+
context("with versioned cookbooks") do
|
56
|
+
include_context "with versioned cookbooks"
|
57
|
+
module_eval(&block)
|
88
58
|
end
|
59
|
+
end
|
60
|
+
end
|
89
61
|
|
90
|
-
|
91
|
-
|
92
|
-
|
62
|
+
def self.included(includer_class)
|
63
|
+
includer_class.extend(ClassMethods)
|
64
|
+
end
|
93
65
|
|
94
|
-
|
95
|
-
|
96
|
-
|
66
|
+
def directory(relative_path, &block)
|
67
|
+
old_parent_path = @parent_path
|
68
|
+
@parent_path = path_to(relative_path)
|
69
|
+
FileUtils.mkdir_p(@parent_path)
|
70
|
+
instance_eval(&block) if block
|
71
|
+
@parent_path = old_parent_path
|
72
|
+
end
|
97
73
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
74
|
+
def file(relative_path, contents)
|
75
|
+
filename = path_to(relative_path)
|
76
|
+
dir = File.dirname(filename)
|
77
|
+
FileUtils.mkdir_p(dir) unless dir == '.'
|
78
|
+
File.open(filename, 'w') do |file|
|
79
|
+
raw = case contents
|
80
|
+
when Hash
|
81
|
+
JSON.pretty_generate(contents)
|
82
|
+
when Array
|
83
|
+
contents.join("\n")
|
84
|
+
else
|
85
|
+
contents
|
86
|
+
end
|
87
|
+
file.write(raw)
|
88
|
+
end
|
89
|
+
end
|
103
90
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
91
|
+
def symlink(relative_path, relative_dest)
|
92
|
+
filename = path_to(relative_path)
|
93
|
+
dir = File.dirname(filename)
|
94
|
+
FileUtils.mkdir_p(dir) unless dir == '.'
|
95
|
+
dest_filename = path_to(relative_dest)
|
96
|
+
File.symlink(dest_filename, filename)
|
97
|
+
end
|
109
98
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
99
|
+
def path_to(relative_path)
|
100
|
+
File.expand_path(relative_path, (@parent_path || @repository_dir))
|
101
|
+
end
|
102
|
+
|
103
|
+
def cb_metadata(name, version, extra_text="")
|
104
|
+
"name '#{name}'; version '#{version}'#{extra_text}"
|
105
|
+
end
|
106
|
+
|
107
|
+
def cwd(relative_path)
|
108
|
+
@old_cwd = Dir.pwd
|
109
|
+
Dir.chdir(path_to(relative_path))
|
110
|
+
end
|
111
|
+
|
112
|
+
RSpec.shared_context "with a chef repo" do
|
113
|
+
before :each do
|
114
|
+
raise "Can only create one directory per test" if @repository_dir
|
115
|
+
@repository_dir = Dir.mktmpdir('chef_repo')
|
116
|
+
Chef::Config.chef_repo_path = @repository_dir
|
117
|
+
%w(client cookbook data_bag environment node role user).each do |object_name|
|
118
|
+
Chef::Config.delete("#{object_name}_path".to_sym)
|
114
119
|
end
|
120
|
+
end
|
115
121
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
122
|
+
after :each do
|
123
|
+
if @repository_dir
|
124
|
+
begin
|
125
|
+
%w(client cookbook data_bag environment node role user).each do |object_name|
|
126
|
+
Chef::Config.delete("#{object_name}_path".to_sym)
|
127
|
+
end
|
128
|
+
Chef::Config.delete(:chef_repo_path)
|
129
|
+
FileUtils.remove_entry_secure(@repository_dir)
|
130
|
+
ensure
|
131
|
+
@repository_dir = nil
|
123
132
|
end
|
124
133
|
end
|
125
|
-
|
126
|
-
instance_eval(&block)
|
134
|
+
Dir.chdir(@old_cwd) if @old_cwd
|
127
135
|
end
|
136
|
+
|
128
137
|
end
|
129
138
|
|
130
139
|
# Versioned cookbooks
|
131
140
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
before(:each) { Chef::Config[:versioned_cookbooks] = true }
|
136
|
-
after(:each) { Chef::Config.delete(:versioned_cookbooks) }
|
137
|
-
instance_eval(&block)
|
138
|
-
end
|
141
|
+
RSpec.shared_context 'with versioned cookbooks', :versioned_cookbooks => true do
|
142
|
+
before(:each) { Chef::Config[:versioned_cookbooks] = true }
|
143
|
+
after(:each) { Chef::Config.delete(:versioned_cookbooks) }
|
139
144
|
end
|
140
145
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
before(:each) { Chef::Config[:versioned_cookbooks] = false }
|
146
|
-
after(:each) { Chef::Config.delete(:versioned_cookbooks) }
|
147
|
-
instance_eval(&block)
|
148
|
-
end
|
146
|
+
RSpec.shared_context "without versioned cookbooks", :versioned_cookbooks => false do
|
147
|
+
# Just make sure this goes back to default
|
148
|
+
before(:each) { Chef::Config[:versioned_cookbooks] = false }
|
149
|
+
after(:each) { Chef::Config.delete(:versioned_cookbooks) }
|
149
150
|
end
|
151
|
+
|
150
152
|
end
|