diff options
| -rw-r--r-- | lib/puppet/provider/augeas/augeas.rb | 29 | ||||
| -rwxr-xr-x | spec/unit/provider/augeas/augeas_spec.rb | 32 |
2 files changed, 56 insertions, 5 deletions
diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb index 95142568e..76c7e7717 100644 --- a/lib/puppet/provider/augeas/augeas.rb +++ b/lib/puppet/provider/augeas/augeas.rb @@ -259,6 +259,18 @@ Puppet::Type.type(:augeas).provide(:augeas) do @aug.set("/augeas/save", mode) end + def print_put_errors + errors = @aug.match("/augeas//error[. = 'put_failed']") + debug("Put failed on one or more files, output from /augeas//error:") unless errors.empty? + errors.each do |errnode| + @aug.match("#{errnode}/*").each do |subnode| + sublabel = subnode.split("/")[-1] + subvalue = @aug.get(subnode) + debug("#{sublabel} = #{subvalue}") + end + end + end + # Determines if augeas acutally needs to run. def need_to_run? force = resource[:force] @@ -290,8 +302,13 @@ Puppet::Type.type(:augeas).provide(:augeas) do set_augeas_save_mode(SAVE_NEWFILE) do_execute_changes save_result = @aug.save + unless save_result + print_put_errors + fail("Save failed with return code #{save_result}, see debug") + end + saved_files = @aug.match("/augeas/events/saved") - if save_result and saved_files.size > 0 + if saved_files.size > 0 root = resource[:root].sub(/^\/$/, "") saved_files.each do |key| saved_file = @aug.get(key).to_s.sub(/^\/files/, root) @@ -305,13 +322,13 @@ Puppet::Type.type(:augeas).provide(:augeas) do debug("Files changed, should execute") return_value = true else - debug("Skipping because no files were changed or save failed") + debug("Skipping because no files were changed") return_value = false end end end ensure - if not return_value or resource.noop? + if not return_value or resource.noop? or not save_result close_augeas end end @@ -337,8 +354,10 @@ Puppet::Type.type(:augeas).provide(:augeas) do debug("No saved files, re-executing augeas") set_augeas_save_mode(SAVE_OVERWRITE) if get_augeas_version >= "0.3.6" do_execute_changes - success = @aug.save - fail("Save failed with return code #{success}") if success != true + unless @aug.save + print_put_errors + fail("Save failed with return code #{success}, see debug") + end end ensure close_augeas diff --git a/spec/unit/provider/augeas/augeas_spec.rb b/spec/unit/provider/augeas/augeas_spec.rb index 434a99d70..f8c4aa151 100755 --- a/spec/unit/provider/augeas/augeas_spec.rb +++ b/spec/unit/provider/augeas/augeas_spec.rb @@ -442,6 +442,20 @@ describe provider_class do @provider.expects(:diff).with("#{file}", "#{file}.augnew").returns("") @provider.should be_need_to_run end + + it "should fail with an error if saving fails" do + file = "/etc/hosts" + + @resource[:context] = "/files" + @resource[:changes] = ["set #{file}/foo bar"] + + @augeas_stub.stubs(:save).returns(false) + @augeas_stub.stubs(:match).with("/augeas/events/saved").returns([]) + @augeas_stub.expects(:close) + + @provider.expects(:diff).never() + lambda { @provider.need_to_run? }.should raise_error + end end end @@ -592,4 +606,22 @@ describe provider_class do @provider.execute_changes.should == :executed end end + + describe "save failure reporting" do + before do + @resource = stub("resource") + @augeas = stub("augeas") + @provider = provider_class.new(@resource) + @provider.aug = @augeas + end + + it "should find errors and output to debug" do + @augeas.expects(:match).with("/augeas//error[. = 'put_failed']").returns(["/augeas/files/foo/error"]) + @augeas.expects(:match).with("/augeas/files/foo/error/*").returns(["/augeas/files/foo/error/path", "/augeas/files/foo/error/message"]) + @augeas.expects(:get).with("/augeas/files/foo/error/path").returns("/foo") + @augeas.expects(:get).with("/augeas/files/foo/error/message").returns("Failed to...") + @provider.expects(:debug).times(3) + @provider.print_put_errors + end + end end |
