def self.retry_action( parameters = { :retry_exceptions => nil, :retries => nil } )
unless block_given?
raise RetryException::NoBlockGiven
end
raise RetryException::NoRetriesGiven if parameters[:retries].nil?
parameters[:retry_exceptions] ||= Hash.new
start = Time.now
failures = 0
begin
yield
rescue Exception => e
raise RetryException::RetriesExceeded if parameters[:retries] == 0
if (not parameters[:retry_exceptions].keys.empty?) and parameters[:retry_exceptions].keys.include?(e.class)
Puppet.info("Caught exception #{e.class}:#{e}")
Puppet.info(parameters[:retry_exceptions][e.class])
elsif (not parameters[:retry_exceptions].keys.empty?)
raise e
end
failures += 1
parameters[:retries] -= 1
sleep (((2 ** failures) -1) * 0.1)
retry
end
end