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