summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Murawski <steven.murawski@gmail.com>2015-11-13 16:44:06 -0600
committerSteven Murawski <steven.murawski@gmail.com>2015-11-17 12:35:23 -0600
commit299075ae2e7723e072586079cd581e09a27d6bef (patch)
tree89a6292e8ede67b6f5b69a669fbc2b6fbe90c30c
parent45877e9320bd6881caafb6ab338373589b7659c8 (diff)
downloadchef-299075ae2e7723e072586079cd581e09a27d6bef.tar.gz
Add reboot notification to dsc_resource
-rw-r--r--DOC_CHANGES.md7
-rw-r--r--lib/chef/provider/dsc_resource.rb46
-rw-r--r--lib/chef/resource/dsc_resource.rb13
-rw-r--r--spec/unit/provider/dsc_resource_spec.rb20
-rw-r--r--spec/unit/resource/dsc_resource_spec.rb6
5 files changed, 84 insertions, 8 deletions
diff --git a/DOC_CHANGES.md b/DOC_CHANGES.md
index b2e2c3d117..cb7a411aaa 100644
--- a/DOC_CHANGES.md
+++ b/DOC_CHANGES.md
@@ -56,3 +56,10 @@ Assuming both of those make 12.6, placeholder pages:
chocolatey_package: https://docs.chef.io/release/12-6/resource_chocolatey_package.html
ksh: https://docs.chef.io/release/12-6/resource_ksh.html
+
+### `dsc_resource` resource
+
+Added allow_reboot attribute to dsc_resource.
+
+If the DSC resource indicates that it requires a reboot, allow_reboot can use the reboot resource to
+either reboot immediately (:reboot_now) or queue a reboot (:request_reboot).
diff --git a/lib/chef/provider/dsc_resource.rb b/lib/chef/provider/dsc_resource.rb
index 65830131ab..7906aea3f8 100644
--- a/lib/chef/provider/dsc_resource.rb
+++ b/lib/chef/provider/dsc_resource.rb
@@ -32,12 +32,14 @@ class Chef
super
@new_resource = new_resource
@module_name = new_resource.module_name
+ @reboot_resource = nil
end
def action_run
if ! test_resource
converge_by(generate_description) do
result = set_resource
+ reboot_if_required
end
end
end
@@ -123,18 +125,14 @@ class Chef
# however Invoke-DscResource is not correctly writing to that
# stream and instead just dumping to stdout
@converge_description = result.stdout
-
- if result.return_value.is_a?(Array)
- # WMF Feb 2015 Preview
- result.return_value[0]["InDesiredState"]
- else
- # WMF April 2015 Preview
- result.return_value["InDesiredState"]
- end
+ return_dsc_resource_result(result, "InDesiredState")
end
def set_resource
result = invoke_resource(:set)
+ if return_dsc_resource_result(result, 'RebootRequired')
+ create_reboot_resource
+ end
result.return_value
end
@@ -155,6 +153,38 @@ class Chef
cmdlet.run!
end
+ def return_dsc_resource_result(result, property_name)
+ if result.return_value.is_a?(Array)
+ # WMF Feb 2015 Preview
+ result.return_value[0][property_name]
+ else
+ # WMF April 2015 Preview
+ result.return_value[property_name]
+ end
+ end
+
+ def create_reboot_resource
+ @reboot_resource = Chef::Resource::Reboot.new(
+ "Reboot for #{@new_resource.name}",
+ run_context
+ ).tap do |r|
+ r.reason("Reboot for #{@new_resource.resource}.")
+ end
+ end
+
+ def reboot_if_required
+ reboot_action = @new_resource.reboot_action
+ unless @reboot_resource.nil?
+ case reboot_action
+ when :nothing
+ Chef::Log.debug("A reboot was requested by the DSC resource, but reboot_action is :nothing.")
+ Chef::Log.debug("This dsc_resource will not reboot the node.")
+ else
+ Chef::Log.debug("Requesting node reboot with #{reboot_action}.")
+ @reboot_resource.run_action(reboot_action)
+ end
+ end
+ end
end
end
end
diff --git a/lib/chef/resource/dsc_resource.rb b/lib/chef/resource/dsc_resource.rb
index 5db00f49ca..95ad141d4f 100644
--- a/lib/chef/resource/dsc_resource.rb
+++ b/lib/chef/resource/dsc_resource.rb
@@ -31,6 +31,7 @@ class Chef
super
@properties = {}
@resource = nil
+ @reboot_action = :nothing
end
def resource(value=nil)
@@ -68,6 +69,18 @@ class Chef
end
end
+ # This property takes the action message for the reboot resource
+ # If the set method of the DSC resource indicate that a reboot
+ # is necessary, reboot_action provides the mechanism for a reboot to
+ # be requested.
+ def reboot_action(value=nil)
+ if value
+ @reboot_action = value
+ else
+ @reboot_action
+ end
+ end
+
private
def value_of(value)
diff --git a/spec/unit/provider/dsc_resource_spec.rb b/spec/unit/provider/dsc_resource_spec.rb
index 9946ab8410..dc0da1d1c1 100644
--- a/spec/unit/provider/dsc_resource_spec.rb
+++ b/spec/unit/provider/dsc_resource_spec.rb
@@ -72,6 +72,26 @@ describe Chef::Provider::DscResource do
provider.run_action(:run)
expect(resource).to be_updated
end
+
+ it 'flags the resource as reboot required when required' do
+ expect(provider).to receive(:dsc_refresh_mode_disabled?).and_return(true)
+ expect(provider).to receive(:test_resource).and_return(false)
+ expect(provider).to receive(:invoke_resource).
+ and_return(double(:stdout => '', :return_value =>nil))
+ expect(provider).to receive(:return_dsc_resource_result).and_return(true)
+ expect(provider).to receive(:create_reboot_resource)
+ provider.run_action(:run)
+ end
+
+ it 'does not flag the resource as reboot required when not required' do
+ expect(provider).to receive(:dsc_refresh_mode_disabled?).and_return(true)
+ expect(provider).to receive(:test_resource).and_return(false)
+ expect(provider).to receive(:invoke_resource).
+ and_return(double(:stdout => '', :return_value =>nil))
+ expect(provider).to receive(:return_dsc_resource_result).and_return(false)
+ expect(provider).to_not receive(:create_reboot_resource)
+ provider.run_action(:run)
+ end
end
end
end
diff --git a/spec/unit/resource/dsc_resource_spec.rb b/spec/unit/resource/dsc_resource_spec.rb
index 06769d86ce..663ad4459e 100644
--- a/spec/unit/resource/dsc_resource_spec.rb
+++ b/spec/unit/resource/dsc_resource_spec.rb
@@ -22,6 +22,7 @@ describe Chef::Resource::DscResource do
let(:dsc_test_resource_name) { 'DSCTest' }
let(:dsc_test_property_name) { :DSCTestProperty }
let(:dsc_test_property_value) { 'DSCTestValue' }
+ let(:dsc_test_reboot_action) { :reboot_now }
context 'when Powershell supports Dsc' do
let(:dsc_test_run_context) {
@@ -52,6 +53,11 @@ describe Chef::Resource::DscResource do
expect(dsc_test_resource.module_name).to eq(dsc_test_resource_name)
end
+ it "allows the reboot_action attribute to be set" do
+ dsc_test_resource.reboot_action(dsc_test_reboot_action)
+ expect(dsc_test_resource.reboot_action).to eq(dsc_test_reboot_action)
+ end
+
context "when setting a dsc property" do
it "allows setting a dsc property with a property name of type Symbol" do
dsc_test_resource.property(dsc_test_property_name, dsc_test_property_value)