summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Murawski <steven.murawski@gmail.com>2016-02-03 16:09:24 -0600
committerSteven Murawski <steven.murawski@gmail.com>2016-02-03 16:09:24 -0600
commit22d700e4a1a3c44d6d794fd5c4c1f8932a74cf17 (patch)
tree0099b47838b3425361f41076489917bab304136b
parent6ebcdd04706152594fc34db06c22dadafc1e31ee (diff)
parent5291fd70df7b9360b186ff104115f080e949f5e5 (diff)
downloadchef-22d700e4a1a3c44d6d794fd5c4c1f8932a74cf17.tar.gz
Merge branch 'smurawski/dsc_resource_converge_logging'
-rw-r--r--lib/chef/mixin/powershell_type_coercions.rb2
-rw-r--r--lib/chef/provider/dsc_resource.rb30
-rw-r--r--spec/unit/mixin/powershell_type_coercions_spec.rb29
-rw-r--r--spec/unit/provider/dsc_resource_spec.rb2
4 files changed, 42 insertions, 21 deletions
diff --git a/lib/chef/mixin/powershell_type_coercions.rb b/lib/chef/mixin/powershell_type_coercions.rb
index 9076b1ce3e..60c04e85ae 100644
--- a/lib/chef/mixin/powershell_type_coercions.rb
+++ b/lib/chef/mixin/powershell_type_coercions.rb
@@ -29,6 +29,8 @@ class Chef
TrueClass => { :type => lambda { |x| "$true" }},
Hash => {:type => Proc.new { |x| translate_hash(x)}},
Array => {:type => Proc.new { |x| translate_array(x)}},
+ Chef::Node::ImmutableMash => {:type => Proc.new { |x| translate_hash(x)}},
+ Chef::Node::ImmutableArray => {:type => Proc.new { |x| translate_array(x)}},
}
end
diff --git a/lib/chef/provider/dsc_resource.rb b/lib/chef/provider/dsc_resource.rb
index 56f6d7a6d9..1f6a8f0ef6 100644
--- a/lib/chef/provider/dsc_resource.rb
+++ b/lib/chef/provider/dsc_resource.rb
@@ -122,25 +122,31 @@ class Chef
def test_resource
result = invoke_resource(:test)
- @converge_description = result.stream(:verbose)
-
- # We really want this information from the verbose stream,
- # however in some versions of WMF, Invoke-DscResource is not correctly
- # writing to that stream and instead just dumping to stdout
- if @converge_description.empty?
- @converge_description = result.stdout
- end
-
+ add_dsc_verbose_log(result)
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
+ add_dsc_verbose_log(result)
+ create_reboot_resource if return_dsc_resource_result(result, "RebootRequired")
result.return_value
end
+
+ def add_dsc_verbose_log(result)
+ # We really want this information from the verbose stream,
+ # however in some versions of WMF, Invoke-DscResource is not correctly
+ # writing to that stream and instead just dumping to stdout
+ verbose_output = result.stream(:verbose)
+ verbose_output = result.stdout if verbose_output.empty?
+
+ if @converge_description.nil? || @converge_description.empty?
+ @converge_description = verbose_output
+ else
+ @converge_description << "\n"
+ @converge_description << verbose_output
+ end
+ end
def invoke_resource(method, output_format=:object)
properties = translate_type(@new_resource.properties)
diff --git a/spec/unit/mixin/powershell_type_coercions_spec.rb b/spec/unit/mixin/powershell_type_coercions_spec.rb
index 846381eb53..f7b4fcd723 100644
--- a/spec/unit/mixin/powershell_type_coercions_spec.rb
+++ b/spec/unit/mixin/powershell_type_coercions_spec.rb
@@ -28,42 +28,53 @@ describe Chef::Mixin::PowershellTypeCoercions do
let (:test_class) { Chef::PSTypeTester.new }
describe '#translate_type' do
- it "should single quote a string" do
+ it "single quotes a string" do
expect(test_class.translate_type("foo")).to eq("'foo'")
end
["'", '"', '#', "`"].each do |c|
- it "should base64 encode a string that contains #{c}" do
+ it "base64 encodes a string that contains #{c}" do
expect(test_class.translate_type("#{c}")).to match(Base64.strict_encode64(c))
end
end
- it "should not quote an integer" do
+ it "does not quote an integer" do
expect(test_class.translate_type(123)).to eq("123")
end
- it "should not quote a floating point number" do
+ it "does not quote a floating point number" do
expect(test_class.translate_type(123.4)).to eq("123.4")
end
- it "should return $false when an instance of FalseClass is provided" do
+ it "translates $false when an instance of FalseClass is provided" do
expect(test_class.translate_type(false)).to eq("$false")
end
- it "should return $true when an instance of TrueClass is provided" do
+ it "translates $true when an instance of TrueClass is provided" do
expect(test_class.translate_type(true)).to eq("$true")
end
- it "should translate all members of a hash and wrap them in @{} separated by ;" do
+ it "translates all members of a hash and wrap them in @{} separated by ;" do
expect(test_class.translate_type({"a" => 1, "b" => 1.2, "c" => false, "d" => true
})).to eq("@{a=1;b=1.2;c=$false;d=$true}")
end
- it "should translat all members of an array and them by a ," do
+ it "translates all members of an array and them by a ," do
expect(test_class.translate_type([true, false])).to eq("@($true,$false)")
end
+
+ it "translates a Chef::Node::ImmutableMash like a hash" do
+ test_mash = Chef::Node::ImmutableMash.new({"a" => 1, "b" => 1.2,
+ "c" => false, "d" => true})
+ expect(test_class.translate_type(test_mash)).to eq("@{a=1;b=1.2;c=$false;d=$true}")
+ end
+
+ it "translates a Chef::Node::ImmutableArray like an array" do
+ test_array = Chef::Node::ImmutableArray.new([true, false])
+ expect(test_class.translate_type(test_array)).to eq("@($true,$false)")
+ end
- it "should fall back :to_psobject if we have not defined at explicit rule" do
+ it "falls back :to_psobject if we have not defined at explicit rule" do
ps_obj = double("PSObject")
expect(ps_obj).to receive(:to_psobject).and_return("$true")
expect(test_class.translate_type(ps_obj)).to eq("($true)")
diff --git a/spec/unit/provider/dsc_resource_spec.rb b/spec/unit/provider/dsc_resource_spec.rb
index e47da8a165..6a5063ac60 100644
--- a/spec/unit/provider/dsc_resource_spec.rb
+++ b/spec/unit/provider/dsc_resource_spec.rb
@@ -98,6 +98,7 @@ describe Chef::Provider::DscResource do
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(:add_dsc_verbose_log)
expect(provider).to receive(:return_dsc_resource_result).and_return(true)
expect(provider).to receive(:create_reboot_resource)
provider.run_action(:run)
@@ -108,6 +109,7 @@ describe Chef::Provider::DscResource do
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(:add_dsc_verbose_log)
expect(provider).to receive(:return_dsc_resource_result).and_return(false)
expect(provider).to_not receive(:create_reboot_resource)
provider.run_action(:run)