chef 11.8.4.ohai7.0 → 11.10.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/distro/common/html/chef-client.8.html +3 -3
- data/distro/common/html/chef-expander.8.html +3 -3
- data/distro/common/html/chef-expanderctl.8.html +3 -3
- data/distro/common/html/chef-server-webui.8.html +3 -3
- data/distro/common/html/chef-server.8.html +3 -3
- data/distro/common/html/chef-shell.1.html +3 -3
- data/distro/common/html/chef-solo.8.html +3 -3
- data/distro/common/html/chef-solr.8.html +4 -4
- data/distro/common/html/knife-bootstrap.1.html +3 -3
- data/distro/common/html/knife-client.1.html +3 -3
- data/distro/common/html/knife-configure.1.html +3 -3
- data/distro/common/html/knife-cookbook-site.1.html +3 -3
- data/distro/common/html/knife-cookbook.1.html +3 -3
- data/distro/common/html/knife-data-bag.1.html +3 -3
- data/distro/common/html/knife-environment.1.html +3 -3
- data/distro/common/html/knife-exec.1.html +3 -3
- data/distro/common/html/knife-index.1.html +3 -3
- data/distro/common/html/knife-node.1.html +3 -3
- data/distro/common/html/knife-role.1.html +3 -3
- data/distro/common/html/knife-search.1.html +3 -3
- data/distro/common/html/knife-ssh.1.html +3 -3
- data/distro/common/html/knife-status.1.html +3 -3
- data/distro/common/html/knife-tag.1.html +3 -3
- data/distro/common/html/knife.1.html +3 -3
- data/distro/common/man/man8/chef-client.8 +3 -3
- data/distro/common/man/man8/chef-solo.8 +5 -2
- data/lib/chef.rb +2 -0
- data/lib/chef/application.rb +7 -2
- data/lib/chef/application/apply.rb +6 -0
- data/lib/chef/application/client.rb +3 -1
- data/lib/chef/application/knife.rb +2 -0
- data/lib/chef/application/solo.rb +1 -1
- data/lib/chef/client.rb +14 -11
- data/lib/chef/config.rb +4 -1
- data/lib/chef/cookbook_uploader.rb +14 -7
- data/lib/chef/encrypted_data_bag_item.rb +6 -303
- data/lib/chef/encrypted_data_bag_item/decryption_failure.rb +22 -0
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +201 -0
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +142 -0
- data/lib/chef/encrypted_data_bag_item/unacceptable_encrypted_data_bag_item_format.rb +22 -0
- data/lib/chef/encrypted_data_bag_item/unsupported_cipher.rb +22 -0
- data/lib/chef/encrypted_data_bag_item/unsupported_encrypted_data_bag_item_format.rb +22 -0
- data/lib/chef/exceptions.rb +1 -0
- data/lib/chef/formatters/doc.rb +19 -3
- data/lib/chef/http/basic_client.rb +1 -1
- data/lib/chef/http/http_request.rb +7 -0
- data/lib/chef/knife.rb +8 -1
- data/lib/chef/knife/bootstrap.rb +1 -1
- data/lib/chef/knife/cookbook_site_share.rb +2 -2
- data/lib/chef/knife/cookbook_upload.rb +7 -1
- data/lib/chef/knife/core/subcommand_loader.rb +2 -2
- data/lib/chef/knife/data_bag_create.rb +7 -0
- data/lib/chef/knife/environment_compare.rb +127 -0
- data/lib/chef/mixin/command.rb +11 -12
- data/lib/chef/mixin/deep_merge.rb +4 -4
- data/lib/chef/monkey_patches/net_http.rb +34 -0
- data/lib/chef/monkey_patches/uri.rb +70 -0
- data/lib/chef/platform/provider_mapping.rb +1 -0
- data/lib/chef/provider/cookbook_file.rb +8 -0
- data/lib/chef/provider/cron.rb +1 -1
- data/lib/chef/provider/directory.rb +7 -0
- data/lib/chef/provider/file.rb +17 -4
- data/lib/chef/provider/git.rb +23 -5
- data/lib/chef/provider/group.rb +30 -11
- data/lib/chef/provider/group/dscl.rb +26 -4
- data/lib/chef/provider/group/gpasswd.rb +14 -19
- data/lib/chef/provider/group/groupadd.rb +41 -1
- data/lib/chef/provider/group/groupmod.rb +46 -36
- data/lib/chef/provider/group/pw.rb +59 -16
- data/lib/chef/provider/group/suse.rb +16 -13
- data/lib/chef/provider/group/usermod.rb +38 -15
- data/lib/chef/provider/group/windows.rb +13 -6
- data/lib/chef/provider/ohai.rb +5 -6
- data/lib/chef/provider/remote_file.rb +8 -0
- data/lib/chef/provider/template.rb +8 -0
- data/lib/chef/provider/user.rb +5 -1
- data/lib/chef/provider/user/useradd.rb +7 -0
- data/lib/chef/provider/whyrun_safe_ruby_block.rb +30 -0
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/resource/deploy.rb +18 -0
- data/lib/chef/resource/group.rb +11 -0
- data/lib/chef/resource/scm.rb +18 -0
- data/lib/chef/resource/whyrun_safe_ruby_block.rb +31 -0
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/run_context.rb +11 -0
- data/lib/chef/shell/ext.rb +1 -1
- data/lib/chef/util/windows/net_group.rb +5 -1
- data/lib/chef/version.rb +1 -1
- data/spec/functional/resource/base.rb +3 -1
- data/spec/functional/resource/deploy_revision_spec.rb +1 -1
- data/spec/functional/resource/git_spec.rb +1 -1
- data/spec/functional/resource/group_spec.rb +257 -118
- data/spec/integration/client/client_spec.rb +82 -8
- data/spec/integration/client/ipv6_spec.rb +133 -0
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +111 -0
- data/spec/scripts/ssl-serve.rb +52 -0
- data/spec/spec_helper.rb +7 -6
- data/spec/support/platform_helpers.rb +21 -0
- data/spec/support/shared/functional/windows_script.rb +2 -1
- data/spec/support/shared/unit/provider/file.rb +181 -43
- data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +18 -0
- data/spec/unit/application/client_spec.rb +1 -0
- data/spec/unit/client_spec.rb +14 -1
- data/spec/unit/config_spec.rb +20 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +32 -18
- data/spec/unit/knife/cookbook_upload_spec.rb +14 -0
- data/spec/unit/knife/core/subcommand_loader_spec.rb +2 -2
- data/spec/unit/knife/data_bag_create_spec.rb +7 -0
- data/spec/unit/knife/environment_compare_spec.rb +112 -0
- data/spec/unit/knife_spec.rb +6 -1
- data/spec/unit/monkey_patches/uri_spec.rb +34 -0
- data/spec/unit/provider/cookbook_file_spec.rb +2 -1
- data/spec/unit/provider/cron_spec.rb +6 -0
- data/spec/unit/provider/file_spec.rb +3 -1
- data/spec/unit/provider/git_spec.rb +28 -4
- data/spec/unit/provider/group/dscl_spec.rb +1 -0
- data/spec/unit/provider/group/gpasswd_spec.rb +16 -9
- data/spec/unit/provider/group/groupadd_spec.rb +3 -4
- data/spec/unit/provider/group/groupmod_spec.rb +0 -1
- data/spec/unit/provider/group/pw_spec.rb +11 -14
- data/spec/unit/provider/group/usermod_spec.rb +19 -4
- data/spec/unit/provider/group/windows_spec.rb +0 -8
- data/spec/unit/provider/group_spec.rb +26 -4
- data/spec/unit/provider/ohai_spec.rb +1 -0
- data/spec/unit/provider/remote_file_spec.rb +4 -3
- data/spec/unit/provider/template_spec.rb +5 -3
- data/spec/unit/provider/user_spec.rb +6 -0
- data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +47 -0
- data/spec/unit/resource/scm_spec.rb +10 -0
- data/spec/unit/rest/auth_credentials_spec.rb +4 -1
- data/spec/unit/rest_spec.rb +12 -3
- metadata +69 -97
- data/spec/functional/resource/ohai_spec.rb +0 -65
data/spec/unit/config_spec.rb
CHANGED
@@ -360,4 +360,24 @@ describe Chef::Config do
|
|
360
360
|
expect{Chef::Config.log_location = missing_path}.to raise_error Chef::Exceptions::ConfigurationError
|
361
361
|
end
|
362
362
|
end
|
363
|
+
|
364
|
+
describe "Chef::Config[:event_handlers]" do
|
365
|
+
it "sets a event_handlers to an empty array by default" do
|
366
|
+
Chef::Config[:event_handlers].should eq([])
|
367
|
+
end
|
368
|
+
it "should be able to add custom handlers" do
|
369
|
+
o = Object.new
|
370
|
+
Chef::Config[:event_handlers] << o
|
371
|
+
Chef::Config[:event_handlers].should be_include(o)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
describe "Chef::Config[:user_valid_regex]" do
|
376
|
+
context "on a platform that is not Windows" do
|
377
|
+
it "allows one letter usernames" do
|
378
|
+
any_match = Chef::Config[:user_valid_regex].any? { |regex| regex.match('a') }
|
379
|
+
expect(any_match).to be_true
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
363
383
|
end
|
@@ -283,35 +283,49 @@ describe Chef::EncryptedDataBagItem do
|
|
283
283
|
end
|
284
284
|
|
285
285
|
describe ".load_secret" do
|
286
|
-
subject(:loaded_secret) { Chef::EncryptedDataBagItem.load_secret(path) }
|
287
|
-
let(:path) { "/var/mysecret" }
|
288
286
|
let(:secret) { "opensesame" }
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
287
|
+
|
288
|
+
context "when /var/mysecret exists" do
|
289
|
+
before do
|
290
|
+
::File.stub(:exist?).with("/var/mysecret").and_return(true)
|
291
|
+
IO.stub(:read).with("/var/mysecret").and_return(secret)
|
292
|
+
end
|
293
|
+
|
294
|
+
it "load_secret('/var/mysecret') reads the secret" do
|
295
|
+
Chef::EncryptedDataBagItem.load_secret("/var/mysecret").should eq secret
|
296
|
+
end
|
294
297
|
end
|
295
298
|
|
296
|
-
|
297
|
-
|
299
|
+
context "when /etc/chef/encrypted_data_bag_secret exists" do
|
300
|
+
before do
|
301
|
+
path = Chef::Config.platform_specific_path("/etc/chef/encrypted_data_bag_secret")
|
302
|
+
::File.stub(:exist?).with(path).and_return(true)
|
303
|
+
IO.stub(:read).with(path).and_return(secret)
|
304
|
+
end
|
305
|
+
|
306
|
+
it "load_secret(nil) reads the secret" do
|
307
|
+
Chef::EncryptedDataBagItem.load_secret(nil).should eq secret
|
308
|
+
end
|
298
309
|
end
|
299
310
|
|
300
|
-
context "
|
301
|
-
|
302
|
-
|
311
|
+
context "when /etc/chef/encrypted_data_bag_secret does not exist" do
|
312
|
+
before do
|
313
|
+
path = Chef::Config.platform_specific_path("/etc/chef/encrypted_data_bag_secret")
|
314
|
+
::File.stub(:exist?).with(path).and_return(false)
|
315
|
+
end
|
303
316
|
|
304
|
-
it "
|
305
|
-
Chef::Config
|
306
|
-
loaded_secret.should eq secret
|
317
|
+
it "load_secret(nil) emits a reasonable error message" do
|
318
|
+
lambda { Chef::EncryptedDataBagItem.load_secret(nil) }.should raise_error(ArgumentError, "No secret specified to load_secret and no secret found at #{Chef::Config.platform_specific_path('/etc/chef/encrypted_data_bag_secret')}")
|
307
319
|
end
|
308
320
|
end
|
309
321
|
|
310
322
|
context "path argument is a URL" do
|
311
|
-
|
323
|
+
before do
|
324
|
+
Kernel.stub(:open).with("http://www.opscode.com/").and_return(StringIO.new(secret))
|
325
|
+
end
|
312
326
|
|
313
|
-
it "reads the URL" do
|
314
|
-
|
327
|
+
it "reads from the URL" do
|
328
|
+
Chef::EncryptedDataBagItem.load_secret("http://www.opscode.com/").should eq secret
|
315
329
|
end
|
316
330
|
end
|
317
331
|
end
|
@@ -40,6 +40,20 @@ describe Chef::Knife::CookbookUpload do
|
|
40
40
|
@knife.ui.stub!(:stderr).and_return(@output)
|
41
41
|
end
|
42
42
|
|
43
|
+
describe 'with --concurrency' do
|
44
|
+
it 'should upload cookbooks with predefined concurrency' do
|
45
|
+
@cookbook_uploader = stub(:upload_cookbooks => nil)
|
46
|
+
Chef::CookbookVersion.stub(:list_all_versions).and_return({})
|
47
|
+
@knife.config[:concurrency] = 3
|
48
|
+
@test_cookbook = Chef::CookbookVersion.new('test_cookbook')
|
49
|
+
@cookbook_loader.stub!(:each).and_yield("test_cookbook", @test_cookbook)
|
50
|
+
@cookbook_loader.stub!(:cookbook_names).and_return(["test_cookbook"])
|
51
|
+
Chef::CookbookUploader.should_receive(:new).with( kind_of(Array), kind_of(Array),
|
52
|
+
{:force=>nil, :concurrency => 3}).and_return(double("Chef::CookbookUploader", :upload_cookbooks=> true))
|
53
|
+
@knife.run
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
43
57
|
describe 'run' do
|
44
58
|
before(:each) do
|
45
59
|
@cookbook_uploader = stub(:upload_cookbooks => nil)
|
@@ -45,10 +45,10 @@ describe Chef::Knife::SubcommandLoader do
|
|
45
45
|
]
|
46
46
|
$LOAD_PATH.should_receive(:map).and_return([])
|
47
47
|
if Gem::Specification.respond_to? :latest_specs
|
48
|
-
Gem::Specification.should_receive(:latest_specs).and_return(gems)
|
48
|
+
Gem::Specification.should_receive(:latest_specs).with(true).and_return(gems)
|
49
49
|
gems[0].should_receive(:matches_for_glob).with(/chef\/knife\/\*\.rb{(.*),\.rb,(.*)}/).and_return(gem_files)
|
50
50
|
else
|
51
|
-
Gem.source_index.should_receive(:latest_specs).and_return(gems)
|
51
|
+
Gem.source_index.should_receive(:latest_specs).with(true).and_return(gems)
|
52
52
|
gems[0].should_receive(:require_paths).twice.and_return(['lib'])
|
53
53
|
gems[0].should_receive(:full_gem_path).and_return('/usr/lib/ruby/gems/knife-ec2-0.5.12')
|
54
54
|
Dir.should_receive(:[]).with('/usr/lib/ruby/gems/knife-ec2-0.5.12/lib/chef/knife/*.rb').and_return(gem_files)
|
@@ -53,6 +53,13 @@ describe Chef::Knife::DataBagCreate do
|
|
53
53
|
@knife.run
|
54
54
|
end
|
55
55
|
|
56
|
+
it "tries to create a data bag with an invalid name when given one argument" do
|
57
|
+
@knife.name_args = ['invalid&char']
|
58
|
+
@knife.should_receive(:exit).with(1)
|
59
|
+
|
60
|
+
@knife.run
|
61
|
+
end
|
62
|
+
|
56
63
|
it "creates a data bag item when given two arguments" do
|
57
64
|
@knife.name_args = ['sudoing_admins', 'ME']
|
58
65
|
user_supplied_hash = {"login_name" => "alphaomega", "id" => "ME"}
|
@@ -0,0 +1,112 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Sander Botman (<sbotman@schubergphilis.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Sander Botman.
|
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::Knife::EnvironmentCompare do
|
22
|
+
before(:each) do
|
23
|
+
@knife = Chef::Knife::EnvironmentCompare.new
|
24
|
+
|
25
|
+
@environments = {
|
26
|
+
"cita" => "http://localhost:4000/environments/cita",
|
27
|
+
"citm" => "http://localhost:4000/environments/citm"
|
28
|
+
}
|
29
|
+
|
30
|
+
@knife.stub(:environment_list).and_return(@environments)
|
31
|
+
|
32
|
+
@constraints = {
|
33
|
+
"cita" => { "foo" => "= 1.0.1", "bar" => "= 0.0.4" },
|
34
|
+
"citm" => { "foo" => "= 1.0.1", "bar" => "= 0.0.2" }
|
35
|
+
}
|
36
|
+
|
37
|
+
@knife.stub(:constraint_list).and_return(@constraints)
|
38
|
+
|
39
|
+
@cookbooks = { "foo"=>"= 1.0.1", "bar"=>"= 0.0.1" }
|
40
|
+
|
41
|
+
@knife.stub(:cookbook_list).and_return(@cookbooks)
|
42
|
+
|
43
|
+
@rest_double = double('rest')
|
44
|
+
@knife.stub(:rest).and_return(@rest_double)
|
45
|
+
@cookbook_names = ['apache2', 'mysql', 'foo', 'bar', 'dummy', 'chef_handler']
|
46
|
+
@base_url = 'https://server.example.com/cookbooks'
|
47
|
+
@cookbook_data = {}
|
48
|
+
@cookbook_names.each do |item|
|
49
|
+
@cookbook_data[item] = {'url' => "#{@base_url}/#{item}",
|
50
|
+
'versions' => [{'version' => '1.0.1',
|
51
|
+
'url' => "#{@base_url}/#{item}/1.0.1"}]}
|
52
|
+
end
|
53
|
+
|
54
|
+
@rest_double.stub(:get_rest).with("/cookbooks?num_versions=1").and_return(@cookbook_data)
|
55
|
+
|
56
|
+
@stdout = StringIO.new
|
57
|
+
@knife.ui.stub(:stdout).and_return(@stdout)
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'run' do
|
61
|
+
it 'should display only cookbooks with version constraints' do
|
62
|
+
@knife.config[:format] = 'summary'
|
63
|
+
@knife.run
|
64
|
+
@environments.each do |item, url|
|
65
|
+
@stdout.string.should match /#{item}/ and @stdout.string.lines.count.should be 4
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should display 4 number of lines' do
|
70
|
+
@knife.config[:format] = 'summary'
|
71
|
+
@knife.run
|
72
|
+
@stdout.string.lines.count.should be 4
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'with -m or --mismatch' do
|
77
|
+
it 'should display only cookbooks that have mismatching version constraints' do
|
78
|
+
@knife.config[:format] = 'summary'
|
79
|
+
@knife.config[:mismatch] = true
|
80
|
+
@knife.run
|
81
|
+
@constraints.each do |item, ver|
|
82
|
+
@stdout.string.should match /#{ver[1]}/
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should display 3 number of lines' do
|
87
|
+
@knife.config[:format] = 'summary'
|
88
|
+
@knife.config[:mismatch] = true
|
89
|
+
@knife.run
|
90
|
+
@stdout.string.lines.count.should be 3
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'with -a or --all' do
|
95
|
+
it 'should display all cookbooks' do
|
96
|
+
@knife.config[:format] = 'summary'
|
97
|
+
@knife.config[:all] = true
|
98
|
+
@knife.run
|
99
|
+
@constraints.each do |item, ver|
|
100
|
+
@stdout.string.should match /#{ver[1]}/
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should display 8 number of lines' do
|
105
|
+
@knife.config[:format] = 'summary'
|
106
|
+
@knife.config[:all] = true
|
107
|
+
@knife.run
|
108
|
+
@stdout.string.lines.count.should be 8
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
data/spec/unit/knife_spec.rb
CHANGED
@@ -46,7 +46,12 @@ describe Chef::Knife do
|
|
46
46
|
Chef::Knife.reset_config_path!
|
47
47
|
# pwd according to your shell is /home/someuser/prod/chef-repo, but
|
48
48
|
# chef-repo is a symlink to /home/someuser/codes/chef-repo
|
49
|
-
|
49
|
+
if Chef::Platform.windows?
|
50
|
+
ENV.should_receive(:[]).with("CD").and_return("/home/someuser/prod/chef-repo")
|
51
|
+
else
|
52
|
+
ENV.should_receive(:[]).with("PWD").and_return("/home/someuser/prod/chef-repo")
|
53
|
+
end
|
54
|
+
|
50
55
|
Dir.stub!(:pwd).and_return("/home/someuser/codes/chef-repo")
|
51
56
|
end
|
52
57
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2013 Opscode, 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
|
+
describe URI do
|
21
|
+
|
22
|
+
describe "when a URI contains an IPv6 literal" do
|
23
|
+
|
24
|
+
let(:ipv6_uri) do
|
25
|
+
URI.parse("https://[2a00:1450:4009:809::1008]:8443")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns the hostname without brackets" do
|
29
|
+
ipv6_uri.hostname.should == "2a00:1450:4009:809::1008"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -37,7 +37,7 @@ describe Chef::Provider::CookbookFile do
|
|
37
37
|
|
38
38
|
let(:provider) do
|
39
39
|
provider = described_class.new(resource, run_context)
|
40
|
-
provider.stub
|
40
|
+
provider.stub(:content).and_return(content)
|
41
41
|
provider
|
42
42
|
end
|
43
43
|
|
@@ -54,4 +54,5 @@ describe Chef::Provider::CookbookFile do
|
|
54
54
|
|
55
55
|
it_behaves_like Chef::Provider::File
|
56
56
|
|
57
|
+
it_behaves_like "a file provider with source field"
|
57
58
|
end
|
@@ -291,6 +291,12 @@ CRONTAB
|
|
291
291
|
@provider.cron_different?.should eql(true)
|
292
292
|
end
|
293
293
|
|
294
|
+
it "should return true if mailto doesn't match" do
|
295
|
+
@current_resource.mailto "foo@bar.com"
|
296
|
+
@new_resource.mailto(nil)
|
297
|
+
@provider.cron_different?.should eql(true)
|
298
|
+
end
|
299
|
+
|
294
300
|
it "should return false if the objects are identical" do
|
295
301
|
@provider.cron_different?.should == false
|
296
302
|
end
|
@@ -46,10 +46,12 @@ describe Chef::Provider::File do
|
|
46
46
|
|
47
47
|
let(:provider) do
|
48
48
|
provider = described_class.new(resource, run_context)
|
49
|
-
provider.stub
|
49
|
+
provider.stub(:content).and_return(content)
|
50
50
|
provider
|
51
51
|
end
|
52
52
|
|
53
53
|
it_behaves_like Chef::Provider::File
|
54
|
+
|
55
|
+
it_behaves_like "a file provider with content field"
|
54
56
|
end
|
55
57
|
|
@@ -172,13 +172,14 @@ SHAS
|
|
172
172
|
let(:default_options) do
|
173
173
|
{
|
174
174
|
:user => deploy_user,
|
175
|
-
:environment => { "GIT_SSH" => wrapper },
|
175
|
+
:environment => { "GIT_SSH" => wrapper, "HOME" => "/home/deployNinja" },
|
176
176
|
:log_tag => "git[web2.0 app]"
|
177
177
|
}
|
178
178
|
end
|
179
179
|
before do
|
180
180
|
@resource.user deploy_user
|
181
181
|
@resource.ssh_wrapper wrapper
|
182
|
+
Etc.stub!(:getpwnam).and_return(double("Struct::Passwd", :name => @resource.user, :dir => "/home/deployNinja"))
|
182
183
|
end
|
183
184
|
context "without a timeout set" do
|
184
185
|
it "clones a repo with default git options" do
|
@@ -198,11 +199,13 @@ SHAS
|
|
198
199
|
|
199
200
|
it "runs a clone command with escaped destination" do
|
200
201
|
@resource.user "deployNinja"
|
202
|
+
Etc.stub!(:getpwnam).and_return(double("Struct::Passwd", :name => @resource.user, :dir => "/home/deployNinja"))
|
201
203
|
@resource.destination "/Application Support/with/space"
|
202
204
|
@resource.ssh_wrapper "do_it_this_way.sh"
|
203
205
|
expected_cmd = "git clone \"git://github.com/opscode/chef.git\" \"/Application Support/with/space\""
|
204
206
|
@provider.should_receive(:shell_out!).with(expected_cmd, :user => "deployNinja",
|
205
|
-
:environment =>{"GIT_SSH"=>"do_it_this_way.sh"
|
207
|
+
:environment =>{"GIT_SSH"=>"do_it_this_way.sh",
|
208
|
+
"HOME" => "/home/deployNinja"},
|
206
209
|
:log_tag => "git[web2.0 app]")
|
207
210
|
@provider.clone
|
208
211
|
end
|
@@ -252,11 +255,14 @@ SHAS
|
|
252
255
|
|
253
256
|
it "runs a sync command with the user and group specified in the resource" do
|
254
257
|
@resource.user("whois")
|
258
|
+
Etc.stub!(:getpwnam).and_return(double("Struct::Passwd", :name => @resource.user, :dir => "/home/whois"))
|
255
259
|
@resource.group("thisis")
|
256
260
|
@provider.should_receive(:setup_remote_tracking_branches).with(@resource.remote, @resource.repository)
|
257
261
|
expected_cmd = "git fetch origin && git fetch origin --tags && git reset --hard d35af14d41ae22b19da05d7d03a0bafc321b244c"
|
258
262
|
@provider.should_receive(:shell_out!).with(expected_cmd, :cwd => "/my/deploy/dir",
|
259
|
-
:user => "whois", :group => "thisis",
|
263
|
+
:user => "whois", :group => "thisis",
|
264
|
+
:log_tag => "git[web2.0 app]",
|
265
|
+
:environment=>{"HOME"=>"/home/whois"})
|
260
266
|
@provider.fetch_updates
|
261
267
|
end
|
262
268
|
|
@@ -296,6 +302,7 @@ SHAS
|
|
296
302
|
it "runs the config with the user and group specified in the resource" do
|
297
303
|
@resource.user("whois")
|
298
304
|
@resource.group("thisis")
|
305
|
+
Etc.stub!(:getpwnam).and_return(double("Struct::Passwd", :name => @resource.user, :dir => "/home/whois"))
|
299
306
|
command_response = double('shell_out')
|
300
307
|
command_response.stub(:exitstatus) { 1 }
|
301
308
|
expected_command = "git config --get remote.#{@resource.remote}.url"
|
@@ -304,13 +311,15 @@ SHAS
|
|
304
311
|
:log_tag => "git[web2.0 app]",
|
305
312
|
:user => "whois",
|
306
313
|
:group => "thisis",
|
314
|
+
:environment=>{"HOME"=>"/home/whois"},
|
307
315
|
:returns => [0,1,2]).and_return(command_response)
|
308
316
|
add_remote_command = "git remote add #{@resource.remote} #{@resource.repository}"
|
309
317
|
@provider.should_receive(:shell_out!).with(add_remote_command,
|
310
318
|
:cwd => "/my/deploy/dir",
|
311
319
|
:log_tag => "git[web2.0 app]",
|
312
320
|
:user => "whois",
|
313
|
-
:group => "thisis"
|
321
|
+
:group => "thisis",
|
322
|
+
:environment=>{"HOME"=>"/home/whois"})
|
314
323
|
@provider.setup_remote_tracking_branches(@resource.remote, @resource.repository)
|
315
324
|
end
|
316
325
|
|
@@ -402,6 +411,21 @@ SHAS
|
|
402
411
|
# @resource.should be_updated
|
403
412
|
end
|
404
413
|
|
414
|
+
it "does not call checkout if enable_checkout is false" do
|
415
|
+
# will be invoked in load_current_resource
|
416
|
+
::File.stub!(:exist?).with("/my/deploy/dir/.git").and_return(false)
|
417
|
+
|
418
|
+
::File.stub!(:exist?).with("/my/deploy/dir").and_return(true)
|
419
|
+
::File.stub!(:directory?).with("/my/deploy").and_return(true)
|
420
|
+
::Dir.stub!(:entries).with("/my/deploy/dir").and_return(['.','..'])
|
421
|
+
|
422
|
+
@resource.enable_checkout false
|
423
|
+
@provider.should_receive(:clone)
|
424
|
+
@provider.should_not_receive(:checkout)
|
425
|
+
@provider.should_receive(:enable_submodules)
|
426
|
+
@provider.run_action(:checkout)
|
427
|
+
end
|
428
|
+
|
405
429
|
# REGRESSION TEST: on some OSes, the entries from an empty directory will be listed as
|
406
430
|
# ['..', '.'] but this shouldn't change the behavior
|
407
431
|
it "does a checkout by cloning the repo and then enabling submodules when the directory entries are listed as %w{.. .}" do
|
@@ -265,6 +265,7 @@ describe Chef::Provider::Group::Dscl do
|
|
265
265
|
it "should manage the group_name if it changed and the new resources group_name is not null" do
|
266
266
|
@current_resource.group_name("oldval")
|
267
267
|
@new_resource.group_name("newname")
|
268
|
+
@provider.should_receive(:set_members).and_return(true)
|
268
269
|
@provider.should_receive(:safe_dscl).with("create /Groups/newname")
|
269
270
|
@provider.should_receive(:safe_dscl).with("create /Groups/newname Password '*'")
|
270
271
|
@provider.manage_group
|