summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wrock <matt@mattwrock.com>2016-02-29 12:53:55 -0800
committerMatt Wrock <matt@mattwrock.com>2016-02-29 14:33:05 -0800
commitb096f5d1c01ca4562b63ea1b088c9cd4d22f501f (patch)
tree1c9de7397b0887c59349eaa10f70b65cedb518b3
parent5533dbb2917860dca16765d49079ed01a421fad8 (diff)
downloadchef-b096f5d1c01ca4562b63ea1b088c9cd4d22f501f.tar.gz
if no module name is found for a valid dsc resource default to PSDesiredStateConfigurationdsc
-rw-r--r--lib/chef/provider/dsc_resource.rb7
-rw-r--r--spec/functional/resource/dsc_resource_spec.rb2
-rw-r--r--spec/unit/provider/dsc_resource_spec.rb57
3 files changed, 56 insertions, 10 deletions
diff --git a/lib/chef/provider/dsc_resource.rb b/lib/chef/provider/dsc_resource.rb
index be752f269f..0f25065925 100644
--- a/lib/chef/provider/dsc_resource.rb
+++ b/lib/chef/provider/dsc_resource.rb
@@ -110,7 +110,7 @@ class Chef
"sure that it shows up when running Get-DscResource"
when 1
if found[0]["Module"].nil?
- :none
+ "PSDesiredStateConfiguration" # default DSC module
else
found[0]["Module"]["Name"]
end
@@ -151,10 +151,7 @@ class Chef
def invoke_resource(method, output_format = :object)
properties = translate_type(@new_resource.properties)
switches = "-Method #{method} -Name #{@new_resource.resource}"\
- " -Property #{properties} -Verbose"
- if module_name != :none
- switches += " -Module #{module_name}"
- end
+ " -Property #{properties} -Module #{module_name} -Verbose"
cmdlet = Chef::Util::Powershell::Cmdlet.new(
node,
"Invoke-DscResource #{switches}",
diff --git a/spec/functional/resource/dsc_resource_spec.rb b/spec/functional/resource/dsc_resource_spec.rb
index 129333c190..8e4940d475 100644
--- a/spec/functional/resource/dsc_resource_spec.rb
+++ b/spec/functional/resource/dsc_resource_spec.rb
@@ -38,7 +38,7 @@ describe Chef::Resource::DscResource, :windows_powershell_dsc_only do
before do
if !Chef::Platform.supports_dsc_invoke_resource?(node)
skip "Requires Powershell >= 5.0.10018.0"
- elsif !Chef::Platform.dsc_refresh_mode_disabled?(node)
+ elsif !Chef::Platform.supports_refresh_mode_enabled?(node) && !Chef::Platform.dsc_refresh_mode_disabled?(node)
skip "Requires LCM RefreshMode is Disabled"
end
end
diff --git a/spec/unit/provider/dsc_resource_spec.rb b/spec/unit/provider/dsc_resource_spec.rb
index c0b412951d..2a00c2ed7f 100644
--- a/spec/unit/provider/dsc_resource_spec.rb
+++ b/spec/unit/provider/dsc_resource_spec.rb
@@ -77,16 +77,24 @@ describe Chef::Provider::DscResource do
node.automatic[:languages][:powershell][:version] = "5.0.10018.0"
node
}
+ let (:resource_result) { double("CmdletResult", return_value: { "InDesiredState" => true }, stream: "description") }
+ let (:invoke_dsc_resource) { double("cmdlet", run!: resource_result) }
+ let (:store) { double("ResourceStore", find: resource_records) }
+ let (:resource_records) { [] }
+
+ before do
+ allow(Chef::Util::DSC::ResourceStore).to receive(:instance).and_return(store)
+ allow(Chef::Util::Powershell::Cmdlet).to receive(:new).and_return(invoke_dsc_resource)
+ allow(provider).to receive(:dsc_refresh_mode_disabled?).and_return(true)
+ end
it "does not update the resource if it is up to date" do
- expect(provider).to receive(:dsc_refresh_mode_disabled?).and_return(true)
expect(provider).to receive(:test_resource).and_return(true)
provider.run_action(:run)
expect(resource).not_to be_updated
end
it "converges the resource if it is not up to date" 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(:set_resource)
provider.run_action(:run)
@@ -94,7 +102,6 @@ describe Chef::Provider::DscResource do
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))
@@ -105,7 +112,6 @@ describe Chef::Provider::DscResource do
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))
@@ -114,5 +120,48 @@ describe Chef::Provider::DscResource do
expect(provider).to_not receive(:create_reboot_resource)
provider.run_action(:run)
end
+
+ context "resource name cannot be found" do
+ let (:resource_records) { [] }
+
+ it "raises ResourceNotFound" do
+ expect { provider.run_action(:run) }.to raise_error(Chef::Exceptions::ResourceNotFound)
+ end
+ end
+
+ context "resource name is found" do
+ context "no module name for resource found" do
+ let (:resource_records) { [{}] }
+
+ it "returns the default dsc resource module" do
+ expect(Chef::Util::Powershell::Cmdlet).to receive(:new) do |node, cmdlet, format|
+ expect(cmdlet).to match(/Module PSDesiredStateConfiguration /)
+ end.and_return(invoke_dsc_resource)
+ provider.run_action(:run)
+ end
+ end
+
+ context "a module name for resource is found" do
+ let (:resource_records) { [{ "Module" => { "Name" => "ModuleName" } }] }
+
+ it "returns the default dsc resource module" do
+ expect(Chef::Util::Powershell::Cmdlet).to receive(:new) do |node, cmdlet, format|
+ expect(cmdlet).to match(/Module ModuleName /)
+ end.and_return(invoke_dsc_resource)
+ provider.run_action(:run)
+ end
+ end
+
+ context "multiple resource are found" do
+ let (:resource_records) { [
+ { "Module" => { "Name" => "ModuleName1" } },
+ { "Module" => { "Name" => "ModuleName2" } },
+ ] }
+
+ it "raises MultipleDscResourcesFound" do
+ expect { provider.run_action(:run) }.to raise_error(Chef::Exceptions::MultipleDscResourcesFound)
+ end
+ end
+ end
end
end