Merge pull request #16762 from LabNConsulting/chopps/diag-diff

improve @retry decorator
This commit is contained in:
Jafar Al-Gharaibeh 2024-09-07 14:30:24 -04:00 committed by GitHub
commit 63148da2a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 11 deletions

View File

@ -1847,7 +1847,13 @@ def retry(retry_timeout, initial_wait=0, expected=True, diag_pct=0.75):
while True: while True:
seconds_left = (retry_until - datetime.now()).total_seconds() seconds_left = (retry_until - datetime.now()).total_seconds()
try: try:
ret = func(*args, **kwargs) try:
ret = func(*args, seconds_left=seconds_left, **kwargs)
except TypeError as error:
if "seconds_left" not in str(error):
raise
ret = func(*args, **kwargs)
logger.debug("Function returned %s", ret) logger.debug("Function returned %s", ret)
negative_result = ret is False or is_string(ret) negative_result = ret is False or is_string(ret)
@ -1868,7 +1874,7 @@ def retry(retry_timeout, initial_wait=0, expected=True, diag_pct=0.75):
return saved_failure return saved_failure
except Exception as error: except Exception as error:
logger.info("Function raised exception: %s", str(error)) logger.info('Function raised exception: "%s"', repr(error))
ret = error ret = error
if seconds_left < 0 and saved_failure: if seconds_left < 0 and saved_failure:

View File

@ -63,7 +63,7 @@ def disable_debug(router):
@retry(retry_timeout=30, initial_wait=1) @retry(retry_timeout=30, initial_wait=1)
def _do_oper_test(tgen, qr): def _do_oper_test(tgen, qr, seconds_left=None):
r1 = tgen.gears["r1"].net r1 = tgen.gears["r1"].net
qcmd = ( qcmd = (
@ -80,6 +80,8 @@ def _do_oper_test(tgen, qr):
expected = open(qr[1], encoding="ascii").read() expected = open(qr[1], encoding="ascii").read()
output = r1.cmd_nostatus(qcmd.format(qr[0], qr[2] if len(qr) > 2 else "")) output = r1.cmd_nostatus(qcmd.format(qr[0], qr[2] if len(qr) > 2 else ""))
diag = logging.debug if seconds_left else logging.warning
try: try:
ojson = json.loads(output) ojson = json.loads(output)
except json.decoder.JSONDecodeError as error: except json.decoder.JSONDecodeError as error:
@ -92,31 +94,31 @@ def _do_oper_test(tgen, qr):
logging.error( logging.error(
"Error decoding json exp result: %s\noutput:\n%s", error, expected "Error decoding json exp result: %s\noutput:\n%s", error, expected
) )
logging.warning("FILE: {}".format(qr[1])) diag("FILE: {}".format(qr[1]))
raise raise
if dd_json_cmp: if dd_json_cmp:
cmpout = json_cmp(ojson, ejson, exact_match=True) cmpout = json_cmp(ojson, ejson, exact_match=True)
if cmpout: if cmpout:
logging.warning( diag(
"-------DIFF---------\n%s\n---------DIFF----------", "-------DIFF---------\n%s\n---------DIFF----------",
pprint.pformat(cmpout), pprint.pformat(cmpout),
) )
else: else:
cmpout = tt_json_cmp(ojson, ejson, exact=True) cmpout = tt_json_cmp(ojson, ejson, exact=True)
if cmpout: if cmpout:
logging.warning( diag(
"-------EXPECT--------\n%s\n------END-EXPECT------", "-------EXPECT--------\n%s\n------END-EXPECT------",
json.dumps(ejson, indent=4), json.dumps(ejson, indent=4),
) )
logging.warning( diag(
"--------GOT----------\n%s\n-------END-GOT--------", "--------GOT----------\n%s\n-------END-GOT--------",
json.dumps(ojson, indent=4), json.dumps(ojson, indent=4),
) )
logging.warning("----diff---\n{}".format(cmpout)) diag("----diff---\n{}".format(cmpout))
logging.warning("Command: {}".format(qcmd.format(qr[0], qr[2] if len(qr) > 2 else ""))) diag("Command: {}".format(qcmd.format(qr[0], qr[2] if len(qr) > 2 else "")))
logging.warning("File: {}".format(qr[1])) diag("File: {}".format(qr[1]))
assert cmpout is None return cmpout
def do_oper_test(tgen, query_results): def do_oper_test(tgen, query_results):