Improve logging from isctest.run.retry_with_timeout

Allow use of exception (and by extension, assert statements) in the
called function in order to extract essential debug information about
the type of failure that was encountered.

In case the called function fails to succeed on the last retry and
raised an exception, log it as error and set it as the assert message to
propagate it through the pytest framework.

(cherry picked from commit 620c884133)
This commit is contained in:
Nicki Křížek 2025-06-06 15:11:44 +02:00
parent 35efa742b0
commit ab9b2c947f
2 changed files with 17 additions and 5 deletions

View file

@ -643,7 +643,9 @@ def check_keys(zone, keys, expected):
def _verify_keys():
# check number of keys matches expected.
if len(keys) != len(expected):
return False
assert (
False
), f"check_keys(): mismatched number of keys, expected {len(expected)}, got {len(keys)}"
if len(keys) == 0:
return True
@ -662,7 +664,7 @@ def check_keys(zone, keys, expected):
expected[i].key = key
i += 1
if not found:
return False
assert False, f"check_keys(): key {key} not found"
return True

View file

@ -127,12 +127,22 @@ def perl(script: str, args: Optional[List[str]] = None) -> None:
def retry_with_timeout(func, timeout, delay=1, msg=None):
start_time = time.time()
exc_msg = None
while time.time() < start_time + timeout:
if func():
return
exc_msg = None
try:
if func():
return
except AssertionError as exc:
exc_msg = str(exc)
time.sleep(delay)
if exc_msg is not None:
isctest.log.error(exc_msg)
if msg is None:
msg = f"{func.__module__}.{func.__qualname__} timed out after {timeout} s"
if exc_msg is not None:
msg = exc_msg
else:
msg = f"{func.__module__}.{func.__qualname__} timed out after {timeout} s"
assert False, msg