import datetime import os import re import sys _debug_logger = sys.stderr def dprint(msg): #pylint: disable-msg=C0111 print >> _debug_logger, 'tko parser: %s' % msg def redirect_parser_debugging(ostream): #pylint: disable-msg=C0111 global _debug_logger _debug_logger = ostream def get_timestamp(mapping, field): #pylint: disable-msg=C0111 val = mapping.get(field, None) if val is not None: val = datetime.datetime.fromtimestamp(int(val)) return val def find_toplevel_job_dir(start_dir): """ Starting from start_dir and moving upwards, find the top-level of the job results dir. We can't just assume that it corresponds to the actual job.dir, because job.dir may just be a subdir of the "real" job dir that autoserv was launched with. Returns None if it can't find a top-level dir. @param start_dir: starting directing for the upward search""" job_dir = start_dir while not os.path.exists(os.path.join(job_dir, ".autoserv_execute")): if job_dir == "/" or job_dir == '': return None job_dir = os.path.dirname(job_dir) return job_dir def drop_redundant_messages(messages): """ Given a set of message strings discard any 'redundant' messages which are simple a substring of the existing ones. @param messages - a set of message strings @return - a subset of messages with unnecessary strings dropped """ sorted_messages = sorted(messages, key=len, reverse=True) filtered_messages = set() for message in sorted_messages: for filtered_message in filtered_messages: if message in filtered_message: break else: filtered_messages.add(message) return filtered_messages def get_afe_job_id(tag): """ Given a tag return the afe_job_id (if any). @param tag: afe_job_id is extracted from this tag @return: the afe_job_id as a string if regex matches, else return '' """ return get_afe_job_id_and_hostname(tag)[0] def get_afe_job_id_and_hostname(tag): """ Given a tag return the afe_job_id and hostname (if any). Extract job id and hostname if tag is in the format of JOB_ID-OWNER/HOSTNAME. JOB_ID and HOSTNAME must both be present to be considered as a match. @param tag: afe_job_id and hostname are extracted from this tag. e.g. "1234-chromeos-test/chromeos1-row1-host1" @return: A tuple (afe_job_id, hostname), both as string if regex matches, else return ('', ''). """ match = re.search('^([0-9]+)-.+/(.+)$', tag) return (match.group(1), match.group(2)) if match else ('', '')