Merge "Move try-again loop around all data methods"

This commit is contained in:
Jenkins 2017-01-05 22:01:24 +00:00 committed by Gerrit Code Review
commit bd68bcc507

View File

@ -221,53 +221,54 @@ class TestHelper(object):
Since this method may be called multiple times, the Since this method may be called multiple times, the
'add_actual_data' function should be idempotent. 'add_actual_data' function should be idempotent.
""" """
self._perform_data_action(self.FN_ADD, data_type.name, host, self._perform_data_action(self.FN_ADD, data_type.name,
*args, **kwargs) host, *args, **kwargs)
def remove_data(self, data_type, host, *args, **kwargs): def remove_data(self, data_type, host, *args, **kwargs):
"""Removes all data associated with 'data_type'. See """Removes all data associated with 'data_type'. See
instructions for 'add_data' for implementation guidance. instructions for 'add_data' for implementation guidance.
""" """
self._perform_data_action(self.FN_REMOVE, data_type.name, host, self._perform_data_action(self.FN_REMOVE, data_type.name,
*args, **kwargs) host, *args, **kwargs)
def verify_data(self, data_type, host, *args, **kwargs): def verify_data(self, data_type, host, *args, **kwargs):
"""Verify that the data of type 'data_type' exists in the """Verify that the data of type 'data_type' exists in the
datastore. This can be done by testing edge cases, and possibly datastore. This can be done by testing edge cases, and possibly
some random elements within the set. See some random elements within the set. See
instructions for 'add_data' for implementation guidance. instructions for 'add_data' for implementation guidance.
By default, the verification is attempted 10 times, sleeping for 3 """
self._perform_data_action(self.FN_VERIFY, data_type.name,
host, *args, **kwargs)
def _perform_data_action(self, fn_type, fn_name, host,
*args, **kwargs):
"""By default, the action is attempted 10 times, sleeping for 3
seconds between each attempt. This can be controlled by the seconds between each attempt. This can be controlled by the
retry_count and retry_sleep kwarg values. retry_count and retry_sleep kwarg values.
""" """
retry_count = kwargs.pop('retry_count', 10) or 0 retry_count = kwargs.pop('retry_count', 10) or 0
retry_sleep = kwargs.pop('retry_sleep', 3) or 0 retry_sleep = kwargs.pop('retry_sleep', 3) or 0
fns = self._data_fns[fn_type]
data_fn_name = self.data_fn_pattern % (fn_type, fn_name)
attempts = -1 attempts = -1
while True: while True:
attempts += 1 attempts += 1
try:
self._perform_data_action(self.FN_VERIFY, data_type.name, host,
*args, **kwargs)
break
except Exception as ex:
self.report.log("Attempt %d to verify data type %s failed\n%s"
% (attempts, data_type.name, ex))
if attempts > retry_count:
raise
self.report.log("Trying again (after %d second sleep)" %
retry_sleep)
sleep(retry_sleep)
def _perform_data_action(self, fn_type, fn_name, host, *args, **kwargs):
fns = self._data_fns[fn_type]
data_fn_name = self.data_fn_pattern % (fn_type, fn_name)
try: try:
fns[data_fn_name](self, host, *args, **kwargs) fns[data_fn_name](self, host, *args, **kwargs)
break
except SkipTest: except SkipTest:
raise raise
except Exception as ex: except Exception as ex:
self.report.log("Attempt %d to %s data type %s failed\n%s"
% (attempts, fn_type, fn_name, ex))
if attempts > retry_count:
raise RuntimeError("Error calling %s from class %s - %s" % raise RuntimeError("Error calling %s from class %s - %s" %
(data_fn_name, self.__class__.__name__, ex)) (data_fn_name, self.__class__.__name__,
ex))
self.report.log("Trying again (after %d second sleep)" %
retry_sleep)
sleep(retry_sleep)
def _build_data_fns(self): def _build_data_fns(self):
"""Build the base data functions specified by FN_TYPE_* """Build the base data functions specified by FN_TYPE_*