chef 11.12.8 → 11.14.0.alpha.2
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 +164 -151
- 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
@@ -107,7 +107,7 @@ class Chef
|
|
107
107
|
def build_node
|
108
108
|
# Allow user to override the environment of a node by specifying
|
109
109
|
# a config parameter.
|
110
|
-
if Chef::Config[:environment] && !Chef::Config[:environment].
|
110
|
+
if Chef::Config[:environment] && !Chef::Config[:environment].chomp.empty?
|
111
111
|
node.chef_environment(Chef::Config[:environment])
|
112
112
|
end
|
113
113
|
|
@@ -82,7 +82,7 @@ class Chef
|
|
82
82
|
raise UnsupportedFeature, "Policyfile does not support setting the run_list in json data at this time"
|
83
83
|
end
|
84
84
|
|
85
|
-
if Chef::Config[:environment] && !Chef::Config[:environment].
|
85
|
+
if Chef::Config[:environment] && !Chef::Config[:environment].chomp.empty?
|
86
86
|
raise UnsupportedFeature, "Policyfile does not work with Chef Environments"
|
87
87
|
end
|
88
88
|
end
|
data/lib/chef/provider.rb
CHANGED
data/lib/chef/provider/git.rb
CHANGED
@@ -247,7 +247,7 @@ class Chef
|
|
247
247
|
else
|
248
248
|
@new_resource.revision + '*'
|
249
249
|
end
|
250
|
-
command = git("ls-remote \"#{@new_resource.repository}\""
|
250
|
+
command = git("ls-remote \"#{@new_resource.repository}\" \"#{rev_pattern}\"")
|
251
251
|
@resolved_reference = shell_out!(command, run_options).stdout
|
252
252
|
ref_lines = @resolved_reference.split("\n")
|
253
253
|
refs = ref_lines.map { |line| line.split("\t") }
|
data/lib/chef/provider/link.rb
CHANGED
@@ -99,13 +99,13 @@ class Chef
|
|
99
99
|
if @new_resource.link_type == :symbolic
|
100
100
|
converge_by("create symlink at #{@new_resource.target_file} to #{@new_resource.to}") do
|
101
101
|
file_class.symlink(canonicalize(@new_resource.to),@new_resource.target_file)
|
102
|
-
Chef::Log.debug("#{@new_resource} created #{@new_resource.link_type} link from #{@new_resource.
|
102
|
+
Chef::Log.debug("#{@new_resource} created #{@new_resource.link_type} link from #{@new_resource.target_file} -> #{@new_resource.to}")
|
103
103
|
Chef::Log.info("#{@new_resource} created")
|
104
104
|
end
|
105
105
|
elsif @new_resource.link_type == :hard
|
106
106
|
converge_by("create hard link at #{@new_resource.target_file} to #{@new_resource.to}") do
|
107
107
|
file_class.link(@new_resource.to, @new_resource.target_file)
|
108
|
-
Chef::Log.debug("#{@new_resource} created #{@new_resource.link_type} link from #{@new_resource.
|
108
|
+
Chef::Log.debug("#{@new_resource} created #{@new_resource.link_type} link from #{@new_resource.target_file} -> #{@new_resource.to}")
|
109
109
|
Chef::Log.info("#{@new_resource} created")
|
110
110
|
end
|
111
111
|
end
|
@@ -48,7 +48,7 @@ class Chef
|
|
48
48
|
begin
|
49
49
|
uri = URI.parse(source)
|
50
50
|
raw_file = grab_file_from_uri(uri)
|
51
|
-
rescue SocketError, Errno::ECONNREFUSED, Errno::ENOENT, Errno::EACCES, Timeout::Error, Net::HTTPFatalError, Net::FTPError => e
|
51
|
+
rescue SocketError, Errno::ECONNREFUSED, Errno::ENOENT, Errno::EACCES, Timeout::Error, Net::HTTPServerException, Net::HTTPFatalError, Net::FTPError => e
|
52
52
|
Chef::Log.warn("#{@new_resource} cannot be downloaded from #{source}: #{e.to_s}")
|
53
53
|
if source = sources.shift
|
54
54
|
Chef::Log.info("#{@new_resource} trying to download from another mirror")
|
@@ -32,12 +32,18 @@ class Chef
|
|
32
32
|
@new_resource = new_resource
|
33
33
|
@uri = uri
|
34
34
|
end
|
35
|
+
|
36
|
+
# CHEF-4472: Remove the leading slash from windows paths that we receive from a file:// URI
|
37
|
+
def fix_windows_path(path)
|
38
|
+
path.gsub(/^\/([a-zA-Z]:)/,'\1')
|
39
|
+
end
|
35
40
|
|
36
41
|
# Fetches the file at uri, returning a Tempfile-like File handle
|
37
42
|
def fetch
|
43
|
+
source_path = Chef::Platform.windows? ? fix_windows_path(uri.path) : uri.path
|
38
44
|
tempfile = Chef::FileContentManagement::Tempfile.new(new_resource).tempfile
|
39
|
-
Chef::Log.debug("#{new_resource} staging #{
|
40
|
-
FileUtils.cp(
|
45
|
+
Chef::Log.debug("#{new_resource} staging #{source_path} to #{tempfile.path}")
|
46
|
+
FileUtils.cp(source_path, tempfile.path)
|
41
47
|
tempfile.close if tempfile
|
42
48
|
tempfile
|
43
49
|
end
|
data/lib/chef/provider/user.rb
CHANGED
@@ -103,8 +103,8 @@ class Chef
|
|
103
103
|
end
|
104
104
|
requirements.assert(:modify, :lock, :unlock) do |a|
|
105
105
|
a.assertion { @user_exists }
|
106
|
-
a.failure_message(Chef::Exceptions::User, "Cannot modify user #{@new_resource} - does not exist!")
|
107
|
-
a.whyrun("Assuming user #{@new_resource} would have been created")
|
106
|
+
a.failure_message(Chef::Exceptions::User, "Cannot modify user #{@new_resource.username} - does not exist!")
|
107
|
+
a.whyrun("Assuming user #{@new_resource.username} would have been created")
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
@@ -128,12 +128,12 @@ class Chef
|
|
128
128
|
def action_create
|
129
129
|
|
130
130
|
if !@user_exists
|
131
|
-
converge_by("create user #{@new_resource}") do
|
131
|
+
converge_by("create user #{@new_resource.username}") do
|
132
132
|
create_user
|
133
133
|
Chef::Log.info("#{@new_resource} created")
|
134
134
|
end
|
135
135
|
elsif compare_user
|
136
|
-
converge_by("alter user #{@new_resource}") do
|
136
|
+
converge_by("alter user #{@new_resource.username}") do
|
137
137
|
manage_user
|
138
138
|
Chef::Log.info("#{@new_resource} altered")
|
139
139
|
end
|
@@ -142,7 +142,7 @@ class Chef
|
|
142
142
|
|
143
143
|
def action_remove
|
144
144
|
if @user_exists
|
145
|
-
converge_by("remove user #{@new_resource}") do
|
145
|
+
converge_by("remove user #{@new_resource.username}") do
|
146
146
|
remove_user
|
147
147
|
Chef::Log.info("#{@new_resource} removed")
|
148
148
|
end
|
@@ -155,7 +155,7 @@ class Chef
|
|
155
155
|
|
156
156
|
def action_manage
|
157
157
|
if @user_exists && compare_user
|
158
|
-
converge_by("manage user #{@new_resource}") do
|
158
|
+
converge_by("manage user #{@new_resource.username}") do
|
159
159
|
manage_user
|
160
160
|
Chef::Log.info("#{@new_resource} managed")
|
161
161
|
end
|
@@ -168,7 +168,7 @@ class Chef
|
|
168
168
|
|
169
169
|
def action_modify
|
170
170
|
if compare_user
|
171
|
-
converge_by("modify user #{@new_resource}") do
|
171
|
+
converge_by("modify user #{@new_resource.username}") do
|
172
172
|
manage_user
|
173
173
|
Chef::Log.info("#{@new_resource} modified")
|
174
174
|
end
|
@@ -177,7 +177,7 @@ class Chef
|
|
177
177
|
|
178
178
|
def action_lock
|
179
179
|
if check_lock() == false
|
180
|
-
converge_by("lock the user #{@new_resource}") do
|
180
|
+
converge_by("lock the user #{@new_resource.username}") do
|
181
181
|
lock_user
|
182
182
|
Chef::Log.info("#{@new_resource} locked")
|
183
183
|
end
|
@@ -196,7 +196,7 @@ class Chef
|
|
196
196
|
|
197
197
|
def action_unlock
|
198
198
|
if check_lock() == true
|
199
|
-
converge_by("unlock user #{@new_resource}") do
|
199
|
+
converge_by("unlock user #{@new_resource.username}") do
|
200
200
|
unlock_user
|
201
201
|
Chef::Log.info("#{@new_resource} unlocked")
|
202
202
|
end
|
data/lib/chef/resource.rb
CHANGED
@@ -40,13 +40,37 @@ class Chef
|
|
40
40
|
@provider = Chef::Provider::RemoteFile
|
41
41
|
end
|
42
42
|
|
43
|
+
# source can take any of the following as arguments
|
44
|
+
# - A single string argument
|
45
|
+
# - Multiple string arguments
|
46
|
+
# - An array or strings
|
47
|
+
# - A delayed evaluator that evaluates to a string
|
48
|
+
# or array of strings
|
49
|
+
# All strings must be parsable as URIs.
|
50
|
+
# source returns an array of strings.
|
43
51
|
def source(*args)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
52
|
+
arg = parse_source_args(args)
|
53
|
+
ret = set_or_return(:source,
|
54
|
+
arg,
|
55
|
+
{ :callbacks => {
|
56
|
+
:validate_source => method(:validate_source)
|
57
|
+
}})
|
58
|
+
if ret.is_a? String
|
59
|
+
Array(ret)
|
60
|
+
else
|
61
|
+
ret
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def parse_source_args(args)
|
66
|
+
if args.empty?
|
67
|
+
nil
|
68
|
+
elsif args[0].is_a?(Chef::DelayedEvaluator) && args.count == 1
|
69
|
+
args[0]
|
70
|
+
elsif args.any? {|a| a.is_a?(Chef::DelayedEvaluator)} && args.count > 1
|
71
|
+
raise Exceptions::InvalidRemoteFileURI, "Only 1 source argument allowed when using a lazy evaluator"
|
72
|
+
else
|
73
|
+
Array(args).flatten
|
50
74
|
end
|
51
75
|
end
|
52
76
|
|
@@ -107,6 +131,7 @@ class Chef
|
|
107
131
|
private
|
108
132
|
|
109
133
|
def validate_source(source)
|
134
|
+
source = Array(source).flatten
|
110
135
|
raise ArgumentError, "#{resource_name} has an empty source" if source.empty?
|
111
136
|
source.each do |src|
|
112
137
|
unless absolute_uri?(src)
|
@@ -114,6 +139,7 @@ class Chef
|
|
114
139
|
"#{src.inspect} is not a valid `source` parameter for #{resource_name}. `source` must be an absolute URI or an array of URIs."
|
115
140
|
end
|
116
141
|
end
|
142
|
+
true
|
117
143
|
end
|
118
144
|
|
119
145
|
def absolute_uri?(source)
|
data/lib/chef/run_context.rb
CHANGED
@@ -24,6 +24,7 @@ require 'chef/role'
|
|
24
24
|
require 'chef/log'
|
25
25
|
require 'chef/recipe'
|
26
26
|
require 'chef/run_context/cookbook_compiler'
|
27
|
+
require 'chef/event_dispatch/events_output_stream'
|
27
28
|
|
28
29
|
class Chef
|
29
30
|
|
@@ -249,6 +250,27 @@ ERROR_MESSAGE
|
|
249
250
|
@cookbook_compiler.unreachable_cookbook?(cookbook_name)
|
250
251
|
end
|
251
252
|
|
253
|
+
# Open a stream object that can be printed into and will dispatch to events
|
254
|
+
#
|
255
|
+
# == Arguments
|
256
|
+
# options is a hash with these possible options:
|
257
|
+
# - name: a string that identifies the stream to the user. Preferably short.
|
258
|
+
#
|
259
|
+
# Pass a block and the stream will be yielded to it, and close on its own
|
260
|
+
# at the end of the block.
|
261
|
+
def open_stream(options = {})
|
262
|
+
stream = EventDispatch::EventsOutputStream.new(events, options)
|
263
|
+
if block_given?
|
264
|
+
begin
|
265
|
+
yield stream
|
266
|
+
ensure
|
267
|
+
stream.close
|
268
|
+
end
|
269
|
+
else
|
270
|
+
stream
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
252
274
|
private
|
253
275
|
|
254
276
|
def loaded_recipe(cookbook, recipe)
|
data/lib/chef/run_lock.rb
CHANGED
@@ -20,6 +20,9 @@ require 'fcntl'
|
|
20
20
|
if Chef::Platform.windows?
|
21
21
|
require 'chef/win32/mutex'
|
22
22
|
end
|
23
|
+
require 'chef/config'
|
24
|
+
require 'chef/exceptions'
|
25
|
+
require 'timeout'
|
23
26
|
|
24
27
|
class Chef
|
25
28
|
|
@@ -43,10 +46,13 @@ class Chef
|
|
43
46
|
@runlock_file = lockfile
|
44
47
|
@runlock = nil
|
45
48
|
@mutex = nil
|
49
|
+
@runpid = nil
|
46
50
|
end
|
47
51
|
|
48
52
|
# Acquire the system-wide lock. Will block indefinitely if another process
|
49
|
-
# already has the lock
|
53
|
+
# already has the lock and Chef::Config[:run_lock_timeout] is
|
54
|
+
# not set. Otherwise will block for Chef::Config[:run_lock_timeout]
|
55
|
+
# seconds and exit if the lock is not acquired.
|
50
56
|
#
|
51
57
|
# Each call to acquire should have a corresponding call to #release.
|
52
58
|
#
|
@@ -55,7 +61,23 @@ class Chef
|
|
55
61
|
# Either acquire() or test() methods should be called in order to
|
56
62
|
# get the ownership of run_lock.
|
57
63
|
def acquire
|
58
|
-
|
64
|
+
if timeout_given?
|
65
|
+
begin
|
66
|
+
Timeout::timeout(time_to_wait) do
|
67
|
+
unless test
|
68
|
+
if time_to_wait > 0.0
|
69
|
+
wait
|
70
|
+
else
|
71
|
+
exit_from_timeout
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
rescue Timeout::Error => e
|
76
|
+
exit_from_timeout
|
77
|
+
end
|
78
|
+
else
|
79
|
+
wait unless test
|
80
|
+
end
|
59
81
|
end
|
60
82
|
|
61
83
|
#
|
@@ -92,7 +114,6 @@ class Chef
|
|
92
114
|
# Waits until acquiring the system-wide lock.
|
93
115
|
#
|
94
116
|
def wait
|
95
|
-
runpid = runlock.read.strip.chomp
|
96
117
|
Chef::Log.warn("Chef client #{runpid} is running, will wait for it to finish and then run.")
|
97
118
|
if Chef::Platform.windows?
|
98
119
|
mutex.wait
|
@@ -131,6 +152,7 @@ class Chef
|
|
131
152
|
def reset
|
132
153
|
@runlock = nil
|
133
154
|
@mutex = nil
|
155
|
+
@runpid = nil
|
134
156
|
end
|
135
157
|
|
136
158
|
# Since flock mechanism doesn't exist on windows we are using
|
@@ -144,6 +166,23 @@ class Chef
|
|
144
166
|
@mutex = Chef::ReservedNames::Win32::Mutex.new("Global\\#{runlock_file.gsub(/[\\]/, "/").downcase}")
|
145
167
|
mutex.test
|
146
168
|
end
|
169
|
+
|
170
|
+
def runpid
|
171
|
+
@runpid ||= runlock.read.strip
|
172
|
+
end
|
173
|
+
|
174
|
+
def timeout_given?
|
175
|
+
!time_to_wait.nil?
|
176
|
+
end
|
177
|
+
|
178
|
+
def time_to_wait
|
179
|
+
Chef::Config[:run_lock_timeout]
|
180
|
+
end
|
181
|
+
|
182
|
+
def exit_from_timeout
|
183
|
+
rp = runpid
|
184
|
+
release # Just to be on the safe side...
|
185
|
+
raise Chef::Exceptions::RunLockTimeout.new(time_to_wait, rp)
|
186
|
+
end
|
147
187
|
end
|
148
188
|
end
|
149
|
-
|