1*9c5db199SXin Li# Lint as: python2, python3 2*9c5db199SXin Li# pylint: disable=missing-docstring 3*9c5db199SXin Li 4*9c5db199SXin Lifrom __future__ import absolute_import 5*9c5db199SXin Lifrom __future__ import division 6*9c5db199SXin Lifrom __future__ import print_function 7*9c5db199SXin Liimport sys, re, traceback 8*9c5db199SXin Li 9*9c5db199SXin Li# these statuses are ordered such that a status earlier in the list will 10*9c5db199SXin Li# override a status later in a list (e.g. ERROR during a test will override 11*9c5db199SXin Li# prior GOOD results, but WARN will not override a FAIL) 12*9c5db199SXin Lijob_statuses = ["TEST_NA", "ABORT", "ERROR", "FAIL", "WARN", "GOOD", "ALERT", 13*9c5db199SXin Li "RUNNING", "NOSTATUS"] 14*9c5db199SXin Li 15*9c5db199SXin Lidef is_valid_status(status): 16*9c5db199SXin Li if not re.match(r'(START|INFO|(END )?(' + '|'.join(job_statuses) + '))$', 17*9c5db199SXin Li status): 18*9c5db199SXin Li return False 19*9c5db199SXin Li else: 20*9c5db199SXin Li return True 21*9c5db199SXin Li 22*9c5db199SXin Li 23*9c5db199SXin Lidef log_and_ignore_errors(msg): 24*9c5db199SXin Li """ A decorator for wrapping functions in a 'log exception and ignore' 25*9c5db199SXin Li try-except block. """ 26*9c5db199SXin Li def decorator(fn): 27*9c5db199SXin Li def decorated_func(*args, **dargs): 28*9c5db199SXin Li try: 29*9c5db199SXin Li fn(*args, **dargs) 30*9c5db199SXin Li except Exception: 31*9c5db199SXin Li print(msg, file=sys.stderr) 32*9c5db199SXin Li traceback.print_exc(file=sys.stderr) 33*9c5db199SXin Li return decorated_func 34*9c5db199SXin Li return decorator 35