Home | History | Annotate | Download | only in site_utils
      1 #!/usr/bin/python -t
      2 #
      3 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 
      8 """
      9 Usage: ./abort_suite.py [-i and -s you passed to run_suite.py]
     10 
     11 This code exists to allow buildbot to abort a HWTest run if another part of
     12 the build fails while HWTesting is going on.  If we're going to fail the
     13 build anyway, there's no point in continuing to run tests.
     14 
     15 One can also pass just the build version to -i, to abort all boards running the
     16 suite against that version. ie. |./abort_suite.py -i R28-3993.0.0 -s dummy|
     17 would abort all boards running dummy on R28-3993.0.0.
     18 
     19 To achieve better performance, this script aborts suite jobs and relies on
     20 autotest scheduler to aborts its subjobs instead of directly aborting subjobs.
     21 So only synchronous suites is supported.
     22 
     23 """
     24 
     25 
     26 import argparse
     27 import getpass
     28 import logging
     29 import os
     30 import sys
     31 
     32 import common
     33 from autotest_lib.server import frontend
     34 from autotest_lib.server import utils
     35 
     36 
     37 LOG_NAME_TEMPLATE = 'abort_suite-%s.log'
     38 SUITE_JOB_NAME_TEMPLATE = '%s-test_suites/control.%s'
     39 
     40 
     41 def parse_args():
     42     """
     43     Parse the arguments to this script.
     44 
     45     @return The arguments to this script.
     46 
     47     """
     48     parser = argparse.ArgumentParser()
     49     parser.add_argument('-s', '--suite_name', dest='name')
     50     parser.add_argument('-i', '--build', dest='build')
     51     return parser.parse_args()
     52 
     53 
     54 def abort_suites(afe, substring):
     55     """
     56     Abort the suite.
     57 
     58     This method aborts the suite jobs whose name contains |substring|.
     59     Aborting a suite job will lead to all its child jobs to be aborted
     60     by autotest scheduler.
     61 
     62     @param afe: An instance of frontend.AFE to make RPCs with.
     63     @param substring: A string used to search for the jobs (case insensitive
     64             matching).
     65 
     66     """
     67     hqe_info = afe.run('abort_host_queue_entries',
     68             job__name__icontains=substring, job__owner=getpass.getuser(),
     69             job__parent_job__isnull=True)
     70     if hqe_info:
     71         logging.info('The following suites have been aborted:\n%s', hqe_info)
     72     else:
     73         logging.info('No suites have been aborted. The suite jobs may have '
     74                      'already been aborted/completed? Note this script does '
     75                      'not support asynchronus suites.')
     76 
     77 
     78 def main():
     79     """Main."""
     80     args = parse_args()
     81 
     82     log_dir = os.path.join(common.autotest_dir, 'logs')
     83     if not os.path.exists(log_dir):
     84         os.makedirs(log_dir)
     85     log_name = LOG_NAME_TEMPLATE % args.build.replace('/', '_')
     86     log_name = os.path.join(log_dir, log_name)
     87 
     88     utils.setup_logging(logfile=log_name, prefix=True)
     89 
     90     afe = frontend.AFE()
     91     name = SUITE_JOB_NAME_TEMPLATE % (args.build, args.name)
     92 
     93     abort_suites(afe, name)
     94     return 0
     95 
     96 
     97 if __name__ == '__main__':
     98     sys.exit(main())
     99