• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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"""
9Usage: ./abort_suite.py [-i and -s you passed to run_suite.py]
10
11This code exists to allow buildbot to abort a HWTest run if another part of
12the build fails while HWTesting is going on.  If we're going to fail the
13build anyway, there's no point in continuing to run tests.
14
15One can also pass just the build version to -i, to abort all boards running the
16suite against that version. ie. |./abort_suite.py -i R28-3993.0.0 -s dummy|
17would abort all boards running dummy on R28-3993.0.0.
18
19To achieve better performance, this script aborts suite jobs and relies on
20autotest scheduler to aborts its subjobs instead of directly aborting subjobs.
21So only synchronous suites is supported.
22
23"""
24
25
26import argparse
27import getpass
28import logging
29import os
30import sys
31
32import common
33from autotest_lib.server import frontend
34from autotest_lib.server import utils
35
36
37LOG_NAME_TEMPLATE = 'abort_suite-%s.log'
38SUITE_JOB_NAME_TEMPLATE = '%s-test_suites/control.%s'
39
40
41def 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
54def 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
78def 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
97if __name__ == '__main__':
98    sys.exit(main())
99