PUPPETLABS_KEY_CHECK_COMMAND = "#{KEY_CHECK_COMMAND} #{PUPPETLABS_GPG_KEY_FINGERPRINT}"
CENTOS_KEY_CHECK_COMMAND = "#{KEY_CHECK_COMMAND} #{CENTOS_GPG_KEY_FINGERPRINT}"
+MAX_TIMEOUT_RETRY = 3
+TIMEOUT_RETRY_WAIT = 5
+TIMEOUT_ERROR_MATCHER = /no valid OpenPGP data found/
+
describe 'apt_key' do
before(:each) do
# Delete twice to make sure everything is cleaned
}
EOS
- # Install the key first
- shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \
+ # Install the key first (retry because key pool may timeout)
+ retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do
+ shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \
--recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}")
+ end
shell(CENTOS_KEY_CHECK_COMMAND)
# Time to remove it using Puppet
shell(CENTOS_KEY_CHECK_COMMAND,
:acceptable_exit_codes => [1])
- shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \
- --recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}")
+ # Re-Install the key (retry because key pool may timeout)
+ retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do
+ shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \
+ --recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}")
+ end
end
end
}
EOS
- # Install the key first
- shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \
- --recv-keys #{PUPPETLABS_GPG_KEY_LONG_ID}")
+ # Install the key first (retry because key pool may timeout)
+ retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do
+ shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \
+ --recv-keys #{PUPPETLABS_GPG_KEY_LONG_ID}")
+ end
+
shell(PUPPETLABS_KEY_CHECK_COMMAND)
# Time to remove it using Puppet
}
EOS
- apply_manifest(pp, :catch_failures => true)
+ #Apply the manifest (Retry if timeout error is received from key pool)
+ retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do
+ apply_manifest(pp, :catch_failures => true)
+ end
+
apply_manifest(pp, :catch_changes => true)
shell(PUPPETLABS_KEY_CHECK_COMMAND)
end
end
+
context 'multiple keys' do
it 'runs without errors' do
pp = <<-EOS
-----END PGP PUBLIC KEY BLOCK----- ",
}
EOS
+
apply_manifest(pp, :catch_failures => true)
apply_manifest(pp, :catch_changes => true)
shell(PUPPETLABS_KEY_CHECK_COMMAND)
}
EOS
- apply_manifest(pp, :catch_failures => true)
+ #Apply the manifest (Retry if timeout error is received from key pool)
+ retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do
+ apply_manifest(pp, :catch_failures => true)
+ end
+
apply_manifest(pp, :catch_changes => true)
shell(PUPPETLABS_KEY_CHECK_COMMAND)
end
}
EOS
- apply_manifest(pp, :catch_failures => true)
+ retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do
+ apply_manifest(pp, :catch_failures => true)
+ end
+
apply_manifest(pp, :catch_changes => true)
shell(PUPPETLABS_KEY_CHECK_COMMAND)
end
UNSUPPORTED_PLATFORMS = ['RedHat','Suse','windows','AIX','Solaris']
+# This method allows a block to be passed in and if an exception is raised
+# that matches the 'error_matcher' matcher, the block will wait a set number
+# of seconds before retrying.
+# Params:
+# - max_retry_count - Max number of retries
+# - retry_wait_interval_secs - Number of seconds to wait before retry
+# - error_matcher - Matcher which the exception raised must match to allow retry
+# Example Usage:
+# retry_on_error_matching(3, 5, /OpenGPG Error/) do
+# apply_manifest(pp, :catch_failures => true)
+# end
+def retry_on_error_matching(max_retry_count = 3, retry_wait_interval_secs = 5, error_matcher = nil)
+ try = 0
+ begin
+ try += 1
+ yield
+ rescue Exception => e
+ if try < max_retry_count && (error_matcher == nil || e.message =~ error_matcher)
+ sleep retry_wait_interval_secs
+ retry
+ else
+ raise
+ end
+ end
+end
+
RSpec.configure do |c|
# Project root
proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))