chef 11.10.0.alpha.1 → 11.10.0.rc.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +57 -36
- data/distro/common/html/chef-client.8.html +4 -4
- data/distro/common/html/chef-expander.8.html +4 -4
- data/distro/common/html/chef-expanderctl.8.html +4 -4
- data/distro/common/html/chef-server-webui.8.html +4 -4
- data/distro/common/html/chef-server.8.html +4 -4
- data/distro/common/html/chef-shell.1.html +4 -4
- data/distro/common/html/chef-solo.8.html +4 -4
- data/distro/common/html/chef-solr.8.html +5 -5
- data/distro/common/html/knife-bootstrap.1.html +4 -4
- data/distro/common/html/knife-client.1.html +4 -4
- data/distro/common/html/knife-configure.1.html +4 -4
- data/distro/common/html/knife-cookbook-site.1.html +4 -4
- data/distro/common/html/knife-cookbook.1.html +4 -4
- data/distro/common/html/knife-data-bag.1.html +4 -4
- data/distro/common/html/knife-environment.1.html +4 -4
- data/distro/common/html/knife-exec.1.html +4 -4
- data/distro/common/html/knife-index.1.html +4 -4
- data/distro/common/html/knife-node.1.html +4 -4
- data/distro/common/html/knife-role.1.html +4 -4
- data/distro/common/html/knife-search.1.html +4 -4
- data/distro/common/html/knife-ssh.1.html +4 -4
- data/distro/common/html/knife-status.1.html +4 -4
- data/distro/common/html/knife-tag.1.html +4 -4
- data/distro/common/html/knife.1.html +4 -4
- data/distro/common/man/man1/knife-bootstrap.1 +58 -64
- data/distro/common/man/man1/knife-client.1 +19 -22
- data/distro/common/man/man1/knife-configure.1 +37 -46
- data/distro/common/man/man1/knife-cookbook-site.1 +14 -17
- data/distro/common/man/man1/knife-cookbook.1 +15 -18
- data/distro/common/man/man1/knife-data-bag.1 +14 -17
- data/distro/common/man/man1/knife-delete.1 +38 -47
- data/distro/common/man/man1/knife-deps.1 +39 -48
- data/distro/common/man/man1/knife-diff.1 +43 -52
- data/distro/common/man/man1/knife-download.1 +47 -53
- data/distro/common/man/man1/knife-edit.1 +32 -41
- data/distro/common/man/man1/knife-environment.1 +14 -17
- data/distro/common/man/man1/knife-exec.1 +52 -61
- data/distro/common/man/man1/knife-index-rebuild.1 +1 -61
- data/distro/common/man/man1/knife-list.1 +47 -59
- data/distro/common/man/man1/knife-node.1 +15 -18
- data/distro/common/man/man1/knife-raw.1 +28 -46
- data/distro/common/man/man1/knife-recipe-list.1 +1 -61
- data/distro/common/man/man1/knife-role.1 +19 -25
- data/distro/common/man/man1/knife-search.1 +53 -62
- data/distro/common/man/man1/knife-show.1 +36 -28
- data/distro/common/man/man1/knife-ssh.1 +55 -61
- data/distro/common/man/man1/knife-status.1 +34 -43
- data/distro/common/man/man1/knife-tag.1 +14 -17
- data/distro/common/man/man1/knife-upload.1 +47 -56
- data/distro/common/man/man1/knife-user.1 +17 -20
- data/distro/common/man/man1/knife-xargs.1 +60 -69
- data/lib/chef/application.rb +3 -1
- data/lib/chef/application/windows_service.rb +0 -1
- data/lib/chef/client.rb +41 -152
- data/lib/chef/config.rb +19 -23
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/exceptions.rb +8 -0
- data/lib/chef/formatters/doc.rb +15 -0
- data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +2 -1
- data/lib/chef/http.rb +18 -8
- data/lib/chef/http/authenticator.rb +4 -0
- data/lib/chef/http/cookie_manager.rb +3 -0
- data/lib/chef/http/decompressor.rb +4 -0
- data/lib/chef/http/json_input.rb +4 -0
- data/lib/chef/http/json_output.rb +4 -0
- data/lib/chef/http/validate_content_length.rb +94 -0
- data/lib/chef/knife.rb +0 -1
- data/lib/chef/knife/configure.rb +6 -6
- data/lib/chef/knife/cookbook_create.rb +2 -2
- data/lib/chef/knife/core/subcommand_loader.rb +49 -3
- data/lib/chef/knife/ssh.rb +34 -4
- data/lib/chef/mixin/path_sanity.rb +1 -0
- data/lib/chef/monologger.rb +1 -2
- data/lib/chef/node.rb +7 -0
- data/lib/chef/policy_builder.rb +49 -0
- data/lib/chef/policy_builder/expand_node_object.rb +230 -0
- data/lib/chef/policy_builder/policyfile.rb +338 -0
- data/lib/chef/provider/file.rb +15 -5
- data/lib/chef/provider/group.rb +6 -2
- data/lib/chef/provider/group/windows.rb +12 -2
- data/lib/chef/provider/http_request.rb +3 -2
- data/lib/chef/provider/package.rb +1 -0
- data/lib/chef/provider/package/aix.rb +1 -1
- data/lib/chef/provider/service/debian.rb +7 -2
- data/lib/chef/resource/file.rb +8 -1
- data/lib/chef/resource/package.rb +9 -0
- data/lib/chef/resource/service.rb +0 -1
- data/lib/chef/rest.rb +2 -0
- data/lib/chef/run_context.rb +1 -1
- data/lib/chef/util/file_edit.rb +1 -1
- data/lib/chef/util/windows/net_group.rb +7 -6
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/version.rb +31 -18
- data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -0
- data/spec/functional/resource/file_spec.rb +0 -1
- data/spec/functional/resource/group_spec.rb +96 -16
- data/spec/functional/resource/package_spec.rb +17 -0
- data/spec/functional/resource/user_spec.rb +2 -2
- data/spec/functional/win32/versions_spec.rb +39 -0
- data/spec/integration/client/client_spec.rb +27 -28
- data/spec/spec_helper.rb +2 -0
- data/spec/support/platform_helpers.rb +7 -1
- data/spec/support/shared/functional/file_resource.rb +83 -43
- data/spec/unit/application_spec.rb +7 -5
- data/spec/unit/client_spec.rb +10 -3
- data/spec/unit/config_spec.rb +0 -30
- data/spec/unit/cookbook_spec.rb +1 -0
- data/spec/unit/data_bag_item_spec.rb +8 -0
- data/spec/unit/data_bag_spec.rb +6 -0
- data/spec/unit/http_spec.rb +48 -0
- data/spec/unit/knife/core/subcommand_loader_spec.rb +77 -1
- data/spec/unit/knife/ssh_spec.rb +107 -0
- data/spec/unit/mixin/path_sanity_spec.rb +6 -0
- data/spec/unit/mixin/securable_spec.rb +77 -3
- data/spec/unit/monologger_spec.rb +45 -0
- data/spec/unit/node_spec.rb +16 -0
- data/spec/unit/policy_builder/expand_node_object_spec.rb +320 -0
- data/spec/unit/policy_builder/policyfile_spec.rb +399 -0
- data/spec/unit/policy_builder_spec.rb +26 -0
- data/spec/unit/provider/deploy_spec.rb +3 -0
- data/spec/unit/provider/group/windows_spec.rb +1 -0
- data/spec/unit/provider/http_request_spec.rb +23 -1
- data/spec/unit/provider/service/debian_service_spec.rb +50 -19
- data/spec/unit/recipe_spec.rb +4 -0
- data/spec/unit/resource/package_spec.rb +5 -0
- data/spec/unit/rest_spec.rb +375 -278
- data/spec/unit/run_context_spec.rb +4 -0
- metadata +96 -59
- checksums.yaml +0 -7
@@ -273,6 +273,23 @@ describe Chef::Resource::Package, metadata do
|
|
273
273
|
package_resource.should be_updated_by_last_action
|
274
274
|
end
|
275
275
|
|
276
|
+
context "with variables" do
|
277
|
+
let(:package_resource) do
|
278
|
+
r = base_resource
|
279
|
+
r.cookbook_name = "preseed"
|
280
|
+
r.response_file("preseed-template-variables.seed")
|
281
|
+
r.response_file_variables({ :template_variable => 'SUPPORTS VARIABLES' })
|
282
|
+
r
|
283
|
+
end
|
284
|
+
|
285
|
+
it "preseeds the package, then installs it" do
|
286
|
+
package_resource.run_action(:install)
|
287
|
+
cmd = shell_out!("debconf-show chef-integration-test")
|
288
|
+
cmd.stdout.should include('chef-integration-test/sample-var: "SUPPORTS VARIABLES"')
|
289
|
+
package_resource.should be_updated_by_last_action
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
276
293
|
end
|
277
294
|
end # installing w/ preseed
|
278
295
|
end # when package not installed
|
@@ -196,7 +196,7 @@ describe Chef::Resource::User, metadata do
|
|
196
196
|
pw_entry.home.should == "/home/#{username}"
|
197
197
|
end
|
198
198
|
|
199
|
-
if OHAI_SYSTEM["platform_family"]
|
199
|
+
if %w{rhel fedora}.include?(OHAI_SYSTEM["platform_family"])
|
200
200
|
# Inconsistent behavior. See: CHEF-2205
|
201
201
|
it "creates the home dir when not explicitly asked to on RHEL (XXX)" do
|
202
202
|
File.should exist("/home/#{username}")
|
@@ -340,7 +340,7 @@ describe Chef::Resource::User, metadata do
|
|
340
340
|
let(:existing_manage_home) { false }
|
341
341
|
let(:manage_home) { true }
|
342
342
|
|
343
|
-
if OHAI_SYSTEM["platform_family"]
|
343
|
+
if %w{rhel fedora}.include?(OHAI_SYSTEM["platform_family"])
|
344
344
|
# Inconsistent behavior. See: CHEF-2205
|
345
345
|
it "created the home dir b/c of CHEF-2205 so it still exists" do
|
346
346
|
# This behavior seems contrary to expectation and non-convergent.
|
@@ -50,6 +50,45 @@ describe "Chef::ReservedNames::Win32::Version", :windows_only do
|
|
50
50
|
@version = Chef::ReservedNames::Win32::Version.new
|
51
51
|
end
|
52
52
|
|
53
|
+
def for_each_windows_version(&block)
|
54
|
+
@version.methods.each do |method_name|
|
55
|
+
if Chef::ReservedNames::Win32::Version::WIN_VERSIONS.keys.find { | key | method_name.to_s == Chef::ReservedNames::Win32::Version.send(:method_name_from_marketing_name,key) }
|
56
|
+
yield method_name
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "Win32 version object" do
|
62
|
+
it "should have have one method for each marketing version" do
|
63
|
+
versions = 0
|
64
|
+
for_each_windows_version { versions += 1 }
|
65
|
+
versions.should > 0
|
66
|
+
versions.should == Chef::ReservedNames::Win32::Version::WIN_VERSIONS.length
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should only contain version methods with legal method names" do
|
70
|
+
method_name_pattern = /[a-z]+([a-z]|[0-9]|_)*\?{0,1}/
|
71
|
+
|
72
|
+
for_each_windows_version do |method_name|
|
73
|
+
method_match = method_name_pattern.match(method_name.to_s)
|
74
|
+
method_match.should_not be_nil
|
75
|
+
method_name.to_s.should == method_match[0]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should have exactly one method that returns true" do
|
80
|
+
true_versions = 0
|
81
|
+
for_each_windows_version do |method_name|
|
82
|
+
true_versions += 1 if @version.send(method_name)
|
83
|
+
end
|
84
|
+
true_versions.should == 1
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should successfully execute all version methods" do
|
88
|
+
for_each_windows_version { |method_name| @version.send(method_name.to_sym) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
53
92
|
context "Windows Operating System version" do
|
54
93
|
it "should match the version from WMI" do
|
55
94
|
@current_os_version.should include(@version.marketing_name)
|
@@ -5,6 +5,19 @@ describe "chef-client" do
|
|
5
5
|
extend IntegrationSupport
|
6
6
|
include Chef::Mixin::ShellOut
|
7
7
|
|
8
|
+
let(:chef_dir) { File.join(File.dirname(__FILE__), "..", "..", "..", "bin") }
|
9
|
+
|
10
|
+
# Invoke `chef-client` as `ruby PATH/TO/chef-client`. This ensures the
|
11
|
+
# following constraints are satisfied:
|
12
|
+
# * Windows: windows can only run batch scripts as bare executables. Rubygems
|
13
|
+
# creates batch wrappers for installed gems, but we don't have batch wrappers
|
14
|
+
# in the source tree.
|
15
|
+
# * Other `chef-client` in PATH: A common case is running the tests on a
|
16
|
+
# machine that has omnibus chef installed. In that case we need to ensure
|
17
|
+
# we're running `chef-client` from the source tree and not the external one.
|
18
|
+
# cf. CHEF-4914
|
19
|
+
let(:chef_client) { "ruby #{chef_dir}/chef-client" }
|
20
|
+
|
8
21
|
when_the_repository "has a cookbook with a no-op recipe" do
|
9
22
|
file 'cookbooks/x/recipes/default.rb', ''
|
10
23
|
|
@@ -14,27 +27,23 @@ local_mode true
|
|
14
27
|
cookbook_path "#{path_to('cookbooks')}"
|
15
28
|
EOM
|
16
29
|
|
17
|
-
|
18
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" -o 'x::default'", :cwd => chef_dir)
|
30
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o 'x::default'", :cwd => chef_dir)
|
19
31
|
result.error!
|
20
32
|
end
|
21
33
|
|
22
34
|
context 'and no config file' do
|
23
35
|
it 'should complete with success when cwd is just above cookbooks and paths are not specified' do
|
24
|
-
|
25
|
-
result = shell_out("ruby #{chef_dir}/chef-client -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => path_to(''))
|
36
|
+
result = shell_out("#{chef_client} -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => path_to(''))
|
26
37
|
result.error!
|
27
38
|
end
|
28
39
|
|
29
40
|
it 'should complete with success when cwd is below cookbooks and paths are not specified' do
|
30
|
-
|
31
|
-
result = shell_out("ruby #{chef_dir}/chef-client -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => path_to('cookbooks/x'))
|
41
|
+
result = shell_out("#{chef_client} -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => path_to('cookbooks/x'))
|
32
42
|
result.error!
|
33
43
|
end
|
34
44
|
|
35
45
|
it 'should fail when cwd is below high above and paths are not specified' do
|
36
|
-
|
37
|
-
result = shell_out("ruby #{chef_dir}/chef-client -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => File.expand_path('..', path_to('')))
|
46
|
+
result = shell_out("#{chef_client} -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => File.expand_path('..', path_to('')))
|
38
47
|
result.exitstatus.should == 1
|
39
48
|
end
|
40
49
|
end
|
@@ -43,15 +52,13 @@ EOM
|
|
43
52
|
file '.chef/knife.rb', 'xxx.xxx'
|
44
53
|
|
45
54
|
it 'should load .chef/knife.rb when -z is specified' do
|
46
|
-
|
47
|
-
result = shell_out("ruby #{chef_dir}/chef-client -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => path_to(''))
|
55
|
+
result = shell_out("#{chef_client} -z -o 'x::default' --config-file-jail \"#{path_to('')}\"", :cwd => path_to(''))
|
48
56
|
# FATAL: Configuration error NoMethodError: undefined method `xxx' for nil:NilClass
|
49
57
|
result.stdout.should include("xxx")
|
50
58
|
end
|
51
59
|
|
52
60
|
it 'fails to load .chef/knife.rb when -z is specified and --config-file-jail does not include the .chef/knife.rb' do
|
53
|
-
|
54
|
-
result = shell_out("ruby #{chef_dir}/chef-client -z -o 'x::default' --config-file-jail \"#{path_to('roles')}\"", :cwd => path_to(''))
|
61
|
+
result = shell_out("#{chef_client} -z -o 'x::default' --config-file-jail \"#{path_to('roles')}\"", :cwd => path_to(''))
|
55
62
|
result.error!
|
56
63
|
end
|
57
64
|
end
|
@@ -62,8 +69,7 @@ local_mode true
|
|
62
69
|
cookbook_path "#{path_to('cookbooks')}"
|
63
70
|
EOM
|
64
71
|
|
65
|
-
|
66
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" -o 'x::default'", :cwd => chef_dir)
|
72
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o 'x::default'", :cwd => chef_dir)
|
67
73
|
result.error!
|
68
74
|
end
|
69
75
|
|
@@ -105,8 +111,7 @@ client_key #{path_to('mykey.pem').inspect}
|
|
105
111
|
cookbook_path #{path_to('cookbooks').inspect}
|
106
112
|
EOM
|
107
113
|
|
108
|
-
|
109
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" -o 'x::default'", :cwd => chef_dir)
|
114
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o 'x::default'", :cwd => chef_dir)
|
110
115
|
result.error!
|
111
116
|
end
|
112
117
|
|
@@ -129,8 +134,7 @@ file #{path_to('tempfile2.txt').inspect} do
|
|
129
134
|
end
|
130
135
|
EOM
|
131
136
|
|
132
|
-
|
133
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" #{path_to('arbitrary.rb')} #{path_to('arbitrary2.rb')}", :cwd => chef_dir)
|
137
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" #{path_to('arbitrary.rb')} #{path_to('arbitrary2.rb')}", :cwd => chef_dir)
|
134
138
|
result.error!
|
135
139
|
|
136
140
|
IO.read(path_to('tempfile.txt')).should == '1'
|
@@ -150,8 +154,7 @@ file #{path_to('tempfile.txt').inspect} do
|
|
150
154
|
end
|
151
155
|
EOM
|
152
156
|
|
153
|
-
|
154
|
-
result = shell_out("#{chef_dir}/chef-client -c \"#{path_to('config/client.rb')}\" arbitrary.rb", :cwd => path_to(''))
|
157
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" arbitrary.rb", :cwd => path_to(''))
|
155
158
|
result.error!
|
156
159
|
|
157
160
|
IO.read(path_to('tempfile.txt')).should == '1'
|
@@ -175,8 +178,7 @@ file #{path_to('tempfile.txt').inspect} do
|
|
175
178
|
end
|
176
179
|
EOM
|
177
180
|
|
178
|
-
|
179
|
-
result = shell_out("#{chef_dir}/chef-client -c \"#{path_to('config/client.rb')}\" -o x::constant_definition arbitrary.rb", :cwd => path_to(''))
|
181
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o x::constant_definition arbitrary.rb", :cwd => path_to(''))
|
180
182
|
result.error!
|
181
183
|
|
182
184
|
IO.read(path_to('tempfile.txt')).should == '1'
|
@@ -190,8 +192,7 @@ chef_server_url 'http://omg.com/blah'
|
|
190
192
|
cookbook_path "#{path_to('cookbooks')}"
|
191
193
|
EOM
|
192
194
|
|
193
|
-
|
194
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" -o 'x::default' -z", :cwd => chef_dir)
|
195
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o 'x::default' -z", :cwd => chef_dir)
|
195
196
|
result.error!
|
196
197
|
end
|
197
198
|
|
@@ -201,8 +202,7 @@ chef_server_url 'http://omg.com/blah'
|
|
201
202
|
cookbook_path "#{path_to('cookbooks')}"
|
202
203
|
EOM
|
203
204
|
|
204
|
-
|
205
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" -o 'x::default' --local-mode", :cwd => chef_dir)
|
205
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o 'x::default' --local-mode", :cwd => chef_dir)
|
206
206
|
result.error!
|
207
207
|
end
|
208
208
|
|
@@ -212,8 +212,7 @@ chef_server_url 'http://omg.com/blah'
|
|
212
212
|
cookbook_path "#{path_to('cookbooks')}"
|
213
213
|
EOM
|
214
214
|
|
215
|
-
|
216
|
-
result = shell_out("chef-client -c \"#{path_to('config/client.rb')}\" -o 'x::default' -z", :cwd => chef_dir)
|
215
|
+
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" -o 'x::default' -z", :cwd => chef_dir)
|
217
216
|
result.error!
|
218
217
|
end
|
219
218
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -33,6 +33,7 @@ end
|
|
33
33
|
# Ruby 1.9 Compat
|
34
34
|
$:.unshift File.expand_path("../..", __FILE__)
|
35
35
|
|
36
|
+
|
36
37
|
require 'rubygems'
|
37
38
|
require 'rspec/mocks'
|
38
39
|
|
@@ -108,6 +109,7 @@ RSpec.configure do |config|
|
|
108
109
|
config.filter_run_excluding :win2k3_only => true unless windows_win2k3?
|
109
110
|
config.filter_run_excluding :windows64_only => true unless windows64?
|
110
111
|
config.filter_run_excluding :windows32_only => true unless windows32?
|
112
|
+
config.filter_run_excluding :windows_domain_joined_only => true unless windows_domain_joined?
|
111
113
|
config.filter_run_excluding :solaris_only => true unless solaris?
|
112
114
|
config.filter_run_excluding :system_windows_service_gem_only => true unless system_windows_service_gem?
|
113
115
|
config.filter_run_excluding :unix_only => true unless unix?
|
@@ -27,9 +27,15 @@ def windows?
|
|
27
27
|
!!(RUBY_PLATFORM =~ /mswin|mingw|windows/)
|
28
28
|
end
|
29
29
|
|
30
|
+
require 'ruby-wmi' if windows?
|
31
|
+
|
32
|
+
def windows_domain_joined?
|
33
|
+
return false unless windows?
|
34
|
+
WMI::Win32_ComputerSystem.find(:first).PartOfDomain
|
35
|
+
end
|
36
|
+
|
30
37
|
def windows_win2k3?
|
31
38
|
return false unless windows?
|
32
|
-
require 'ruby-wmi'
|
33
39
|
|
34
40
|
host = WMI::Win32_OperatingSystem.find(:first)
|
35
41
|
(host.version && host.version.start_with?("5.2"))
|
@@ -16,6 +16,8 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
+
require 'pry'
|
20
|
+
|
19
21
|
shared_context "deploying with move" do
|
20
22
|
before do
|
21
23
|
Chef::Config[:file_backup_path] = CHEF_SPEC_BACKUP_PATH
|
@@ -54,25 +56,62 @@ shared_examples_for "a file with the wrong content" do
|
|
54
56
|
sha256_checksum(path).should == @expected_checksum
|
55
57
|
end
|
56
58
|
|
57
|
-
|
59
|
+
describe "when diff is disabled" do
|
58
60
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
include_context "diff disabled"
|
62
|
+
|
63
|
+
context "when running action :create" do
|
64
|
+
context "with backups enabled" do
|
65
|
+
before do
|
66
|
+
resource.run_action(:create)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "overwrites the file with the updated content when the :create action is run" do
|
70
|
+
File.stat(path).mtime.should > @expected_mtime
|
71
|
+
sha256_checksum(path).should_not == @expected_checksum
|
72
|
+
end
|
73
|
+
|
74
|
+
it "backs up the existing file" do
|
75
|
+
Dir.glob(backup_glob).size.should equal(1)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "is marked as updated by last action" do
|
79
|
+
resource.should be_updated_by_last_action
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should restore the security contexts on selinux", :selinux_only do
|
83
|
+
selinux_security_context_restored?(path).should be_true
|
84
|
+
end
|
63
85
|
end
|
64
86
|
|
65
|
-
|
66
|
-
|
67
|
-
|
87
|
+
context "with backups disabled" do
|
88
|
+
before do
|
89
|
+
resource.backup(0)
|
90
|
+
resource.run_action(:create)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should not attempt to backup the existing file if :backup == 0" do
|
94
|
+
Dir.glob(backup_glob).size.should equal(0)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should restore the security contexts on selinux", :selinux_only do
|
98
|
+
selinux_security_context_restored?(path).should be_true
|
99
|
+
end
|
68
100
|
end
|
101
|
+
end
|
69
102
|
|
70
|
-
|
71
|
-
|
103
|
+
describe "when running action :create_if_missing" do
|
104
|
+
before do
|
105
|
+
resource.run_action(:create_if_missing)
|
72
106
|
end
|
73
107
|
|
74
|
-
it "
|
75
|
-
|
108
|
+
it "doesn't overwrite the file when the :create_if_missing action is run" do
|
109
|
+
File.stat(path).mtime.should == @expected_mtime
|
110
|
+
sha256_checksum(path).should == @expected_checksum
|
111
|
+
end
|
112
|
+
|
113
|
+
it "is not marked as updated" do
|
114
|
+
resource.should_not be_updated_by_last_action
|
76
115
|
end
|
77
116
|
|
78
117
|
it "should restore the security contexts on selinux", :selinux_only do
|
@@ -80,52 +119,53 @@ shared_examples_for "a file with the wrong content" do
|
|
80
119
|
end
|
81
120
|
end
|
82
121
|
|
83
|
-
|
122
|
+
describe "when running action :delete" do
|
84
123
|
before do
|
85
|
-
resource.
|
86
|
-
resource.run_action(:create)
|
124
|
+
resource.run_action(:delete)
|
87
125
|
end
|
88
126
|
|
89
|
-
it "
|
90
|
-
|
127
|
+
it "deletes the file" do
|
128
|
+
File.should_not exist(path)
|
91
129
|
end
|
92
130
|
|
93
|
-
it "
|
94
|
-
|
131
|
+
it "is marked as updated by last action" do
|
132
|
+
resource.should be_updated_by_last_action
|
95
133
|
end
|
96
134
|
end
|
135
|
+
|
97
136
|
end
|
98
137
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
138
|
+
context "when diff is enabled" do
|
139
|
+
describe 'sensitive attribute' do
|
140
|
+
context "should be insensitive by default" do
|
141
|
+
it { expect(resource.sensitive).to(be_false) }
|
142
|
+
end
|
103
143
|
|
104
|
-
|
105
|
-
|
106
|
-
sha256_checksum(path).should == @expected_checksum
|
107
|
-
end
|
144
|
+
context "when set" do
|
145
|
+
before { resource.sensitive(true) }
|
108
146
|
|
109
|
-
|
110
|
-
|
111
|
-
|
147
|
+
it "should be set on the resource" do
|
148
|
+
expect(resource.sensitive).to(be_true)
|
149
|
+
end
|
112
150
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
end
|
151
|
+
context "when running :create action" do
|
152
|
+
let(:provider) { resource.provider_for_action(:create) }
|
153
|
+
let(:reporter_messages) { provider.instance_variable_get("@converge_actions").actions[0][0] }
|
117
154
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
end
|
155
|
+
before do
|
156
|
+
provider.run_action
|
157
|
+
end
|
122
158
|
|
123
|
-
|
124
|
-
|
125
|
-
|
159
|
+
it "should suppress the diff" do
|
160
|
+
expect(resource.diff).to(include('suppressed sensitive resource'))
|
161
|
+
expect(reporter_messages[1]).to eq("suppressed sensitive resource")
|
162
|
+
end
|
126
163
|
|
127
|
-
|
128
|
-
|
164
|
+
it "should still include the updated checksums" do
|
165
|
+
expect(reporter_messages[0]).to include("update content in file")
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
129
169
|
end
|
130
170
|
end
|
131
171
|
end
|
@@ -163,6 +163,13 @@ describe Chef::Application do
|
|
163
163
|
@app.configure_logging
|
164
164
|
end
|
165
165
|
|
166
|
+
it "should raise fatals if log location is invalid" do
|
167
|
+
Chef::Config[:log_location] = "/tmp/non-existing-dir/logfile"
|
168
|
+
Chef::Log.should_receive(:fatal).at_least(:once)
|
169
|
+
Process.should_receive(:exit)
|
170
|
+
@app.configure_logging
|
171
|
+
end
|
172
|
+
|
166
173
|
shared_examples_for "log_level_is_auto" do
|
167
174
|
context "when STDOUT is to a tty" do
|
168
175
|
before do
|
@@ -306,11 +313,6 @@ describe Chef::Application do
|
|
306
313
|
@config_file.unlink
|
307
314
|
end
|
308
315
|
|
309
|
-
it "should raise informative fatals for missing log file dir" do
|
310
|
-
create_config_file('log_location "/tmp/non-existing-dir/logfile"')
|
311
|
-
raises_informative_fatals_on_configure_chef
|
312
|
-
end
|
313
|
-
|
314
316
|
it "should raise informative fatals for badly written config" do
|
315
317
|
create_config_file("text that should break the config parsing")
|
316
318
|
raises_informative_fatals_on_configure_chef
|