chef 0.9.8 → 0.9.10.rc.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -1
- data/distro/common/man/man8/knife.8 +89 -79
- data/distro/common/markdown/knife.mkd +7 -0
- data/distro/debian/etc/default/chef-server +3 -0
- data/distro/debian/etc/default/chef-server-webui +3 -0
- data/distro/debian/etc/default/chef-solr +3 -0
- data/distro/debian/etc/default/chef-solr-indexer +3 -0
- data/distro/debian/etc/init.d/chef-server +3 -1
- data/distro/debian/etc/init.d/chef-server-webui +3 -1
- data/distro/redhat/etc/init.d/chef-client +1 -1
- data/lib/chef/application.rb +2 -0
- data/lib/chef/application/client.rb +5 -3
- data/lib/chef/application/knife.rb +16 -5
- data/lib/chef/application/solo.rb +0 -1
- data/lib/chef/checksum.rb +65 -1
- data/lib/chef/checksum_cache.rb +173 -0
- data/lib/chef/client.rb +84 -121
- data/lib/chef/cookbook/remote_file_vendor.rb +10 -3
- data/lib/chef/cookbook/syntax_check.rb +2 -2
- data/lib/chef/cookbook_loader.rb +2 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +29 -0
- data/lib/chef/cookbook_uploader.rb +8 -7
- data/lib/chef/cookbook_version.rb +155 -114
- data/lib/chef/exceptions.rb +5 -0
- data/lib/chef/handler.rb +43 -0
- data/lib/chef/index_queue/consumer.rb +1 -1
- data/lib/chef/index_queue/indexable.rb +1 -1
- data/lib/chef/knife.rb +18 -5
- data/lib/chef/knife/bootstrap.rb +2 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
- data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -7
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/configure_client.rb +4 -2
- data/lib/chef/knife/cookbook_metadata.rb +1 -1
- data/lib/chef/knife/cookbook_site_share.rb +2 -1
- data/lib/chef/knife/cookbook_site_vendor.rb +6 -0
- data/lib/chef/knife/cookbook_test.rb +1 -1
- data/lib/chef/knife/ec2_server_create.rb +51 -26
- data/lib/chef/knife/exec.rb +52 -0
- data/lib/chef/knife/ssh.rb +27 -15
- data/lib/chef/knife/status.rb +27 -10
- data/lib/chef/knife/windows_bootstrap.rb +154 -0
- data/lib/chef/mixin/checksum.rb +2 -2
- data/lib/chef/mixin/xml_escape.rb +75 -49
- data/lib/chef/node.rb +54 -58
- data/lib/chef/node/attribute.rb +61 -53
- data/lib/chef/platform.rb +19 -2
- data/lib/chef/provider/breakpoint.rb +1 -1
- data/lib/chef/provider/cookbook_file.rb +3 -3
- data/lib/chef/provider/cron.rb +3 -3
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/deploy.rb +3 -3
- data/lib/chef/provider/directory.rb +2 -2
- data/lib/chef/provider/env.rb +5 -5
- data/lib/chef/provider/execute.rb +1 -1
- data/lib/chef/provider/file.rb +10 -9
- data/lib/chef/provider/git.rb +12 -4
- data/lib/chef/provider/group.rb +5 -5
- data/lib/chef/provider/http_request.rb +25 -9
- data/lib/chef/provider/ifconfig.rb +2 -2
- data/lib/chef/provider/link.rb +11 -6
- data/lib/chef/provider/log.rb +1 -0
- data/lib/chef/provider/mdadm.rb +3 -3
- data/lib/chef/provider/mount.rb +5 -5
- data/lib/chef/provider/mount/mount.rb +1 -1
- data/lib/chef/provider/ohai.rb +41 -0
- data/lib/chef/provider/package.rb +5 -5
- data/lib/chef/provider/package/yum-dump.py +5 -2
- data/lib/chef/provider/remote_directory.rb +11 -5
- data/lib/chef/provider/remote_file.rb +2 -2
- data/lib/chef/provider/route.rb +154 -133
- data/lib/chef/provider/ruby_block.rb +1 -1
- data/lib/chef/provider/service.rb +6 -6
- data/lib/chef/provider/subversion.rb +12 -9
- data/lib/chef/provider/template.rb +2 -2
- data/lib/chef/provider/user.rb +7 -7
- data/lib/chef/provider/user/useradd.rb +15 -1
- data/lib/chef/providers.rb +2 -0
- data/lib/chef/resource.rb +164 -58
- data/lib/chef/resource/http_request.rb +9 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/remote_directory.rb +10 -1
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource_collection.rb +3 -2
- data/lib/chef/resources.rb +2 -0
- data/lib/chef/rest.rb +13 -7
- data/lib/chef/rest/auth_credentials.rb +1 -1
- data/lib/chef/rest/rest_request.rb +3 -1
- data/lib/chef/runner.rb +31 -55
- data/lib/chef/shef/shef_session.rb +1 -1
- data/lib/chef/util/windows/net_use.rb +1 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/webui_user.rb +0 -1
- metadata +38 -19
- data/lib/chef/cache.rb +0 -61
- data/lib/chef/cache/checksum.rb +0 -91
@@ -36,7 +36,7 @@ class Chef
|
|
36
36
|
else
|
37
37
|
Chef::Log.debug("#{@new_resource}: attempting to enable")
|
38
38
|
if enable_service
|
39
|
-
@new_resource.
|
39
|
+
@new_resource.updated_by_last_action(true)
|
40
40
|
Chef::Log.info("#{@new_resource}: enabled successfully")
|
41
41
|
end
|
42
42
|
end
|
@@ -46,7 +46,7 @@ class Chef
|
|
46
46
|
if @current_resource.enabled
|
47
47
|
Chef::Log.debug("#{@new_resource}: attempting to disable")
|
48
48
|
if disable_service
|
49
|
-
@new_resource.
|
49
|
+
@new_resource.updated_by_last_action(true)
|
50
50
|
Chef::Log.info("#{@new_resource}: disabled successfully")
|
51
51
|
end
|
52
52
|
else
|
@@ -58,7 +58,7 @@ class Chef
|
|
58
58
|
unless @current_resource.running
|
59
59
|
Chef::Log.debug("#{@new_resource}: attempting to start")
|
60
60
|
if start_service
|
61
|
-
@new_resource.
|
61
|
+
@new_resource.updated_by_last_action(true)
|
62
62
|
Chef::Log.info("Started service #{@new_resource} successfully")
|
63
63
|
end
|
64
64
|
else
|
@@ -70,7 +70,7 @@ class Chef
|
|
70
70
|
if @current_resource.running
|
71
71
|
Chef::Log.debug("#{@new_resource}: attempting to stop")
|
72
72
|
if stop_service
|
73
|
-
@new_resource.
|
73
|
+
@new_resource.updated_by_last_action(true)
|
74
74
|
Chef::Log.info("#{@new_resource}: stopped successfully")
|
75
75
|
end
|
76
76
|
else
|
@@ -81,7 +81,7 @@ class Chef
|
|
81
81
|
def action_restart
|
82
82
|
Chef::Log.debug("#{@new_resource}: attempting to restart")
|
83
83
|
if restart_service
|
84
|
-
@new_resource.
|
84
|
+
@new_resource.updated_by_last_action(true)
|
85
85
|
Chef::Log.info("#{@new_resource}: restarted successfully")
|
86
86
|
end
|
87
87
|
end
|
@@ -93,7 +93,7 @@ class Chef
|
|
93
93
|
if @current_resource.running
|
94
94
|
Chef::Log.debug("#{@new_resource}: attempting to reload")
|
95
95
|
if reload_service
|
96
|
-
@new_resource.
|
96
|
+
@new_resource.updated_by_last_action(true)
|
97
97
|
Chef::Log.info("#{@new_resource}: reloaded successfully")
|
98
98
|
end
|
99
99
|
end
|
@@ -30,24 +30,27 @@ class Chef
|
|
30
30
|
|
31
31
|
def load_current_resource
|
32
32
|
@current_resource = Chef::Resource::Subversion.new(@new_resource.name)
|
33
|
-
|
34
|
-
|
33
|
+
|
34
|
+
unless [:export, :force_export].include?(@new_resource.action.first)
|
35
|
+
if current_revision = find_current_revision
|
36
|
+
@current_resource.revision current_revision
|
37
|
+
end
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
38
41
|
def action_checkout
|
39
42
|
run_command(run_options(:command => checkout_command))
|
40
|
-
@new_resource.
|
43
|
+
@new_resource.updated_by_last_action(true)
|
41
44
|
end
|
42
45
|
|
43
46
|
def action_export
|
44
47
|
run_command(run_options(:command => export_command))
|
45
|
-
@new_resource.
|
48
|
+
@new_resource.updated_by_last_action(true)
|
46
49
|
end
|
47
50
|
|
48
51
|
def action_force_export
|
49
|
-
run_command(run_options(:command => export_command
|
50
|
-
@new_resource.
|
52
|
+
run_command(run_options(:command => export_command))
|
53
|
+
@new_resource.updated_by_last_action(true)
|
51
54
|
end
|
52
55
|
|
53
56
|
def action_sync
|
@@ -56,7 +59,7 @@ class Chef
|
|
56
59
|
else
|
57
60
|
run_command(run_options(:command => sync_command))
|
58
61
|
end
|
59
|
-
@new_resource.
|
62
|
+
@new_resource.updated_by_last_action(true)
|
60
63
|
end
|
61
64
|
|
62
65
|
def sync_command
|
@@ -70,9 +73,9 @@ class Chef
|
|
70
73
|
"-r#{revision_int}", @new_resource.repository, @new_resource.destination
|
71
74
|
end
|
72
75
|
|
73
|
-
def export_command
|
76
|
+
def export_command
|
74
77
|
Chef::Log.info "exporting #{@new_resource.repository} at revision #{@new_resource.revision} to #{@new_resource.destination}"
|
75
|
-
args =
|
78
|
+
args = ["--force"]
|
76
79
|
args << @new_resource.svn_arguments << verbose << authentication <<
|
77
80
|
"-r#{revision_int}" << @new_resource.repository << @new_resource.destination
|
78
81
|
scm :export, *args
|
@@ -46,7 +46,7 @@ class Chef
|
|
46
46
|
backup
|
47
47
|
set_all_access_controls(rendered_template.path)
|
48
48
|
FileUtils.mv(rendered_template.path, @new_resource.path)
|
49
|
-
@new_resource.
|
49
|
+
@new_resource.updated_by_last_action(true)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -88,7 +88,7 @@ class Chef
|
|
88
88
|
def set_all_access_controls(file)
|
89
89
|
access_controls = Chef::FileAccessControl.new(@new_resource, file)
|
90
90
|
access_controls.set_all
|
91
|
-
@new_resource.
|
91
|
+
@new_resource.updated_by_last_action(access_controls.modified?)
|
92
92
|
end
|
93
93
|
|
94
94
|
private
|
data/lib/chef/provider/user.rb
CHANGED
@@ -98,18 +98,18 @@ class Chef
|
|
98
98
|
if !@user_exists
|
99
99
|
create_user
|
100
100
|
Chef::Log.info("Created #{@new_resource}")
|
101
|
-
@new_resource.
|
101
|
+
@new_resource.updated_by_last_action(true)
|
102
102
|
elsif compare_user
|
103
103
|
manage_user
|
104
104
|
Chef::Log.info("Altered #{@new_resource}")
|
105
|
-
@new_resource.
|
105
|
+
@new_resource.updated_by_last_action(true)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
def action_remove
|
110
110
|
if @user_exists
|
111
111
|
remove_user
|
112
|
-
@new_resource.
|
112
|
+
@new_resource.updated_by_last_action(true)
|
113
113
|
Chef::Log.info("Removed #{@new_resource}")
|
114
114
|
end
|
115
115
|
end
|
@@ -121,7 +121,7 @@ class Chef
|
|
121
121
|
def action_manage
|
122
122
|
if @user_exists && compare_user
|
123
123
|
manage_user
|
124
|
-
@new_resource.
|
124
|
+
@new_resource.updated_by_last_action(true)
|
125
125
|
Chef::Log.info("Managed #{@new_resource}")
|
126
126
|
end
|
127
127
|
end
|
@@ -134,7 +134,7 @@ class Chef
|
|
134
134
|
if @user_exists
|
135
135
|
if compare_user
|
136
136
|
manage_user
|
137
|
-
@new_resource.
|
137
|
+
@new_resource.updated_by_last_action(true)
|
138
138
|
Chef::Log.info("Modified #{@new_resource}")
|
139
139
|
end
|
140
140
|
else
|
@@ -146,7 +146,7 @@ class Chef
|
|
146
146
|
if @user_exists
|
147
147
|
if check_lock() == false
|
148
148
|
lock_user
|
149
|
-
@new_resource.
|
149
|
+
@new_resource.updated_by_last_action(true)
|
150
150
|
Chef::Log.info("Locked #{@new_resource}")
|
151
151
|
else
|
152
152
|
Chef::Log.debug("No need to lock #{@new_resource}")
|
@@ -168,7 +168,7 @@ class Chef
|
|
168
168
|
if @user_exists
|
169
169
|
if check_lock() == true
|
170
170
|
unlock_user
|
171
|
-
@new_resource.
|
171
|
+
@new_resource.updated_by_last_action(true)
|
172
172
|
Chef::Log.info("Unlocked #{@new_resource}")
|
173
173
|
else
|
174
174
|
Chef::Log.debug("No need to unlock #{@new_resource}")
|
@@ -55,7 +55,21 @@ class Chef
|
|
55
55
|
end
|
56
56
|
|
57
57
|
unless status.exitstatus == 0
|
58
|
-
|
58
|
+
raise_lock_error = false
|
59
|
+
# we can get an exit code of 1 even when it's successful on rhel/centos (redhat bug 578534)
|
60
|
+
if status.exitstatus == 1 && ['redhat', 'centos'].include?(node[:platform])
|
61
|
+
passwd_version_status = popen4('rpm -q passwd') do |pid, stdin, stdout, stderr|
|
62
|
+
passwd_version = stdout.gets.chomp
|
63
|
+
|
64
|
+
unless passwd_version == 'passwd-0.73-1'
|
65
|
+
raise_lock_error = true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
else
|
69
|
+
raise_lock_error = true
|
70
|
+
end
|
71
|
+
|
72
|
+
raise Chef::Exceptions::User, "Cannot determine if #{@new_resource} is locked!" if raise_lock_error
|
59
73
|
end
|
60
74
|
|
61
75
|
@locked
|
data/lib/chef/providers.rb
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
require 'chef/provider/breakpoint'
|
20
20
|
require 'chef/provider/cookbook_file'
|
21
21
|
require 'chef/provider/cron'
|
22
|
+
require 'chef/provider/cron/solaris'
|
22
23
|
require 'chef/provider/deploy'
|
23
24
|
require 'chef/provider/directory'
|
24
25
|
require 'chef/provider/env'
|
@@ -31,6 +32,7 @@ require 'chef/provider/http_request'
|
|
31
32
|
require 'chef/provider/ifconfig'
|
32
33
|
require 'chef/provider/link'
|
33
34
|
require 'chef/provider/log'
|
35
|
+
require 'chef/provider/ohai'
|
34
36
|
require 'chef/provider/mdadm'
|
35
37
|
require 'chef/provider/mount'
|
36
38
|
require 'chef/provider/package'
|
data/lib/chef/resource.rb
CHANGED
@@ -21,6 +21,7 @@ require 'chef/mixin/params_validate'
|
|
21
21
|
require 'chef/mixin/check_helper'
|
22
22
|
require 'chef/mixin/language'
|
23
23
|
require 'chef/mixin/convert_to_class_name'
|
24
|
+
require 'chef/mixin/command'
|
24
25
|
require 'chef/resource_collection'
|
25
26
|
require 'chef/node'
|
26
27
|
|
@@ -28,7 +29,45 @@ require 'chef/mixin/deprecation'
|
|
28
29
|
|
29
30
|
class Chef
|
30
31
|
class Resource
|
31
|
-
class Notification < Struct.new(:resource, :action)
|
32
|
+
class Notification < Struct.new(:resource, :action, :notifying_resource)
|
33
|
+
|
34
|
+
def duplicates?(other_notification)
|
35
|
+
unless other_notification.respond_to?(:resource) && other_notification.respond_to?(:action)
|
36
|
+
msg = "only duck-types of Chef::Resource::Notification can be checked for duplication "\
|
37
|
+
"you gave #{other_notification.inspect}"
|
38
|
+
raise ArgumentError, msg
|
39
|
+
end
|
40
|
+
other_notification.resource == resource && other_notification.action == action
|
41
|
+
end
|
42
|
+
|
43
|
+
def resolve_resource_reference(resource_collection)
|
44
|
+
return resource if resource.kind_of?(Chef::Resource)
|
45
|
+
|
46
|
+
matching_resource = resource_collection.find(resource)
|
47
|
+
if Array(matching_resource).size > 1
|
48
|
+
msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple resources, "\
|
49
|
+
"but can only notify one resource. Notifying resource was defined on #{notifying_resource.source_line}"
|
50
|
+
raise Chef::Exceptions::InvalidResourceReference, msg
|
51
|
+
end
|
52
|
+
self.resource = matching_resource
|
53
|
+
rescue Chef::Exceptions::ResourceNotFound => e
|
54
|
+
err = Chef::Exceptions::ResourceNotFound.new(<<-FAIL)
|
55
|
+
Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
|
56
|
+
but #{resource} cannot be found in the resource collection. #{notifying_resource} is defined in \
|
57
|
+
#{notifying_resource.source_line}
|
58
|
+
FAIL
|
59
|
+
err.set_backtrace(e.backtrace)
|
60
|
+
raise err
|
61
|
+
rescue Chef::Exceptions::InvalidResourceSpecification => e
|
62
|
+
err = Chef::Exceptions::InvalidResourceSpecification.new(<<-F)
|
63
|
+
Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
|
64
|
+
but #{resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
|
65
|
+
is defined near #{notifying_resource.source_line}
|
66
|
+
F
|
67
|
+
err.set_backtrace(e.backtrace)
|
68
|
+
raise err
|
69
|
+
end
|
70
|
+
|
32
71
|
end
|
33
72
|
|
34
73
|
HIDDEN_IVARS = [:@allowed_actions, :@resource_name, :@source_line, :@run_context, :@name, :@node]
|
@@ -39,13 +78,25 @@ class Chef
|
|
39
78
|
include Chef::Mixin::ConvertToClassName
|
40
79
|
include Chef::Mixin::Deprecation
|
41
80
|
|
42
|
-
attr_accessor :params
|
81
|
+
attr_accessor :params
|
82
|
+
attr_accessor :provider
|
83
|
+
attr_accessor :allowed_actions
|
84
|
+
attr_accessor :run_context
|
85
|
+
attr_accessor :cookbook_name
|
86
|
+
attr_accessor :recipe_name
|
87
|
+
attr_accessor :enclosing_provider
|
43
88
|
attr_accessor :source_line
|
44
|
-
|
89
|
+
|
90
|
+
attr_reader :updated
|
91
|
+
|
92
|
+
attr_reader :resource_name
|
93
|
+
attr_reader :not_if_args
|
94
|
+
attr_reader :only_if_args
|
45
95
|
|
46
96
|
# Each notify entry is a resource/action pair, modeled as an
|
47
|
-
#
|
48
|
-
attr_reader :
|
97
|
+
# Struct with a #resource and #action member
|
98
|
+
attr_reader :immediate_notifications
|
99
|
+
attr_reader :delayed_notifications
|
49
100
|
|
50
101
|
def initialize(name, run_context=nil)
|
51
102
|
@name = name
|
@@ -57,19 +108,28 @@ class Chef
|
|
57
108
|
@allowed_actions = [ :nothing ]
|
58
109
|
@action = :nothing
|
59
110
|
@updated = false
|
111
|
+
@updated_by_last_action = false
|
60
112
|
@supports = {}
|
61
113
|
@ignore_failure = false
|
62
114
|
@not_if = nil
|
63
115
|
@not_if_args = {}
|
64
116
|
@only_if = nil
|
65
117
|
@only_if_args = {}
|
66
|
-
@
|
67
|
-
@
|
118
|
+
@immediate_notifications = Array.new
|
119
|
+
@delayed_notifications = Array.new
|
68
120
|
@source_line = nil
|
69
121
|
|
70
122
|
@node = run_context ? deprecated_ivar(run_context.node, :node, :warn) : nil
|
71
123
|
end
|
72
|
-
|
124
|
+
|
125
|
+
def updated=(true_or_false)
|
126
|
+
Chef::Log.warn("Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.")
|
127
|
+
Chef::Log.warn("Called from:")
|
128
|
+
caller[0..3].each {|line| Chef::Log.warn(line)}
|
129
|
+
updated_by_last_action(true_or_false)
|
130
|
+
@updated = true_or_false
|
131
|
+
end
|
132
|
+
|
73
133
|
def node
|
74
134
|
run_context && run_context.node
|
75
135
|
end
|
@@ -95,7 +155,7 @@ class Chef
|
|
95
155
|
end
|
96
156
|
end
|
97
157
|
true
|
98
|
-
rescue
|
158
|
+
rescue Chef::Exceptions::ResourceNotFound => e
|
99
159
|
true
|
100
160
|
end
|
101
161
|
end
|
@@ -166,31 +226,65 @@ class Chef
|
|
166
226
|
def epic_fail(arg=nil)
|
167
227
|
ignore_failure(arg)
|
168
228
|
end
|
169
|
-
|
229
|
+
|
170
230
|
def notifies(*args)
|
171
|
-
|
172
|
-
|
173
|
-
|
231
|
+
unless ( args.size > 0 && args.size < 4)
|
232
|
+
raise ArgumentError, "Wrong number of arguments for notifies: should be 1-3 arguments, you gave #{args.inspect}"
|
233
|
+
end
|
234
|
+
|
235
|
+
if args.size > 1 # notifies(:action, resource) OR notifies(:action, resource, :immediately)
|
236
|
+
add_notification(*args)
|
174
237
|
else
|
175
238
|
# This syntax is so weird. surely people will just give us one hash?
|
176
239
|
notifications = args.flatten
|
177
240
|
notifications.each do |resources_notifications|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
end
|
183
|
-
rescue NoMethodError
|
184
|
-
Chef::Log.fatal("encountered NME processing resource #{resources_notifications.inspect}")
|
185
|
-
Chef::Log.fatal("incoming args: #{args.inspect}")
|
186
|
-
raise
|
241
|
+
resources_notifications.each do |resource, notification|
|
242
|
+
action, timing = notification[0], notification[1]
|
243
|
+
Chef::Log.debug "adding notification from resource #{self} to `#{resource.inspect}' => `#{notification.inspect}'"
|
244
|
+
add_notification(action, resource, timing)
|
187
245
|
end
|
188
246
|
end
|
189
247
|
end
|
248
|
+
rescue NoMethodError
|
249
|
+
Chef::Log.fatal("Error processing notifies(#{args.inspect}) on #{self}")
|
250
|
+
raise
|
190
251
|
end
|
191
|
-
|
252
|
+
|
253
|
+
def add_notification(action, resources, timing=:delayed)
|
254
|
+
resources = [resources].flatten
|
255
|
+
resources.each do |resource|
|
256
|
+
case timing.to_s
|
257
|
+
when 'delayed'
|
258
|
+
notifies_delayed(action, resource)
|
259
|
+
when 'immediate', 'immediately'
|
260
|
+
notifies_immediately(action, resource)
|
261
|
+
else
|
262
|
+
raise ArgumentError, "invalid timing: #{timing} for notifies(#{action}, #{resources.inspect}, #{timing}) resource #{self} "\
|
263
|
+
"Valid timings are: :delayed, :immediate, :immediately"
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
true
|
268
|
+
end
|
269
|
+
|
270
|
+
# Iterates over all immediate and delayed notifications, calling
|
271
|
+
# resolve_resource_reference on each in turn, causing them to
|
272
|
+
# resolve lazy/forward references.
|
273
|
+
def resolve_notification_references
|
274
|
+
@immediate_notifications.each { |n| n.resolve_resource_reference(run_context.resource_collection) }
|
275
|
+
@delayed_notifications.each {|n| n.resolve_resource_reference(run_context.resource_collection) }
|
276
|
+
end
|
277
|
+
|
278
|
+
def notifies_immediately(action, resource_spec)
|
279
|
+
@immediate_notifications << Notification.new(resource_spec, action, self)
|
280
|
+
end
|
281
|
+
|
282
|
+
def notifies_delayed(action, resource_spec)
|
283
|
+
@delayed_notifications << Notification.new(resource_spec, action, self)
|
284
|
+
end
|
285
|
+
|
192
286
|
def resources(*args)
|
193
|
-
run_context.resource_collection.
|
287
|
+
run_context.resource_collection.find(*args)
|
194
288
|
end
|
195
289
|
|
196
290
|
def subscribes(action, resources, timing=:delayed)
|
@@ -200,7 +294,7 @@ class Chef
|
|
200
294
|
end
|
201
295
|
true
|
202
296
|
end
|
203
|
-
|
297
|
+
|
204
298
|
def is(*args)
|
205
299
|
if args.size == 1
|
206
300
|
args.first
|
@@ -272,10 +366,43 @@ class Chef
|
|
272
366
|
end
|
273
367
|
|
274
368
|
def run_action(action)
|
369
|
+
# ensure that we don't leave @updated_by_last_action set to true
|
370
|
+
# on accident
|
371
|
+
updated_by_last_action(false)
|
372
|
+
|
373
|
+
# Check if this resource has an only_if block -- if it does,
|
374
|
+
# evaluate the only_if block and skip the resource if
|
375
|
+
# appropriate.
|
376
|
+
if only_if
|
377
|
+
unless Chef::Mixin::Command.only_if(only_if, only_if_args)
|
378
|
+
Chef::Log.debug("Skipping #{self} due to only_if")
|
379
|
+
return
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
# Check if this resource has a not_if block -- if it does,
|
384
|
+
# evaluate the not_if block and skip the resource if
|
385
|
+
# appropriate.
|
386
|
+
if not_if
|
387
|
+
unless Chef::Mixin::Command.not_if(not_if, not_if_args)
|
388
|
+
Chef::Log.debug("Skipping #{self} due to not_if")
|
389
|
+
return
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
275
393
|
provider = Chef::Platform.provider_for_resource(self)
|
276
394
|
provider.load_current_resource
|
277
395
|
provider.send("action_#{action}")
|
278
396
|
end
|
397
|
+
|
398
|
+
def updated_by_last_action(true_or_false)
|
399
|
+
@updated ||= true_or_false
|
400
|
+
@updated_by_last_action = true_or_false
|
401
|
+
end
|
402
|
+
|
403
|
+
def updated_by_last_action?
|
404
|
+
@updated_by_last_action
|
405
|
+
end
|
279
406
|
|
280
407
|
def updated?
|
281
408
|
updated
|
@@ -377,41 +504,20 @@ class Chef
|
|
377
504
|
end
|
378
505
|
|
379
506
|
end
|
380
|
-
|
507
|
+
|
381
508
|
private
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
end
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
def validate_timing(timing)
|
396
|
-
timing = timing.to_sym
|
397
|
-
raise ArgumentError, "invalid timing: #{timing}; must be one of: :delayed, :immediate, :immediately" unless (timing == :delayed || timing == :immediate || timing == :immediately)
|
398
|
-
timing == :immediately ? :immediate : timing
|
399
|
-
end
|
400
|
-
|
401
|
-
def notifies_helper(action, resources, timing=:delayed)
|
402
|
-
timing = validate_timing(timing)
|
403
|
-
|
404
|
-
resource_array = [resources].flatten
|
405
|
-
resource_array.each do |resource|
|
406
|
-
new_notify = Notification.new(resource, action)
|
407
|
-
if timing == :delayed
|
408
|
-
notifies_delayed << new_notify
|
409
|
-
else
|
410
|
-
notifies_immediate << new_notify
|
411
|
-
end
|
509
|
+
|
510
|
+
def lookup_provider_constant(name)
|
511
|
+
begin
|
512
|
+
self.class.provider_base.const_get(convert_to_class_name(name.to_s))
|
513
|
+
rescue NameError => e
|
514
|
+
if e.to_s =~ /#{Regexp.escape(self.class.provider_base.to_s)}/
|
515
|
+
raise ArgumentError, "No provider found to match '#{name}'"
|
516
|
+
else
|
517
|
+
raise e
|
412
518
|
end
|
413
|
-
|
414
|
-
true
|
415
519
|
end
|
416
520
|
end
|
521
|
+
|
522
|
+
end
|
417
523
|
end
|