Home | History | Annotate | Download | only in tko
      1 import datetime
      2 import os
      3 import re
      4 import sys
      5 
      6 
      7 _debug_logger = sys.stderr
      8 def dprint(msg):
      9     #pylint: disable-msg=C0111
     10     print >> _debug_logger, 'tko parser: %s' % msg
     11 
     12 
     13 def redirect_parser_debugging(ostream):
     14     #pylint: disable-msg=C0111
     15     global _debug_logger
     16     _debug_logger = ostream
     17 
     18 
     19 def 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 
     27 def 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 
     42 def 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 
     61 def 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 
     71 def 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