chef 11.12.8-x86-mingw32 → 11.14.0.alpha.2-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +4 -2
- data/distro/common/html/_sources/index.txt +6 -0
- data/distro/common/html/_sources/knife_ssl_check.txt +41 -0
- data/distro/common/html/_sources/knife_ssl_fetch.txt +41 -0
- data/distro/common/html/_static/basic.css +2 -5
- data/distro/common/html/_static/doctools.js +5 -14
- data/distro/common/html/_static/jquery.js +2 -154
- data/distro/common/html/_static/pygments.css +2 -2
- data/distro/common/html/_static/searchtools.js +212 -150
- data/distro/common/html/_static/underscore.js +29 -21
- data/distro/common/html/_static/websupport.js +1 -1
- data/distro/common/html/ctl_chef_client.html +15 -18
- data/distro/common/html/ctl_chef_server.html +7 -7
- data/distro/common/html/ctl_chef_shell.html +6 -6
- data/distro/common/html/ctl_chef_solo.html +7 -8
- data/distro/common/html/index.html +34 -24
- data/distro/common/html/knife.html +23 -24
- data/distro/common/html/knife_bootstrap.html +13 -9
- data/distro/common/html/knife_client.html +10 -11
- data/distro/common/html/knife_common_options.html +6 -7
- data/distro/common/html/knife_configure.html +3 -4
- data/distro/common/html/knife_cookbook.html +18 -11
- data/distro/common/html/knife_cookbook_site.html +14 -14
- data/distro/common/html/knife_data_bag.html +24 -23
- data/distro/common/html/knife_delete.html +4 -5
- data/distro/common/html/knife_deps.html +4 -5
- data/distro/common/html/knife_diff.html +6 -7
- data/distro/common/html/knife_download.html +12 -13
- data/distro/common/html/knife_edit.html +4 -5
- data/distro/common/html/knife_environment.html +8 -9
- data/distro/common/html/knife_exec.html +9 -10
- data/distro/common/html/knife_index_rebuild.html +4 -5
- data/distro/common/html/knife_list.html +8 -9
- data/distro/common/html/knife_node.html +34 -33
- data/distro/common/html/knife_raw.html +2 -3
- data/distro/common/html/knife_recipe_list.html +3 -4
- data/distro/common/html/knife_role.html +30 -29
- data/distro/common/html/knife_search.html +7 -7
- data/distro/common/html/knife_show.html +4 -5
- data/distro/common/html/knife_ssh.html +2 -3
- data/distro/common/html/knife_ssl_check.html +148 -0
- data/distro/common/html/knife_ssl_fetch.html +152 -0
- data/distro/common/html/knife_status.html +4 -5
- data/distro/common/html/knife_tag.html +2 -3
- data/distro/common/html/knife_upload.html +5 -6
- data/distro/common/html/knife_user.html +9 -10
- data/distro/common/html/knife_using.html +12 -12
- data/distro/common/html/knife_xargs.html +11 -12
- data/distro/common/html/search.html +1 -2
- data/distro/common/html/searchindex.js +1 -1
- data/distro/common/man/man1/chef-shell.1 +19 -11
- data/distro/common/man/man1/knife-bootstrap.1 +35 -19
- data/distro/common/man/man1/knife-client.1 +111 -28
- data/distro/common/man/man1/knife-configure.1 +30 -14
- data/distro/common/man/man1/knife-cookbook-site.1 +105 -22
- data/distro/common/man/man1/knife-cookbook.1 +164 -23
- data/distro/common/man/man1/knife-data-bag.1 +157 -33
- data/distro/common/man/man1/knife-delete.1 +21 -17
- data/distro/common/man/man1/knife-deps.1 +60 -16
- data/distro/common/man/man1/knife-diff.1 +37 -17
- data/distro/common/man/man1/knife-download.1 +68 -24
- data/distro/common/man/man1/knife-edit.1 +19 -15
- data/distro/common/man/man1/knife-environment.1 +105 -17
- data/distro/common/man/man1/knife-exec.1 +78 -18
- data/distro/common/man/man1/knife-index-rebuild.1 +16 -8
- data/distro/common/man/man1/knife-list.1 +39 -23
- data/distro/common/man/man1/knife-node.1 +170 -22
- data/distro/common/man/man1/knife-raw.1 +33 -13
- data/distro/common/man/man1/knife-recipe-list.1 +17 -5
- data/distro/common/man/man1/knife-role.1 +86 -18
- data/distro/common/man/man1/knife-search.1 +80 -16
- data/distro/common/man/man1/knife-show.1 +30 -14
- data/distro/common/man/man1/knife-ssh.1 +54 -14
- data/distro/common/man/man1/knife-ssl-check.1 +207 -0
- data/distro/common/man/man1/knife-ssl-fetch.1 +207 -0
- data/distro/common/man/man1/knife-status.1 +48 -12
- data/distro/common/man/man1/knife-tag.1 +30 -10
- data/distro/common/man/man1/knife-upload.1 +72 -20
- data/distro/common/man/man1/knife-user.1 +79 -23
- data/distro/common/man/man1/knife-xargs.1 +61 -53
- data/distro/common/man/man8/chef-client.8 +87 -29
- data/distro/common/man/man8/chef-solo.8 +36 -15
- data/lib/chef/application.rb +19 -14
- data/lib/chef/application/client.rb +5 -0
- data/lib/chef/application/solo.rb +5 -0
- data/lib/chef/application/windows_service_manager.rb +3 -0
- data/lib/chef/chef_fs/chef_fs_data_store.rb +72 -24
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +20 -4
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +20 -1
- data/lib/chef/chef_fs/file_system/file_system_entry.rb +10 -2
- data/lib/chef/client.rb +2 -3
- data/lib/chef/config.rb +34 -8
- data/lib/chef/cookbook/cookbook_version_loader.rb +45 -4
- data/lib/chef/cookbook_version.rb +38 -30
- data/lib/chef/dsl/recipe.rb +4 -1
- data/lib/chef/event_dispatch/base.rb +14 -0
- data/lib/chef/event_dispatch/events_output_stream.rb +29 -0
- data/lib/chef/exceptions.rb +8 -0
- data/lib/chef/formatters/base.rb +16 -45
- data/lib/chef/formatters/doc.rb +51 -26
- data/lib/chef/formatters/indentable_output_stream.rb +165 -0
- data/lib/chef/knife/node_environment_set.rb +54 -0
- data/lib/chef/knife/user_create.rb +1 -1
- data/lib/chef/monkey_patches/pathname.rb +32 -0
- data/lib/chef/node.rb +1 -1
- data/lib/chef/platform/provider_mapping.rb +345 -338
- data/lib/chef/policy_builder/expand_node_object.rb +1 -1
- data/lib/chef/policy_builder/policyfile.rb +1 -1
- data/lib/chef/provider.rb +1 -0
- data/lib/chef/provider/git.rb +1 -1
- data/lib/chef/provider/link.rb +2 -2
- data/lib/chef/provider/remote_file/content.rb +1 -1
- data/lib/chef/provider/remote_file/local_file.rb +8 -2
- data/lib/chef/provider/service/arch.rb +0 -1
- data/lib/chef/provider/service/debian.rb +0 -2
- data/lib/chef/provider/service/freebsd.rb +2 -1
- data/lib/chef/provider/service/gentoo.rb +1 -1
- data/lib/chef/provider/service/init.rb +0 -1
- data/lib/chef/provider/service/insserv.rb +0 -2
- data/lib/chef/provider/service/invokercd.rb +0 -2
- data/lib/chef/provider/service/macosx.rb +2 -1
- data/lib/chef/provider/service/redhat.rb +0 -1
- data/lib/chef/provider/service/simple.rb +1 -0
- data/lib/chef/provider/service/solaris.rb +1 -0
- data/lib/chef/provider/service/systemd.rb +1 -1
- data/lib/chef/provider/service/upstart.rb +1 -1
- data/lib/chef/provider/user.rb +9 -9
- data/lib/chef/provider/user/solaris.rb +2 -0
- data/lib/chef/resource.rb +1 -0
- data/lib/chef/resource/remote_file.rb +32 -6
- data/lib/chef/run_context.rb +22 -0
- data/lib/chef/run_lock.rb +43 -4
- data/lib/chef/version.rb +2 -2
- data/spec/functional/http/simple_spec.rb +84 -0
- data/spec/functional/resource/remote_file_spec.rb +107 -43
- data/spec/functional/rest_spec.rb +94 -0
- data/spec/functional/run_lock_spec.rb +1 -1
- data/spec/functional/win32/service_manager_spec.rb +6 -0
- data/spec/integration/knife/chef_fs_data_store_spec.rb +2 -0
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +76 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/mock/platform.rb +7 -0
- data/spec/support/pedant/pedant_config.rb +121 -0
- data/spec/support/pedant/run_pedant.rb +63 -0
- data/spec/support/pedant/stickywicket.pem +27 -0
- data/spec/support/shared/functional/http.rb +242 -0
- data/spec/support/shared/unit/api_error_inspector.rb +2 -2
- data/spec/unit/api_client_spec.rb +2 -2
- data/spec/unit/application/client_spec.rb +6 -1
- data/spec/unit/application/knife_spec.rb +4 -0
- data/spec/unit/application/solo_spec.rb +2 -0
- data/spec/unit/application_spec.rb +7 -0
- data/spec/unit/client_spec.rb +16 -0
- data/spec/unit/config_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +224 -122
- data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +2 -2
- data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +2 -2
- data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +2 -2
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +2 -2
- data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +2 -2
- data/spec/unit/handler_spec.rb +0 -1
- data/spec/unit/knife/client_bulk_delete_spec.rb +3 -0
- data/spec/unit/knife/cookbook_bulk_delete_spec.rb +2 -0
- data/spec/unit/knife/cookbook_metadata_spec.rb +2 -2
- data/spec/unit/knife/cookbook_site_install_spec.rb +3 -1
- data/spec/unit/knife/cookbook_upload_spec.rb +10 -10
- data/spec/unit/knife/node_environment_set_spec.rb +80 -0
- data/spec/unit/knife/user_create_spec.rb +6 -4
- data/spec/unit/knife/user_edit_spec.rb +5 -0
- data/spec/unit/knife_spec.rb +3 -0
- data/spec/unit/mixin/securable_spec.rb +18 -20
- data/spec/unit/node/attribute_spec.rb +15 -2
- data/spec/unit/node/immutable_collections_spec.rb +4 -4
- data/spec/unit/provider/cron_spec.rb +14 -14
- data/spec/unit/provider/git_spec.rb +4 -4
- data/spec/unit/provider/group_spec.rb +1 -1
- data/spec/unit/provider/ohai_spec.rb +2 -2
- data/spec/unit/provider/remote_file/content_spec.rb +58 -35
- data/spec/unit/provider/remote_file/local_file_spec.rb +23 -0
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +13 -13
- data/spec/unit/resource/mount_spec.rb +0 -1
- data/spec/unit/resource/remote_file_spec.rb +29 -0
- data/spec/unit/resource_spec.rb +1 -1
- data/spec/unit/run_context_spec.rb +7 -0
- data/spec/unit/run_lock_spec.rb +98 -0
- data/spec/unit/version_constraint_spec.rb +1 -1
- metadata +166 -153
- data/distro/common/html/_static/chef.css +0 -507
- data/distro/common/html/_static/chef_logo.png +0 -0
- data/lib/chef/checksum/storage.rb +0 -18
- data/lib/chef/checksum/storage/filesystem.rb +0 -56
- data/spec/unit/checksum/storage/filesystem_spec.rb +0 -70
@@ -37,8 +37,8 @@ shared_examples_for "an api error inspector" do
|
|
37
37
|
:client_key => "/etc/chef/client.pem"
|
38
38
|
}
|
39
39
|
@description = Chef::Formatters::ErrorDescription.new("Error registering the node:")
|
40
|
-
@outputter = Chef::Formatters::
|
41
|
-
#@outputter = Chef::Formatters::
|
40
|
+
@outputter = Chef::Formatters::IndentableOutputStream.new(StringIO.new, STDERR)
|
41
|
+
#@outputter = Chef::Formatters::IndentableOutputStream.new(STDOUT, STDERR)
|
42
42
|
|
43
43
|
end
|
44
44
|
|
@@ -197,11 +197,11 @@ describe Chef::ApiClient do
|
|
197
197
|
end
|
198
198
|
|
199
199
|
it "preserves the admin status" do
|
200
|
-
@client.admin.should be_a_kind_of(
|
200
|
+
@client.admin.should be_a_kind_of(TrueClass)
|
201
201
|
end
|
202
202
|
|
203
203
|
it "preserves the 'validator' status" do
|
204
|
-
@client.validator.should be_a_kind_of(
|
204
|
+
@client.validator.should be_a_kind_of(TrueClass)
|
205
205
|
end
|
206
206
|
|
207
207
|
it "includes the private key if present" do
|
@@ -19,10 +19,13 @@ require 'spec_helper'
|
|
19
19
|
|
20
20
|
describe Chef::Application::Client, "reconfigure" do
|
21
21
|
before do
|
22
|
+
Kernel.stub(:trap).and_return(:ok)
|
23
|
+
|
22
24
|
@original_argv = ARGV.dup
|
23
25
|
ARGV.clear
|
24
26
|
|
25
27
|
@app = Chef::Application::Client.new
|
28
|
+
@app.stub(:trap)
|
26
29
|
@app.stub(:configure_opt_parser).and_return(true)
|
27
30
|
@app.stub(:configure_chef).and_return(true)
|
28
31
|
@app.stub(:configure_logging).and_return(true)
|
@@ -131,6 +134,8 @@ describe Chef::Application::Client, "run_application", :unix_only do
|
|
131
134
|
Chef::Config[:daemonize] = true
|
132
135
|
@pipe = IO.pipe
|
133
136
|
@app = Chef::Application::Client.new
|
137
|
+
# Default logger doesn't work correctly when logging from a trap handler.
|
138
|
+
@app.configure_logging
|
134
139
|
Chef::Daemon.stub(:daemonize).and_return(true)
|
135
140
|
@app.stub(:run_chef_client) do
|
136
141
|
@pipe[1].puts 'started'
|
@@ -139,7 +144,7 @@ describe Chef::Application::Client, "run_application", :unix_only do
|
|
139
144
|
end
|
140
145
|
end
|
141
146
|
|
142
|
-
it "should exit gracefully when sent SIGTERM" do
|
147
|
+
it "should exit gracefully when sent SIGTERM", :volatile_on_solaris do
|
143
148
|
pid = fork do
|
144
149
|
@app.run_application
|
145
150
|
end
|
@@ -34,8 +34,12 @@ describe Chef::Application::Knife do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
before(:each) do
|
37
|
+
# Prevent code from getting loaded on every test invocation.
|
38
|
+
Chef::Knife.stub(:load_commands)
|
39
|
+
|
37
40
|
@knife = Chef::Application::Knife.new
|
38
41
|
@knife.stub(:puts)
|
42
|
+
@knife.stub(:trap)
|
39
43
|
Chef::Knife.stub(:list_commands)
|
40
44
|
end
|
41
45
|
|
@@ -19,10 +19,12 @@ require 'spec_helper'
|
|
19
19
|
|
20
20
|
describe Chef::Application::Solo do
|
21
21
|
before do
|
22
|
+
Kernel.stub(:trap).and_return(:ok)
|
22
23
|
@app = Chef::Application::Solo.new
|
23
24
|
@app.stub(:configure_opt_parser).and_return(true)
|
24
25
|
@app.stub(:configure_chef).and_return(true)
|
25
26
|
@app.stub(:configure_logging).and_return(true)
|
27
|
+
@app.stub(:trap)
|
26
28
|
Chef::Config[:recipe_url] = false
|
27
29
|
Chef::Config[:json_attribs] = false
|
28
30
|
Chef::Config[:solo] = true
|
@@ -24,6 +24,7 @@ describe Chef::Application do
|
|
24
24
|
ARGV.clear
|
25
25
|
Chef::Log.logger = Logger.new(StringIO.new)
|
26
26
|
@app = Chef::Application.new
|
27
|
+
@app.stub(:trap)
|
27
28
|
Dir.stub(:chdir).and_return(0)
|
28
29
|
@app.stub(:reconfigure)
|
29
30
|
Chef::Log.init(STDERR)
|
@@ -84,6 +85,9 @@ describe Chef::Application do
|
|
84
85
|
|
85
86
|
describe "configure_chef" do
|
86
87
|
before do
|
88
|
+
# Silence warnings when no config file exists
|
89
|
+
Chef::Log.stub(:warn)
|
90
|
+
|
87
91
|
@app = Chef::Application.new
|
88
92
|
#Chef::Config.stub(:merge!).and_return(true)
|
89
93
|
@app.stub(:parse_options).and_return(true)
|
@@ -107,6 +111,9 @@ describe Chef::Application do
|
|
107
111
|
|
108
112
|
before do
|
109
113
|
@app.config[:config_file] = config_location
|
114
|
+
|
115
|
+
# force let binding to get evaluated or else we stub Pathname.new before we try to use it.
|
116
|
+
config_location_pathname
|
110
117
|
Pathname.stub(:new).with(config_location).and_return(config_location_pathname)
|
111
118
|
File.should_receive(:read).
|
112
119
|
with(config_location).
|
data/spec/unit/client_spec.rb
CHANGED
@@ -488,6 +488,22 @@ describe Chef::Client do
|
|
488
488
|
node[:recipes].length.should == 1
|
489
489
|
node[:recipes].should include("cookbook1")
|
490
490
|
end
|
491
|
+
|
492
|
+
it "should set the environment from the specified configuration value" do
|
493
|
+
node.chef_environment.should == "_default"
|
494
|
+
Chef::Config[:environment] = "A"
|
495
|
+
|
496
|
+
test_env = Chef::Environment.new
|
497
|
+
test_env.name("A")
|
498
|
+
|
499
|
+
mock_chef_rest = double("Chef::REST")
|
500
|
+
mock_chef_rest.should_receive(:get_rest).with("environments/A").and_return(test_env)
|
501
|
+
Chef::REST.should_receive(:new).and_return(mock_chef_rest)
|
502
|
+
client.policy_builder.stub(:node).and_return(node)
|
503
|
+
client.build_node.should == node
|
504
|
+
|
505
|
+
node.chef_environment.should == "A"
|
506
|
+
end
|
491
507
|
end
|
492
508
|
|
493
509
|
describe "windows_admin_check" do
|
data/spec/unit/config_spec.rb
CHANGED
@@ -21,10 +21,6 @@ require 'spec_helper'
|
|
21
21
|
require 'chef/exceptions'
|
22
22
|
|
23
23
|
describe Chef::Config do
|
24
|
-
before(:all) do
|
25
|
-
@original_env = { 'HOME' => ENV['HOME'], 'SYSTEMDRIVE' => ENV['SYSTEMDRIVE'], 'HOMEPATH' => ENV['HOMEPATH'], 'USERPROFILE' => ENV['USERPROFILE'] }
|
26
|
-
end
|
27
|
-
|
28
24
|
describe "config attribute writer: chef_server_url" do
|
29
25
|
before do
|
30
26
|
Chef::Config.chef_server_url = "https://junglist.gen.nz"
|
@@ -132,7 +128,7 @@ describe Chef::Config do
|
|
132
128
|
it "should return a windows path on windows systems" do
|
133
129
|
platform_mock :windows do
|
134
130
|
path = "/etc/chef/cookbooks"
|
135
|
-
|
131
|
+
Chef::Config.stub(:env).and_return({ 'SYSTEMDRIVE' => 'C:' })
|
136
132
|
# match on a regex that looks for the base path with an optional
|
137
133
|
# system drive at the beginning (c:)
|
138
134
|
# system drive is not hardcoded b/c it can change and b/c it is not present on linux systems
|
@@ -283,23 +279,14 @@ describe Chef::Config do
|
|
283
279
|
|
284
280
|
describe "Chef::Config[:user_home]" do
|
285
281
|
it "should set when HOME is provided" do
|
286
|
-
|
287
|
-
load File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "chef", "config.rb"))
|
282
|
+
Chef::Config.stub(:env).and_return({ 'HOME' => "/home/kitten" })
|
288
283
|
Chef::Config[:user_home].should == "/home/kitten"
|
289
284
|
end
|
290
285
|
|
291
286
|
it "should be set when only USERPROFILE is provided" do
|
292
|
-
|
293
|
-
ENV['USERPROFILE'] = "/users/kitten"
|
294
|
-
load File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "chef", "config.rb"))
|
287
|
+
Chef::Config.stub(:env).and_return({ 'USERPROFILE' => "/users/kitten" })
|
295
288
|
Chef::Config[:user_home].should == "/users/kitten"
|
296
289
|
end
|
297
|
-
|
298
|
-
after(:each) do
|
299
|
-
@original_env.each do |env_setting|
|
300
|
-
ENV[env_setting[0]] = env_setting[1]
|
301
|
-
end
|
302
|
-
end
|
303
290
|
end
|
304
291
|
|
305
292
|
describe "Chef::Config[:encrypted_data_bag_secret]" do
|
@@ -310,10 +297,6 @@ describe Chef::Config do
|
|
310
297
|
|
311
298
|
before do
|
312
299
|
File.stub(:exist?).with(db_secret_default_path).and_return(secret_exists)
|
313
|
-
# ugh...the only way to properly test this since the conditional
|
314
|
-
# is evaluated at file load/require time.
|
315
|
-
$LOADED_FEATURES.delete_if{|f| f =~ /chef\/config\.rb/}
|
316
|
-
require 'chef/config'
|
317
300
|
end
|
318
301
|
|
319
302
|
context "#{db_secret_default_path} exists" do
|
@@ -20,7 +20,7 @@ require 'spec_helper'
|
|
20
20
|
describe Chef::CookbookVersion do
|
21
21
|
describe "when first created" do
|
22
22
|
before do
|
23
|
-
@cookbook_version = Chef::CookbookVersion.new("tatft")
|
23
|
+
@cookbook_version = Chef::CookbookVersion.new("tatft", '/tmp/blah')
|
24
24
|
end
|
25
25
|
|
26
26
|
it "has a name" do
|
@@ -96,156 +96,258 @@ describe Chef::CookbookVersion do
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
-
describe "
|
99
|
+
describe "with a cookbook directory named tatft" do
|
100
100
|
MD5 = /[0-9a-f]{32}/
|
101
101
|
|
102
102
|
before do
|
103
|
-
# Currently the cookbook loader finds all the files then tells CookbookVersion
|
104
|
-
# where they are.
|
105
|
-
@cookbook_version = Chef::CookbookVersion.new("tatft")
|
106
|
-
|
107
103
|
@cookbook = Hash.new { |hash, key| hash[key] = [] }
|
108
104
|
|
109
|
-
cookbook_root = File.join(CHEF_SPEC_DATA, 'cb_version_cookbooks', 'tatft')
|
105
|
+
@cookbook_root = File.join(CHEF_SPEC_DATA, 'cb_version_cookbooks', 'tatft')
|
110
106
|
|
111
107
|
# Dunno if the paths here are representitive of what is set by CookbookLoader...
|
112
|
-
@cookbook[:attribute_filenames] = Dir[File.join(cookbook_root, 'attributes', '**', '*.rb')]
|
113
|
-
@cookbook[:definition_filenames] = Dir[File.join(cookbook_root, 'definitions', '**', '*.rb')]
|
114
|
-
@cookbook[:file_filenames] = Dir[File.join(cookbook_root, 'files', '**', '*.tgz')]
|
115
|
-
@cookbook[:recipe_filenames] = Dir[File.join(cookbook_root, 'recipes', '**', '*.rb')]
|
116
|
-
@cookbook[:template_filenames] = Dir[File.join(cookbook_root, 'templates', '**', '*.erb')]
|
117
|
-
@cookbook[:library_filenames] = Dir[File.join(cookbook_root, 'libraries', '**', '*.rb')]
|
118
|
-
@cookbook[:resource_filenames] = Dir[File.join(cookbook_root, 'resources', '**', '*.rb')]
|
119
|
-
@cookbook[:provider_filenames] = Dir[File.join(cookbook_root, 'providers', '**', '*.rb')]
|
120
|
-
@cookbook[:root_filenames] = Array(File.join(cookbook_root, 'README.rdoc'))
|
121
|
-
@cookbook[:metadata_filenames] = Array(File.join(cookbook_root, 'metadata.json'))
|
122
|
-
|
123
|
-
@cookbook_version.attribute_filenames = @cookbook[:attribute_filenames]
|
124
|
-
@cookbook_version.definition_filenames = @cookbook[:definition_filenames]
|
125
|
-
@cookbook_version.recipe_filenames = @cookbook[:recipe_filenames]
|
126
|
-
@cookbook_version.template_filenames = @cookbook[:template_filenames]
|
127
|
-
@cookbook_version.file_filenames = @cookbook[:file_filenames]
|
128
|
-
@cookbook_version.library_filenames = @cookbook[:library_filenames]
|
129
|
-
@cookbook_version.resource_filenames = @cookbook[:resource_filenames]
|
130
|
-
@cookbook_version.provider_filenames = @cookbook[:provider_filenames]
|
131
|
-
@cookbook_version.root_filenames = @cookbook[:root_filenames]
|
132
|
-
@cookbook_version.metadata_filenames = @cookbook[:metadata_filenames]
|
133
|
-
|
134
|
-
# Used to test file-specificity related file lookups
|
135
|
-
@node = Chef::Node.new
|
136
|
-
@node.set[:platform] = "ubuntu"
|
137
|
-
@node.set[:platform_version] = "13.04"
|
138
|
-
@node.name("testing")
|
108
|
+
@cookbook[:attribute_filenames] = Dir[File.join(@cookbook_root, 'attributes', '**', '*.rb')]
|
109
|
+
@cookbook[:definition_filenames] = Dir[File.join(@cookbook_root, 'definitions', '**', '*.rb')]
|
110
|
+
@cookbook[:file_filenames] = Dir[File.join(@cookbook_root, 'files', '**', '*.tgz')]
|
111
|
+
@cookbook[:recipe_filenames] = Dir[File.join(@cookbook_root, 'recipes', '**', '*.rb')]
|
112
|
+
@cookbook[:template_filenames] = Dir[File.join(@cookbook_root, 'templates', '**', '*.erb')]
|
113
|
+
@cookbook[:library_filenames] = Dir[File.join(@cookbook_root, 'libraries', '**', '*.rb')]
|
114
|
+
@cookbook[:resource_filenames] = Dir[File.join(@cookbook_root, 'resources', '**', '*.rb')]
|
115
|
+
@cookbook[:provider_filenames] = Dir[File.join(@cookbook_root, 'providers', '**', '*.rb')]
|
116
|
+
@cookbook[:root_filenames] = Array(File.join(@cookbook_root, 'README.rdoc'))
|
117
|
+
@cookbook[:metadata_filenames] = Array(File.join(@cookbook_root, 'metadata.json'))
|
118
|
+
|
139
119
|
end
|
140
120
|
|
141
|
-
|
142
|
-
|
121
|
+
describe "and a cookbook with the same name" do
|
122
|
+
before do
|
123
|
+
# Currently the cookbook loader finds all the files then tells CookbookVersion
|
124
|
+
# where they are.
|
125
|
+
@cookbook_version = Chef::CookbookVersion.new("tatft", @cookbook_root)
|
126
|
+
|
127
|
+
@cookbook_version.attribute_filenames = @cookbook[:attribute_filenames]
|
128
|
+
@cookbook_version.definition_filenames = @cookbook[:definition_filenames]
|
129
|
+
@cookbook_version.recipe_filenames = @cookbook[:recipe_filenames]
|
130
|
+
@cookbook_version.template_filenames = @cookbook[:template_filenames]
|
131
|
+
@cookbook_version.file_filenames = @cookbook[:file_filenames]
|
132
|
+
@cookbook_version.library_filenames = @cookbook[:library_filenames]
|
133
|
+
@cookbook_version.resource_filenames = @cookbook[:resource_filenames]
|
134
|
+
@cookbook_version.provider_filenames = @cookbook[:provider_filenames]
|
135
|
+
@cookbook_version.root_filenames = @cookbook[:root_filenames]
|
136
|
+
@cookbook_version.metadata_filenames = @cookbook[:metadata_filenames]
|
137
|
+
|
138
|
+
# Used to test file-specificity related file lookups
|
139
|
+
@node = Chef::Node.new
|
140
|
+
@node.set[:platform] = "ubuntu"
|
141
|
+
@node.set[:platform_version] = "13.04"
|
142
|
+
@node.name("testing")
|
143
|
+
end
|
143
144
|
|
144
|
-
manifest
|
145
|
-
|
145
|
+
it "generates a manifest containing the cookbook's files" do
|
146
|
+
manifest = @cookbook_version.manifest
|
146
147
|
|
147
|
-
|
148
|
+
manifest["metadata"].should == Chef::Cookbook::Metadata.new
|
149
|
+
manifest["cookbook_name"].should == "tatft"
|
148
150
|
|
149
|
-
|
150
|
-
recipe["name"].should == "default.rb"
|
151
|
-
recipe["path"].should == "recipes/default.rb"
|
152
|
-
recipe["checksum"].should match(MD5)
|
153
|
-
recipe["specificity"].should == "default"
|
151
|
+
manifest["recipes"].should have(1).recipe_file
|
154
152
|
|
155
|
-
|
153
|
+
recipe = manifest["recipes"].first
|
154
|
+
recipe["name"].should == "default.rb"
|
155
|
+
recipe["path"].should == "recipes/default.rb"
|
156
|
+
recipe["checksum"].should match(MD5)
|
157
|
+
recipe["specificity"].should == "default"
|
156
158
|
|
157
|
-
|
158
|
-
definition["name"].should == "runit_service.rb"
|
159
|
-
definition["path"].should == "definitions/runit_service.rb"
|
160
|
-
definition["checksum"].should match(MD5)
|
161
|
-
definition["specificity"].should == "default"
|
159
|
+
manifest["definitions"].should have(1).definition_file
|
162
160
|
|
163
|
-
|
161
|
+
definition = manifest["definitions"].first
|
162
|
+
definition["name"].should == "runit_service.rb"
|
163
|
+
definition["path"].should == "definitions/runit_service.rb"
|
164
|
+
definition["checksum"].should match(MD5)
|
165
|
+
definition["specificity"].should == "default"
|
164
166
|
|
165
|
-
|
166
|
-
library["name"].should == "ownage.rb"
|
167
|
-
library["path"].should == "libraries/ownage.rb"
|
168
|
-
library["checksum"].should match(MD5)
|
169
|
-
library["specificity"].should == "default"
|
167
|
+
manifest["libraries"].should have(1).library_file
|
170
168
|
|
171
|
-
|
169
|
+
library = manifest["libraries"].first
|
170
|
+
library["name"].should == "ownage.rb"
|
171
|
+
library["path"].should == "libraries/ownage.rb"
|
172
|
+
library["checksum"].should match(MD5)
|
173
|
+
library["specificity"].should == "default"
|
172
174
|
|
173
|
-
|
174
|
-
attribute_file["name"].should == "default.rb"
|
175
|
-
attribute_file["path"].should == "attributes/default.rb"
|
176
|
-
attribute_file["checksum"].should match(MD5)
|
177
|
-
attribute_file["specificity"].should == "default"
|
175
|
+
manifest["attributes"].should have(1).attribute_file
|
178
176
|
|
179
|
-
|
177
|
+
attribute_file = manifest["attributes"].first
|
178
|
+
attribute_file["name"].should == "default.rb"
|
179
|
+
attribute_file["path"].should == "attributes/default.rb"
|
180
|
+
attribute_file["checksum"].should match(MD5)
|
181
|
+
attribute_file["specificity"].should == "default"
|
180
182
|
|
181
|
-
|
182
|
-
cookbook_file["name"].should == "giant_blob.tgz"
|
183
|
-
cookbook_file["path"].should == "files/default/giant_blob.tgz"
|
184
|
-
cookbook_file["checksum"].should match(MD5)
|
185
|
-
cookbook_file["specificity"].should == "default"
|
183
|
+
manifest["files"].should have(1).cookbook_file
|
186
184
|
|
187
|
-
|
185
|
+
cookbook_file = manifest["files"].first
|
186
|
+
cookbook_file["name"].should == "giant_blob.tgz"
|
187
|
+
cookbook_file["path"].should == "files/default/giant_blob.tgz"
|
188
|
+
cookbook_file["checksum"].should match(MD5)
|
189
|
+
cookbook_file["specificity"].should == "default"
|
188
190
|
|
189
|
-
|
190
|
-
template["name"].should == "configuration.erb"
|
191
|
-
template["path"].should == "templates/default/configuration.erb"
|
192
|
-
template["checksum"].should match(MD5)
|
193
|
-
template["specificity"].should == "default"
|
191
|
+
manifest["templates"].should have(1).template
|
194
192
|
|
195
|
-
|
193
|
+
template = manifest["templates"].first
|
194
|
+
template["name"].should == "configuration.erb"
|
195
|
+
template["path"].should == "templates/default/configuration.erb"
|
196
|
+
template["checksum"].should match(MD5)
|
197
|
+
template["specificity"].should == "default"
|
196
198
|
|
197
|
-
|
198
|
-
lwr["name"].should == "lwr.rb"
|
199
|
-
lwr["path"].should == "resources/lwr.rb"
|
200
|
-
lwr["checksum"].should match(MD5)
|
201
|
-
lwr["specificity"].should == "default"
|
199
|
+
manifest["resources"].should have(1).lwr
|
202
200
|
|
203
|
-
|
201
|
+
lwr = manifest["resources"].first
|
202
|
+
lwr["name"].should == "lwr.rb"
|
203
|
+
lwr["path"].should == "resources/lwr.rb"
|
204
|
+
lwr["checksum"].should match(MD5)
|
205
|
+
lwr["specificity"].should == "default"
|
204
206
|
|
205
|
-
|
206
|
-
lwp["name"].should == "lwp.rb"
|
207
|
-
lwp["path"].should == "providers/lwp.rb"
|
208
|
-
lwp["checksum"].should match(MD5)
|
209
|
-
lwp["specificity"].should == "default"
|
207
|
+
manifest["providers"].should have(1).lwp
|
210
208
|
|
211
|
-
|
209
|
+
lwp = manifest["providers"].first
|
210
|
+
lwp["name"].should == "lwp.rb"
|
211
|
+
lwp["path"].should == "providers/lwp.rb"
|
212
|
+
lwp["checksum"].should match(MD5)
|
213
|
+
lwp["specificity"].should == "default"
|
212
214
|
|
213
|
-
|
214
|
-
readme["name"].should == "README.rdoc"
|
215
|
-
readme["path"].should == "README.rdoc"
|
216
|
-
readme["checksum"].should match(MD5)
|
217
|
-
readme["specificity"].should == "default"
|
218
|
-
end
|
215
|
+
manifest["root_files"].should have(1).file_in_the_cookbook_root
|
219
216
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
217
|
+
readme = manifest["root_files"].first
|
218
|
+
readme["name"].should == "README.rdoc"
|
219
|
+
readme["path"].should == "README.rdoc"
|
220
|
+
readme["checksum"].should match(MD5)
|
221
|
+
readme["specificity"].should == "default"
|
222
|
+
end
|
224
223
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
224
|
+
it "determines whether a template is available for a given node" do
|
225
|
+
@cookbook_version.should have_template_for_node(@node, "configuration.erb")
|
226
|
+
@cookbook_version.should_not have_template_for_node(@node, "missing.erb")
|
227
|
+
end
|
229
228
|
|
230
|
-
|
231
|
-
|
232
|
-
node
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
229
|
+
it "determines whether a cookbook_file is available for a given node" do
|
230
|
+
@cookbook_version.should have_cookbook_file_for_node(@node, "giant_blob.tgz")
|
231
|
+
@cookbook_version.should_not have_cookbook_file_for_node(@node, "missing.txt")
|
232
|
+
end
|
233
|
+
|
234
|
+
describe "raises an error when attempting to load a missing cookbook_file and" do
|
235
|
+
before do
|
236
|
+
node = Chef::Node.new.tap do |n|
|
237
|
+
n.name("sample.node")
|
238
|
+
n.automatic_attrs[:fqdn] = "sample.example.com"
|
239
|
+
n.automatic_attrs[:platform] = "ubuntu"
|
240
|
+
n.automatic_attrs[:platform_version] = "10.04"
|
241
|
+
end
|
242
|
+
@attempt_to_load_file = lambda { @cookbook_version.preferred_manifest_record(node, :files, "no-such-thing.txt") }
|
243
|
+
end
|
244
|
+
|
245
|
+
it "describes the cookbook and version" do
|
246
|
+
useful_explanation = Regexp.new(Regexp.escape("Cookbook 'tatft' (0.0.0) does not contain"))
|
247
|
+
@attempt_to_load_file.should raise_error(Chef::Exceptions::FileNotFound, useful_explanation)
|
248
|
+
end
|
249
|
+
|
250
|
+
it "lists suggested places to look" do
|
251
|
+
useful_explanation = Regexp.new(Regexp.escape("files/default/no-such-thing.txt"))
|
252
|
+
@attempt_to_load_file.should raise_error(Chef::Exceptions::FileNotFound, useful_explanation)
|
237
253
|
end
|
238
|
-
@attempt_to_load_file = lambda { @cookbook_version.preferred_manifest_record(node, :files, "no-such-thing.txt") }
|
239
254
|
end
|
255
|
+
end
|
240
256
|
|
241
|
-
|
242
|
-
|
243
|
-
|
257
|
+
describe "and a cookbook_version with a different name" do
|
258
|
+
before do
|
259
|
+
# Currently the cookbook loader finds all the files then tells CookbookVersion
|
260
|
+
# where they are.
|
261
|
+
@cookbook_version = Chef::CookbookVersion.new("blarghle", @cookbook_root)
|
262
|
+
@cookbook_version.attribute_filenames = @cookbook[:attribute_filenames]
|
263
|
+
@cookbook_version.definition_filenames = @cookbook[:definition_filenames]
|
264
|
+
@cookbook_version.recipe_filenames = @cookbook[:recipe_filenames]
|
265
|
+
@cookbook_version.template_filenames = @cookbook[:template_filenames]
|
266
|
+
@cookbook_version.file_filenames = @cookbook[:file_filenames]
|
267
|
+
@cookbook_version.library_filenames = @cookbook[:library_filenames]
|
268
|
+
@cookbook_version.resource_filenames = @cookbook[:resource_filenames]
|
269
|
+
@cookbook_version.provider_filenames = @cookbook[:provider_filenames]
|
270
|
+
@cookbook_version.root_filenames = @cookbook[:root_filenames]
|
271
|
+
@cookbook_version.metadata_filenames = @cookbook[:metadata_filenames]
|
244
272
|
end
|
245
273
|
|
246
|
-
it "
|
247
|
-
|
248
|
-
|
274
|
+
it "generates a manifest containing the cookbook's files" do
|
275
|
+
manifest = @cookbook_version.manifest
|
276
|
+
|
277
|
+
manifest["metadata"].should == Chef::Cookbook::Metadata.new
|
278
|
+
manifest["cookbook_name"].should == "blarghle"
|
279
|
+
|
280
|
+
manifest["recipes"].should have(1).recipe_file
|
281
|
+
|
282
|
+
recipe = manifest["recipes"].first
|
283
|
+
recipe["name"].should == "default.rb"
|
284
|
+
recipe["path"].should == "recipes/default.rb"
|
285
|
+
recipe["checksum"].should match(MD5)
|
286
|
+
recipe["specificity"].should == "default"
|
287
|
+
|
288
|
+
manifest["definitions"].should have(1).definition_file
|
289
|
+
|
290
|
+
definition = manifest["definitions"].first
|
291
|
+
definition["name"].should == "runit_service.rb"
|
292
|
+
definition["path"].should == "definitions/runit_service.rb"
|
293
|
+
definition["checksum"].should match(MD5)
|
294
|
+
definition["specificity"].should == "default"
|
295
|
+
|
296
|
+
manifest["libraries"].should have(1).library_file
|
297
|
+
|
298
|
+
library = manifest["libraries"].first
|
299
|
+
library["name"].should == "ownage.rb"
|
300
|
+
library["path"].should == "libraries/ownage.rb"
|
301
|
+
library["checksum"].should match(MD5)
|
302
|
+
library["specificity"].should == "default"
|
303
|
+
|
304
|
+
manifest["attributes"].should have(1).attribute_file
|
305
|
+
|
306
|
+
attribute_file = manifest["attributes"].first
|
307
|
+
attribute_file["name"].should == "default.rb"
|
308
|
+
attribute_file["path"].should == "attributes/default.rb"
|
309
|
+
attribute_file["checksum"].should match(MD5)
|
310
|
+
attribute_file["specificity"].should == "default"
|
311
|
+
|
312
|
+
manifest["files"].should have(1).cookbook_file
|
313
|
+
|
314
|
+
cookbook_file = manifest["files"].first
|
315
|
+
cookbook_file["name"].should == "giant_blob.tgz"
|
316
|
+
cookbook_file["path"].should == "files/default/giant_blob.tgz"
|
317
|
+
cookbook_file["checksum"].should match(MD5)
|
318
|
+
cookbook_file["specificity"].should == "default"
|
319
|
+
|
320
|
+
manifest["templates"].should have(1).template
|
321
|
+
|
322
|
+
template = manifest["templates"].first
|
323
|
+
template["name"].should == "configuration.erb"
|
324
|
+
template["path"].should == "templates/default/configuration.erb"
|
325
|
+
template["checksum"].should match(MD5)
|
326
|
+
template["specificity"].should == "default"
|
327
|
+
|
328
|
+
manifest["resources"].should have(1).lwr
|
329
|
+
|
330
|
+
lwr = manifest["resources"].first
|
331
|
+
lwr["name"].should == "lwr.rb"
|
332
|
+
lwr["path"].should == "resources/lwr.rb"
|
333
|
+
lwr["checksum"].should match(MD5)
|
334
|
+
lwr["specificity"].should == "default"
|
335
|
+
|
336
|
+
manifest["providers"].should have(1).lwp
|
337
|
+
|
338
|
+
lwp = manifest["providers"].first
|
339
|
+
lwp["name"].should == "lwp.rb"
|
340
|
+
lwp["path"].should == "providers/lwp.rb"
|
341
|
+
lwp["checksum"].should match(MD5)
|
342
|
+
lwp["specificity"].should == "default"
|
343
|
+
|
344
|
+
manifest["root_files"].should have(1).file_in_the_cookbook_root
|
345
|
+
|
346
|
+
readme = manifest["root_files"].first
|
347
|
+
readme["name"].should == "README.rdoc"
|
348
|
+
readme["path"].should == "README.rdoc"
|
349
|
+
readme["checksum"].should match(MD5)
|
350
|
+
readme["specificity"].should == "default"
|
249
351
|
end
|
250
352
|
end
|
251
353
|
|
@@ -270,8 +372,8 @@ describe Chef::CookbookVersion do
|
|
270
372
|
["1.2", "2.1"]
|
271
373
|
]
|
272
374
|
examples.each do |smaller, larger|
|
273
|
-
sm = Chef::CookbookVersion.new("foo")
|
274
|
-
lg = Chef::CookbookVersion.new("foo")
|
375
|
+
sm = Chef::CookbookVersion.new("foo", '/tmp/blah')
|
376
|
+
lg = Chef::CookbookVersion.new("foo", '/tmp/blah')
|
275
377
|
sm.version = smaller
|
276
378
|
lg.version = larger
|
277
379
|
sm.should be < lg
|
@@ -281,8 +383,8 @@ describe Chef::CookbookVersion do
|
|
281
383
|
end
|
282
384
|
|
283
385
|
it "should equate versions 1.2 and 1.2.0" do
|
284
|
-
a = Chef::CookbookVersion.new("foo")
|
285
|
-
b = Chef::CookbookVersion.new("foo")
|
386
|
+
a = Chef::CookbookVersion.new("foo", '/tmp/blah')
|
387
|
+
b = Chef::CookbookVersion.new("foo", '/tmp/blah')
|
286
388
|
a.version = "1.2"
|
287
389
|
b.version = "1.2.0"
|
288
390
|
a.should == b
|
@@ -290,9 +392,9 @@ describe Chef::CookbookVersion do
|
|
290
392
|
|
291
393
|
|
292
394
|
it "should not allow you to sort cookbooks with different names" do
|
293
|
-
apt = Chef::CookbookVersion.new "apt"
|
395
|
+
apt = Chef::CookbookVersion.new "apt", '/tmp/blah'
|
294
396
|
apt.version = "1.0"
|
295
|
-
god = Chef::CookbookVersion.new "god"
|
397
|
+
god = Chef::CookbookVersion.new "god", '/tmp/blah'
|
296
398
|
god.version = "2.0"
|
297
399
|
lambda {apt <=> god}.should raise_error(Chef::Exceptions::CookbookVersionNameMismatch)
|
298
400
|
end
|
@@ -300,7 +402,7 @@ describe Chef::CookbookVersion do
|
|
300
402
|
|
301
403
|
describe "when you set a version" do
|
302
404
|
before do
|
303
|
-
@cbv = Chef::CookbookVersion.new("version validation")
|
405
|
+
@cbv = Chef::CookbookVersion.new("version validation", '/tmp/blah')
|
304
406
|
end
|
305
407
|
it "should accept valid cookbook versions" do
|
306
408
|
good_versions = %w(1.2 1.2.3 1000.80.50000 0.300.25)
|