Move try-again loop around all data methods
The verify-data method will try multiple times to see if the data is on the node in question. This functionality has been moved down the stack so that all data methods (add, verify, remove) will attempt multiple times. Change-Id: Ic3ffce6cdcc1e7d98d484c30c65b6dc01535873a Partial-Bug: 1652964
This commit is contained in:
parent
998c021d36
commit
42c7a40d43
@ -221,54 +221,55 @@ class TestHelper(object):
|
||||
Since this method may be called multiple times, the
|
||||
'add_actual_data' function should be idempotent.
|
||||
"""
|
||||
self._perform_data_action(self.FN_ADD, data_type.name, host,
|
||||
*args, **kwargs)
|
||||
self._perform_data_action(self.FN_ADD, data_type.name,
|
||||
host, *args, **kwargs)
|
||||
|
||||
def remove_data(self, data_type, host, *args, **kwargs):
|
||||
"""Removes all data associated with 'data_type'. See
|
||||
instructions for 'add_data' for implementation guidance.
|
||||
"""
|
||||
self._perform_data_action(self.FN_REMOVE, data_type.name, host,
|
||||
*args, **kwargs)
|
||||
self._perform_data_action(self.FN_REMOVE, data_type.name,
|
||||
host, *args, **kwargs)
|
||||
|
||||
def verify_data(self, data_type, host, *args, **kwargs):
|
||||
"""Verify that the data of type 'data_type' exists in the
|
||||
datastore. This can be done by testing edge cases, and possibly
|
||||
some random elements within the set. See
|
||||
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
|
||||
retry_count and retry_sleep kwarg values.
|
||||
"""
|
||||
retry_count = kwargs.pop('retry_count', 10) 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
|
||||
while True:
|
||||
attempts += 1
|
||||
try:
|
||||
self._perform_data_action(self.FN_VERIFY, data_type.name, host,
|
||||
*args, **kwargs)
|
||||
fns[data_fn_name](self, host, *args, **kwargs)
|
||||
break
|
||||
except SkipTest:
|
||||
raise
|
||||
except Exception as ex:
|
||||
self.report.log("Attempt %d to verify data type %s failed\n%s"
|
||||
% (attempts, data_type.name, 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
|
||||
raise RuntimeError("Error calling %s from class %s - %s" %
|
||||
(data_fn_name, self.__class__.__name__,
|
||||
ex))
|
||||
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:
|
||||
fns[data_fn_name](self, host, *args, **kwargs)
|
||||
except SkipTest:
|
||||
raise
|
||||
except Exception as ex:
|
||||
raise RuntimeError("Error calling %s from class %s - %s" %
|
||||
(data_fn_name, self.__class__.__name__, ex))
|
||||
|
||||
def _build_data_fns(self):
|
||||
"""Build the base data functions specified by FN_TYPE_*
|
||||
for each of the types defined in the DataType class. For example,
|
||||
|
Loading…
x
Reference in New Issue
Block a user