1import datetime 2import os 3import re 4import sys 5 6 7_debug_logger = sys.stderr 8def dprint(msg): 9 #pylint: disable-msg=C0111 10 print >> _debug_logger, 'tko parser: %s' % msg 11 12 13def redirect_parser_debugging(ostream): 14 #pylint: disable-msg=C0111 15 global _debug_logger 16 _debug_logger = ostream 17 18 19def get_timestamp(mapping, field): 20 #pylint: disable-msg=C0111 21 val = mapping.get(field, None) 22 if val is not None: 23 val = datetime.datetime.fromtimestamp(int(val)) 24 return val 25 26 27def find_toplevel_job_dir(start_dir): 28 """ Starting from start_dir and moving upwards, find the top-level 29 of the job results dir. We can't just assume that it corresponds to 30 the actual job.dir, because job.dir may just be a subdir of the "real" 31 job dir that autoserv was launched with. Returns None if it can't find 32 a top-level dir. 33 @param start_dir: starting directing for the upward search""" 34 job_dir = start_dir 35 while not os.path.exists(os.path.join(job_dir, ".autoserv_execute")): 36 if job_dir == "/" or job_dir == '': 37 return None 38 job_dir = os.path.dirname(job_dir) 39 return job_dir 40 41 42def drop_redundant_messages(messages): 43 """ Given a set of message strings discard any 'redundant' messages which 44 are simple a substring of the existing ones. 45 46 @param messages - a set of message strings 47 48 @return - a subset of messages with unnecessary strings dropped 49 """ 50 sorted_messages = sorted(messages, key=len, reverse=True) 51 filtered_messages = set() 52 for message in sorted_messages: 53 for filtered_message in filtered_messages: 54 if message in filtered_message: 55 break 56 else: 57 filtered_messages.add(message) 58 return filtered_messages 59 60 61def get_afe_job_id(tag): 62 """ Given a tag return the afe_job_id (if any). 63 64 @param tag: afe_job_id is extracted from this tag 65 66 @return: the afe_job_id as a string if regex matches, else return '' 67 """ 68 return get_afe_job_id_and_hostname(tag)[0] 69 70 71def get_afe_job_id_and_hostname(tag): 72 """ Given a tag return the afe_job_id and hostname (if any). 73 74 Extract job id and hostname if tag is in the format of 75 JOB_ID-OWNER/HOSTNAME. JOB_ID and HOSTNAME must both be present 76 to be considered as a match. 77 78 @param tag: afe_job_id and hostname are extracted from this tag. 79 e.g. "1234-chromeos-test/chromeos1-row1-host1" 80 @return: A tuple (afe_job_id, hostname), both as string if regex 81 matches, else return ('', ''). 82 """ 83 match = re.search('^([0-9]+)-.+/(.+)$', tag) 84 return (match.group(1), match.group(2)) if match else ('', '') 85