chef 11.12.0.alpha.1 → 11.12.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chef/api_client/registration.rb +46 -9
- data/lib/chef/application.rb +1 -0
- data/lib/chef/application/client.rb +25 -24
- data/lib/chef/client.rb +34 -0
- data/lib/chef/config.rb +11 -0
- data/lib/chef/cookbook/chefignore.rb +10 -2
- data/lib/chef/cookbook/metadata.rb +31 -3
- data/lib/chef/cookbook/synchronizer.rb +2 -2
- data/lib/chef/cookbook/syntax_check.rb +4 -4
- data/lib/chef/encrypted_data_bag_item.rb +37 -1
- data/lib/chef/exceptions.rb +1 -0
- data/lib/chef/guard_interpreter/default_guard_interpreter.rb +42 -0
- data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +122 -0
- data/lib/chef/http.rb +0 -1
- data/lib/chef/http/decompressor.rb +7 -4
- data/lib/chef/http/simple.rb +5 -0
- data/lib/chef/http/validate_content_length.rb +28 -12
- data/lib/chef/knife.rb +1 -0
- data/lib/chef/knife/client_bulk_delete.rb +48 -9
- data/lib/chef/knife/client_delete.rb +4 -4
- data/lib/chef/knife/cookbook_bulk_delete.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +17 -7
- data/lib/chef/knife/core/bootstrap_context.rb +1 -1
- data/lib/chef/knife/core/ui.rb +42 -5
- data/lib/chef/knife/node_run_list_add.rb +31 -2
- data/lib/chef/knife/ssh.rb +44 -31
- data/lib/chef/knife/ssl_check.rb +213 -0
- data/lib/chef/knife/ssl_fetch.rb +145 -0
- data/lib/chef/mixin/deep_merge.rb +13 -5
- data/lib/chef/mixin/shell_out.rb +9 -3
- data/lib/chef/node.rb +23 -4
- data/lib/chef/node/immutable_collections.rb +32 -0
- data/lib/chef/platform/provider_mapping.rb +21 -18
- data/lib/chef/platform/query_helpers.rb +10 -2
- data/lib/chef/policy_builder/expand_node_object.rb +3 -6
- data/lib/chef/provider/cron.rb +25 -3
- data/lib/chef/provider/mount/mount.rb +1 -1
- data/lib/chef/provider/package/dpkg.rb +2 -1
- data/lib/chef/provider/package/windows.rb +80 -0
- data/lib/chef/provider/package/windows/msi.rb +69 -0
- data/lib/chef/provider/powershell_script.rb +19 -6
- data/lib/chef/provider/service/solaris.rb +11 -7
- data/lib/chef/resource.rb +18 -5
- data/lib/chef/resource/conditional.rb +20 -7
- data/lib/chef/resource/cron.rb +18 -2
- data/lib/chef/resource/execute.rb +0 -2
- data/lib/chef/resource/powershell_script.rb +23 -1
- data/lib/chef/resource/script.rb +25 -0
- data/lib/chef/resource/subversion.rb +4 -0
- data/lib/chef/resource/windows_package.rb +79 -0
- data/lib/chef/resource/windows_script.rb +0 -5
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/rest.rb +6 -1
- data/lib/chef/run_context.rb +22 -2
- data/lib/chef/run_context/cookbook_compiler.rb +12 -0
- data/lib/chef/util/editor.rb +92 -0
- data/lib/chef/util/file_edit.rb +22 -54
- data/lib/chef/version.rb +2 -2
- data/lib/chef/win32/api/installer.rb +166 -0
- data/lib/chef/win32/version.rb +8 -0
- data/spec/data/standalone_cookbook/Gemfile +1 -0
- data/spec/data/standalone_cookbook/chefignore +9 -0
- data/spec/data/standalone_cookbook/recipes/default.rb +3 -0
- data/spec/data/standalone_cookbook/vendor/bundle/ruby/2.0.0/gems/multi_json-1.9.0/lib/multi_json.rb +1 -0
- data/spec/functional/resource/powershell_spec.rb +262 -1
- data/spec/functional/win32/versions_spec.rb +3 -3
- data/spec/integration/knife/chefignore_spec.rb +1 -2
- data/spec/integration/knife/raw_spec.rb +8 -13
- data/spec/integration/knife/redirection_spec.rb +6 -14
- data/spec/integration/solo/solo_spec.rb +19 -0
- data/spec/support/shared/functional/windows_script.rb +1 -1
- data/spec/support/shared/integration/app_server_support.rb +42 -0
- data/spec/support/shared/integration/integration_helper.rb +1 -0
- data/spec/support/shared/unit/script_resource.rb +38 -0
- data/spec/unit/api_client/registration_spec.rb +109 -38
- data/spec/unit/application/client_spec.rb +48 -1
- data/spec/unit/cookbook/chefignore_spec.rb +10 -0
- data/spec/unit/cookbook/metadata_spec.rb +45 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +28 -0
- data/spec/unit/cookbook_spec.rb +0 -10
- data/spec/unit/guard_interpreter/resource_guard_interpreter_spec.rb +56 -0
- data/spec/unit/http/simple_spec.rb +32 -0
- data/spec/unit/http/validate_content_length_spec.rb +187 -0
- data/spec/unit/knife/bootstrap_spec.rb +13 -4
- data/spec/unit/knife/client_bulk_delete_spec.rb +123 -38
- data/spec/unit/knife/client_delete_spec.rb +4 -4
- data/spec/unit/knife/cookbook_upload_spec.rb +181 -88
- data/spec/unit/knife/core/bootstrap_context_spec.rb +11 -1
- data/spec/unit/knife/core/ui_spec.rb +109 -38
- data/spec/unit/knife/node_run_list_add_spec.rb +24 -1
- data/spec/unit/knife/ssh_spec.rb +17 -6
- data/spec/unit/knife/ssl_check_spec.rb +187 -0
- data/spec/unit/knife/ssl_fetch_spec.rb +151 -0
- data/spec/unit/mixin/deep_merge_spec.rb +17 -0
- data/spec/unit/node/immutable_collections_spec.rb +55 -0
- data/spec/unit/node_spec.rb +9 -0
- data/spec/unit/platform/query_helpers_spec.rb +32 -0
- data/spec/unit/platform_spec.rb +193 -175
- data/spec/unit/policy_builder/expand_node_object_spec.rb +1 -1
- data/spec/unit/provider/cron_spec.rb +175 -1
- data/spec/unit/provider/mount/mount_spec.rb +33 -3
- data/spec/unit/provider/package/dpkg_spec.rb +4 -0
- data/spec/unit/provider/package/windows/msi_spec.rb +60 -0
- data/spec/unit/provider/package/windows_spec.rb +80 -0
- data/spec/unit/provider/service/macosx_spec.rb +3 -3
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +35 -10
- data/spec/unit/pure_application_spec.rb +32 -0
- data/spec/unit/recipe_spec.rb +4 -0
- data/spec/unit/resource/conditional_spec.rb +13 -12
- data/spec/unit/resource/cron_spec.rb +7 -2
- data/spec/unit/resource/powershell_spec.rb +85 -2
- data/spec/unit/resource/subversion_spec.rb +5 -0
- data/spec/unit/resource/windows_package_spec.rb +74 -0
- data/spec/unit/resource_spec.rb +23 -1
- data/spec/unit/rest_spec.rb +15 -0
- data/spec/unit/run_context/cookbook_compiler_spec.rb +12 -0
- data/spec/unit/run_context_spec.rb +7 -0
- data/spec/unit/util/editor_spec.rb +152 -0
- data/spec/unit/util/file_edit_spec.rb +37 -1
- metadata +41 -30
@@ -63,15 +63,15 @@ XML
|
|
63
63
|
Dir.stub(:glob).and_return(["/Users/igor/Library/LaunchAgents/io.redis.redis-server.plist"], [])
|
64
64
|
provider.stub(:shell_out!).
|
65
65
|
with("launchctl list", {:group => 1001, :user => 101}).
|
66
|
-
and_return(
|
66
|
+
and_return(double("Status", :stdout => launchctl_stdout))
|
67
67
|
provider.stub(:shell_out).
|
68
68
|
with(/launchctl list /,
|
69
69
|
{:group => nil, :user => nil}).
|
70
|
-
and_return(
|
70
|
+
and_return(double("Status",
|
71
71
|
:stdout => launchctl_stdout, :exitstatus => 0))
|
72
72
|
provider.stub(:shell_out!).
|
73
73
|
with(/plutil -convert xml1 -o/).
|
74
|
-
and_return(
|
74
|
+
and_return(double("Status", :stdout => plutil_stdout))
|
75
75
|
|
76
76
|
File.stub(:stat).and_return(double("stat", :gid => 1001, :uid => 101))
|
77
77
|
end
|
@@ -54,34 +54,47 @@ describe Chef::Provider::Service::Solaris do
|
|
54
54
|
|
55
55
|
describe "when discovering the current service state" do
|
56
56
|
it "should create a current resource with the name of the new resource" do
|
57
|
-
@provider.stub(:
|
57
|
+
@provider.stub!(:shell_out!).with("/bin/svcs -l chef").and_return(@status)
|
58
58
|
Chef::Resource::Service.should_receive(:new).and_return(@current_resource)
|
59
59
|
@provider.load_current_resource
|
60
60
|
end
|
61
61
|
|
62
62
|
|
63
63
|
it "should return the current resource" do
|
64
|
-
@provider.stub(:
|
64
|
+
@provider.stub!(:shell_out!).with("/bin/svcs -l chef").and_return(@status)
|
65
65
|
@provider.load_current_resource.should eql(@current_resource)
|
66
66
|
end
|
67
67
|
|
68
|
-
it "should
|
69
|
-
@provider.should_receive(:
|
68
|
+
it "should call '/bin/svcs -l service_name'" do
|
69
|
+
@provider.should_receive(:shell_out!).with("/bin/svcs -l chef").and_return(@status)
|
70
70
|
@provider.load_current_resource
|
71
71
|
end
|
72
72
|
|
73
73
|
it "should mark service as not running" do
|
74
|
-
@provider.stub(:
|
74
|
+
@provider.stub!(:shell_out!).and_return(@status)
|
75
75
|
@current_resource.should_receive(:running).with(false)
|
76
76
|
@provider.load_current_resource
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should mark service as running" do
|
80
|
-
@
|
81
|
-
@provider.stub(:
|
80
|
+
@status = mock("Status", :exitstatus => 0, :stdout => 'state online')
|
81
|
+
@provider.stub!(:shell_out!).and_return(@status)
|
82
82
|
@current_resource.should_receive(:running).with(true)
|
83
83
|
@provider.load_current_resource
|
84
84
|
end
|
85
|
+
|
86
|
+
it "should not mark service as maintenance" do
|
87
|
+
@provider.stub!(:shell_out!).and_return(@status)
|
88
|
+
@provider.load_current_resource
|
89
|
+
@provider.maintenance.should be_false
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should mark service as maintenance" do
|
93
|
+
@status = mock("Status", :exitstatus => 0, :stdout => 'state maintenance')
|
94
|
+
@provider.stub!(:shell_out!).and_return(@status)
|
95
|
+
@provider.load_current_resource
|
96
|
+
@provider.maintenance.should be_true
|
97
|
+
end
|
85
98
|
end
|
86
99
|
|
87
100
|
describe "when enabling the service" do
|
@@ -91,19 +104,31 @@ describe Chef::Provider::Service::Solaris do
|
|
91
104
|
end
|
92
105
|
|
93
106
|
it "should call svcadm enable -s chef" do
|
94
|
-
@new_resource.stub(:enable_command).and_return("#{@new_resource.enable_command}")
|
107
|
+
@new_resource.stub!(:enable_command).and_return("#{@new_resource.enable_command}")
|
108
|
+
@provider.should_not_receive(:shell_out!).with("/usr/sbin/svcadm clear #{@current_resource.service_name}")
|
95
109
|
@provider.should_receive(:shell_out!).with("/usr/sbin/svcadm enable -s #{@current_resource.service_name}").and_return(@status)
|
96
|
-
|
110
|
+
@provider.enable_service.should be_true
|
97
111
|
@current_resource.enabled.should be_true
|
98
112
|
end
|
99
113
|
|
100
114
|
it "should call svcadm enable -s chef for start_service" do
|
101
|
-
@new_resource.stub(:start_command).and_return("#{@new_resource.start_command}")
|
115
|
+
@new_resource.stub!(:start_command).and_return("#{@new_resource.start_command}")
|
116
|
+
@provider.should_not_receive(:shell_out!).with("/usr/sbin/svcadm clear #{@current_resource.service_name}")
|
102
117
|
@provider.should_receive(:shell_out!).with("/usr/sbin/svcadm enable -s #{@current_resource.service_name}").and_return(@status)
|
103
118
|
@provider.start_service.should be_true
|
104
119
|
@current_resource.enabled.should be_true
|
105
120
|
end
|
106
121
|
|
122
|
+
it "should call svcadm clear chef for start_service when state maintenance" do
|
123
|
+
@status = mock("Status", :exitstatus => 0, :stdout => 'state maintenance')
|
124
|
+
@provider.stub!(:shell_out!).and_return(@status)
|
125
|
+
@provider.load_current_resource
|
126
|
+
@new_resource.stub!(:enable_command).and_return("#{@new_resource.enable_command}")
|
127
|
+
@provider.should_receive(:shell_out!).with("/usr/sbin/svcadm clear #{@current_resource.service_name}").and_return(@status)
|
128
|
+
@provider.should_receive(:shell_out!).with("/usr/sbin/svcadm enable -s #{@current_resource.service_name}").and_return(@status)
|
129
|
+
@provider.enable_service.should be_true
|
130
|
+
@current_resource.enabled.should be_true
|
131
|
+
end
|
107
132
|
end
|
108
133
|
|
109
134
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Serdar Sutay (<serdar@getchef.com>)
|
3
|
+
# Copyright:: Copyright (c) 2014 Chef Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
# This spec file intentionally doesn't include spec_helper.rb to
|
19
|
+
# be able to test only Chef::Application.
|
20
|
+
# Regression test for CHEF-5169
|
21
|
+
|
22
|
+
require 'chef/application'
|
23
|
+
|
24
|
+
describe "Chef::Application" do
|
25
|
+
let(:app) { Chef::Application.new }
|
26
|
+
|
27
|
+
describe "load_config_file" do
|
28
|
+
it "calls ConfigFetcher successfully without NameError" do
|
29
|
+
expect { app.load_config_file }.not_to raise_error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/unit/recipe_spec.rb
CHANGED
@@ -339,6 +339,7 @@ describe Chef::Recipe do
|
|
339
339
|
describe "include_recipe" do
|
340
340
|
it "should evaluate another recipe with include_recipe" do
|
341
341
|
node.should_receive(:loaded_recipe).with(:openldap, "gigantor")
|
342
|
+
run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false)
|
342
343
|
run_context.include_recipe "openldap::gigantor"
|
343
344
|
res = run_context.resource_collection.resources(:cat => "blanket")
|
344
345
|
res.name.should eql("blanket")
|
@@ -347,6 +348,7 @@ describe Chef::Recipe do
|
|
347
348
|
|
348
349
|
it "should load the default recipe for a cookbook if include_recipe is called without a ::" do
|
349
350
|
node.should_receive(:loaded_recipe).with(:openldap, "default")
|
351
|
+
run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false)
|
350
352
|
run_context.include_recipe "openldap"
|
351
353
|
res = run_context.resource_collection.resources(:cat => "blanket")
|
352
354
|
res.name.should eql("blanket")
|
@@ -355,12 +357,14 @@ describe Chef::Recipe do
|
|
355
357
|
|
356
358
|
it "should store that it has seen a recipe in the run_context" do
|
357
359
|
node.should_receive(:loaded_recipe).with(:openldap, "default")
|
360
|
+
run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false)
|
358
361
|
run_context.include_recipe "openldap"
|
359
362
|
run_context.loaded_recipe?("openldap").should be_true
|
360
363
|
end
|
361
364
|
|
362
365
|
it "should not include the same recipe twice" do
|
363
366
|
node.should_receive(:loaded_recipe).with(:openldap, "default").exactly(:once)
|
367
|
+
run_context.stub(:unreachable_cookbook?).with(:openldap).and_return(false)
|
364
368
|
cookbook_collection[:openldap].should_receive(:load_recipe).with("default", run_context)
|
365
369
|
recipe.include_recipe "openldap"
|
366
370
|
cookbook_collection[:openldap].should_not_receive(:load_recipe).with("default", run_context)
|
@@ -24,12 +24,13 @@ describe Chef::Resource::Conditional do
|
|
24
24
|
Mixlib::ShellOut.any_instance.stub(:run_command).and_return(nil)
|
25
25
|
@status = OpenStruct.new(:success? => true)
|
26
26
|
Mixlib::ShellOut.any_instance.stub(:status).and_return(@status)
|
27
|
+
@parent_resource = Chef::Resource.new(nil, Chef::Node.new)
|
27
28
|
end
|
28
29
|
|
29
30
|
describe "when created as an `only_if`" do
|
30
31
|
describe "after running a successful command" do
|
31
32
|
before do
|
32
|
-
@conditional = Chef::Resource::Conditional.only_if("true")
|
33
|
+
@conditional = Chef::Resource::Conditional.only_if(@parent_resource, "true")
|
33
34
|
end
|
34
35
|
|
35
36
|
it "indicates that resource convergence should continue" do
|
@@ -40,7 +41,7 @@ describe Chef::Resource::Conditional do
|
|
40
41
|
describe "after running a negative/false command" do
|
41
42
|
before do
|
42
43
|
@status.send("success?=", false)
|
43
|
-
@conditional = Chef::Resource::Conditional.only_if("false")
|
44
|
+
@conditional = Chef::Resource::Conditional.only_if(@parent_resource, "false")
|
44
45
|
end
|
45
46
|
|
46
47
|
it "indicates that resource convergence should not continue" do
|
@@ -50,8 +51,8 @@ describe Chef::Resource::Conditional do
|
|
50
51
|
|
51
52
|
describe 'after running a command which timed out' do
|
52
53
|
before do
|
53
|
-
@conditional = Chef::Resource::Conditional.only_if("false")
|
54
|
-
|
54
|
+
@conditional = Chef::Resource::Conditional.only_if(@parent_resource, "false")
|
55
|
+
Chef::GuardInterpreter::DefaultGuardInterpreter.any_instance.stub(:shell_out).and_raise(Chef::Exceptions::CommandTimeout)
|
55
56
|
end
|
56
57
|
|
57
58
|
it 'indicates that resource convergence should not continue' do
|
@@ -66,7 +67,7 @@ describe Chef::Resource::Conditional do
|
|
66
67
|
|
67
68
|
describe "after running a block that returns a truthy value" do
|
68
69
|
before do
|
69
|
-
@conditional = Chef::Resource::Conditional.only_if { Object.new }
|
70
|
+
@conditional = Chef::Resource::Conditional.only_if(@parent_resource) { Object.new }
|
70
71
|
end
|
71
72
|
|
72
73
|
it "indicates that resource convergence should continue" do
|
@@ -76,7 +77,7 @@ describe Chef::Resource::Conditional do
|
|
76
77
|
|
77
78
|
describe "after running a block that returns a falsey value" do
|
78
79
|
before do
|
79
|
-
@conditional = Chef::Resource::Conditional.only_if { nil }
|
80
|
+
@conditional = Chef::Resource::Conditional.only_if(@parent_resource) { nil }
|
80
81
|
end
|
81
82
|
|
82
83
|
it "indicates that resource convergence should not continue" do
|
@@ -88,7 +89,7 @@ describe Chef::Resource::Conditional do
|
|
88
89
|
describe "when created as a `not_if`" do
|
89
90
|
describe "after running a successful/true command" do
|
90
91
|
before do
|
91
|
-
@conditional = Chef::Resource::Conditional.not_if("true")
|
92
|
+
@conditional = Chef::Resource::Conditional.not_if(@parent_resource, "true")
|
92
93
|
end
|
93
94
|
|
94
95
|
it "indicates that resource convergence should not continue" do
|
@@ -99,7 +100,7 @@ describe Chef::Resource::Conditional do
|
|
99
100
|
describe "after running a failed/false command" do
|
100
101
|
before do
|
101
102
|
@status.send("success?=", false)
|
102
|
-
@conditional = Chef::Resource::Conditional.not_if("false")
|
103
|
+
@conditional = Chef::Resource::Conditional.not_if(@parent_resource, "false")
|
103
104
|
end
|
104
105
|
|
105
106
|
it "indicates that resource convergence should continue" do
|
@@ -109,8 +110,8 @@ describe Chef::Resource::Conditional do
|
|
109
110
|
|
110
111
|
describe 'after running a command which timed out' do
|
111
112
|
before do
|
112
|
-
@conditional = Chef::Resource::Conditional.not_if("false")
|
113
|
-
|
113
|
+
@conditional = Chef::Resource::Conditional.not_if(@parent_resource, "false")
|
114
|
+
Chef::GuardInterpreter::DefaultGuardInterpreter.any_instance.stub(:shell_out).and_raise(Chef::Exceptions::CommandTimeout)
|
114
115
|
end
|
115
116
|
|
116
117
|
it 'indicates that resource convergence should continue' do
|
@@ -125,7 +126,7 @@ describe Chef::Resource::Conditional do
|
|
125
126
|
|
126
127
|
describe "after running a block that returns a truthy value" do
|
127
128
|
before do
|
128
|
-
@conditional = Chef::Resource::Conditional.not_if { Object.new }
|
129
|
+
@conditional = Chef::Resource::Conditional.not_if(@parent_resource) { Object.new }
|
129
130
|
end
|
130
131
|
|
131
132
|
it "indicates that resource convergence should not continue" do
|
@@ -135,7 +136,7 @@ describe Chef::Resource::Conditional do
|
|
135
136
|
|
136
137
|
describe "after running a block that returns a falsey value" do
|
137
138
|
before do
|
138
|
-
@conditional = Chef::Resource::Conditional.not_if { nil }
|
139
|
+
@conditional = Chef::Resource::Conditional.not_if(@parent_resource) { nil }
|
139
140
|
end
|
140
141
|
|
141
142
|
it "indicates that resource convergence should continue" do
|
@@ -143,8 +143,13 @@ describe Chef::Resource::Cron do
|
|
143
143
|
lambda { @resource.month "13" }.should raise_error(RangeError)
|
144
144
|
end
|
145
145
|
|
146
|
-
|
147
|
-
|
146
|
+
describe "weekday" do
|
147
|
+
it "should reject any weekday over 7" do
|
148
|
+
lambda { @resource.weekday "8" }.should raise_error(RangeError)
|
149
|
+
end
|
150
|
+
it "should reject any symbols which don't represent day of week" do
|
151
|
+
lambda { @resource.weekday :foo }.should raise_error(RangeError)
|
152
|
+
end
|
148
153
|
end
|
149
154
|
|
150
155
|
it "should convert integer schedule values to a string" do
|
@@ -36,7 +36,91 @@ describe Chef::Resource::PowershellScript do
|
|
36
36
|
@resource.should be_a_kind_of(Chef::Resource::PowershellScript)
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
it "should set convert_boolean_return to false by default" do
|
40
|
+
@resource.convert_boolean_return.should == false
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should return the value for convert_boolean_return that was set" do
|
44
|
+
@resource.convert_boolean_return true
|
45
|
+
@resource.convert_boolean_return.should == true
|
46
|
+
@resource.convert_boolean_return false
|
47
|
+
@resource.convert_boolean_return.should == false
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when using guards" do
|
51
|
+
let(:resource) { @resource }
|
52
|
+
before(:each) do
|
53
|
+
resource.stub(:run_action)
|
54
|
+
resource.stub(:updated).and_return(true)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "inherits exactly the :cwd, :environment, :group, :path, :user, :umask, and :architecture attributes from a parent resource class" do
|
58
|
+
inherited_difference = Chef::Resource::PowershellScript.guard_inherited_attributes -
|
59
|
+
[:cwd, :environment, :group, :path, :user, :umask, :architecture ]
|
60
|
+
|
61
|
+
inherited_difference.should == []
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should allow guard interpreter to be set to Chef::Resource::Script" do
|
65
|
+
resource.guard_interpreter(:script)
|
66
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(false)
|
67
|
+
resource.only_if("echo hi")
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should allow guard interpreter to be set to Chef::Resource::Bash derived from Chef::Resource::Script" do
|
71
|
+
resource.guard_interpreter(:bash)
|
72
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(false)
|
73
|
+
resource.only_if("echo hi")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should allow guard interpreter to be set to Chef::Resource::PowershellScript derived indirectly from Chef::Resource::Script" do
|
77
|
+
resource.guard_interpreter(:powershell_script)
|
78
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(false)
|
79
|
+
resource.only_if("echo hi")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should enable convert_boolean_return by default for guards in the context of powershell_script when no guard params are specified" do
|
83
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:evaluate_action).and_return(true)
|
84
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
|
85
|
+
{:convert_boolean_return => true, :code => "$true"}).and_return(Proc.new {})
|
86
|
+
resource.only_if("$true")
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should enable convert_boolean_return by default for guards in non-Chef::Resource::Script derived resources when no guard params are specified" do
|
90
|
+
node = Chef::Node.new
|
91
|
+
run_context = Chef::RunContext.new(node, nil, nil)
|
92
|
+
file_resource = Chef::Resource::File.new('idontexist', run_context)
|
93
|
+
file_resource.guard_interpreter :powershell_script
|
94
|
+
|
95
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
|
96
|
+
{:convert_boolean_return => true, :code => "$true"}).and_return(Proc.new {})
|
97
|
+
resource.only_if("$true")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should enable convert_boolean_return by default for guards in the context of powershell_script when guard params are specified" do
|
101
|
+
guard_parameters = {:cwd => '/etc/chef', :architecture => :x86_64}
|
102
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
|
103
|
+
{:convert_boolean_return => true, :code => "$true"}.merge(guard_parameters)).and_return(Proc.new {})
|
104
|
+
resource.only_if("$true", guard_parameters)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should pass convert_boolean_return as true if it was specified as true in a guard parameter" do
|
108
|
+
guard_parameters = {:cwd => '/etc/chef', :convert_boolean_return => true, :architecture => :x86_64}
|
109
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
|
110
|
+
{:convert_boolean_return => true, :code => "$true"}.merge(guard_parameters)).and_return(Proc.new {})
|
111
|
+
resource.only_if("$true", guard_parameters)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should pass convert_boolean_return as false if it was specified as true in a guard parameter" do
|
115
|
+
other_guard_parameters = {:cwd => '/etc/chef', :architecture => :x86_64}
|
116
|
+
parameters_with_boolean_disabled = other_guard_parameters.merge({:convert_boolean_return => false, :code => "$true"})
|
117
|
+
allow_any_instance_of(Chef::GuardInterpreter::ResourceGuardInterpreter).to receive(:block_from_attributes).with(
|
118
|
+
parameters_with_boolean_disabled).and_return(Proc.new {})
|
119
|
+
resource.only_if("$true", parameters_with_boolean_disabled)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "as a script running in Windows-based scripting language" do
|
40
124
|
let(:resource_instance) { @resource }
|
41
125
|
let(:resource_instance_name ) { @resource.command }
|
42
126
|
let(:resource_name) { :powershell_script }
|
@@ -44,5 +128,4 @@ describe Chef::Resource::PowershellScript do
|
|
44
128
|
|
45
129
|
it_should_behave_like "a Windows script resource"
|
46
130
|
end
|
47
|
-
|
48
131
|
end
|
@@ -55,4 +55,9 @@ describe Chef::Resource::Subversion do
|
|
55
55
|
@svn.svn_arguments.should be_nil
|
56
56
|
end
|
57
57
|
|
58
|
+
it "hides password from custom exception message" do
|
59
|
+
@svn.svn_password "l33th4x0rpa$$w0rd"
|
60
|
+
e = @svn.customize_exception(Chef::Exceptions::Exec.new "Exception with password #{@svn.svn_password}")
|
61
|
+
e.message.include?(@svn.svn_password).should be_false
|
62
|
+
end
|
58
63
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Bryan McLellan <btm@loftninjas.org>
|
3
|
+
# Copyright:: Copyright (c) 2014 Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
|
21
|
+
describe Chef::Resource::WindowsPackage, "initialize", :windows_only do
|
22
|
+
|
23
|
+
let(:resource) { Chef::Resource::WindowsPackage.new("solitaire.msi") }
|
24
|
+
|
25
|
+
it "returns a Chef::Resource::WindowsPackage" do
|
26
|
+
expect(resource).to be_a_kind_of(Chef::Resource::WindowsPackage)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "sets the resource_name to :windows_package" do
|
30
|
+
expect(resource.resource_name).to eql(:windows_package)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "sets the provider to Chef::Provider::Package::Windows" do
|
34
|
+
expect(resource.provider).to eql(Chef::Provider::Package::Windows)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "supports setting installer_type" do
|
38
|
+
resource.installer_type("msi")
|
39
|
+
expect(resource.installer_type).to eql("msi")
|
40
|
+
end
|
41
|
+
|
42
|
+
# String, Integer
|
43
|
+
[ "600", 600 ].each do |val|
|
44
|
+
it "supports setting a timeout as a #{val.class}" do
|
45
|
+
resource.timeout(val)
|
46
|
+
expect(resource.timeout).to eql(val)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# String, Integer, Array
|
51
|
+
[ "42", 42, [47, 48, 49] ].each do |val|
|
52
|
+
it "supports setting an alternate return value as a #{val.class}" do
|
53
|
+
resource.returns(val)
|
54
|
+
expect(resource.returns).to eql(val)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "coverts a source to an absolute path" do
|
59
|
+
::File.stub(:absolute_path).and_return("c:\\Files\\frost.msi")
|
60
|
+
resource.source("frost.msi")
|
61
|
+
expect(resource.source).to eql "c:\\Files\\frost.msi"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "converts slashes to backslashes in the source path" do
|
65
|
+
::File.stub(:absolute_path).and_return("c:\\frost.msi")
|
66
|
+
resource.source("c:/frost.msi")
|
67
|
+
expect(resource.source).to eql "c:\\frost.msi"
|
68
|
+
end
|
69
|
+
|
70
|
+
it "defaults source to the resource name" do
|
71
|
+
# it's a little late to stub out File.absolute_path
|
72
|
+
expect(resource.source).to include("solitaire.msi")
|
73
|
+
end
|
74
|
+
end
|