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 Tag is in the format of JOB_ID-OWNER/HOSTNAME 65 66 @param tag: afe_job_id and hostname are extracted from this tag. 67 e.g. "1234-chromeos-test/chromeos1-row1-host1" 68 @return: the afe_job_id as a string if regex matches, else return '' 69 """ 70 match = re.search('^([0-9]+)-.+/(.+)$', tag) 71 return match.group(1) if match else None 72 73 74def get_skylab_task_id(tag): 75 """ Given a tag return the skylab_task's id (if any). 76 77 Tag is in the format of swarming-TASK_ID/HOSTNAME 78 79 @param tag: afe_job_id and hostname are extracted from this tag. 80 e.g. "1234-chromeos-test/chromeos1-row1-host1" 81 @return: the afe_job_id as a string if regex matches, else return '' 82 """ 83 match = re.search('^swarming-([A-Fa-f0-9]+)/(.+)$', tag) 84 return match.group(1) if match else None 85 86 87def is_skylab_task(tag): 88 return get_skylab_task_id(tag) is not None 89