summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/provider/augeas/augeas.rb29
-rwxr-xr-xspec/unit/provider/augeas/augeas_spec.rb32
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