blob: 19212946bdf5d5be0e906830119080067e75d680 [file] [log] [blame]
Alex Millerde781112013-04-27 23:50:28 -07001#!/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
Fang Deng63b0e452014-12-19 14:38:15 -080019To 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
Alex Millerde781112013-04-27 23:50:28 -070023"""
24
25
26import argparse
27import getpass
Fang Deng63b0e452014-12-19 14:38:15 -080028import logging
MK Ryu83184352014-12-10 14:59:40 -080029import os
Alex Millerde781112013-04-27 23:50:28 -070030import sys
MK Ryu83184352014-12-10 14:59:40 -080031from datetime import datetime
Alex Millerde781112013-04-27 23:50:28 -070032
33import common
Fang Deng63b0e452014-12-19 14:38:15 -080034from autotest_lib.client.common_lib.cros.graphite import stats
Alex Millerde781112013-04-27 23:50:28 -070035from autotest_lib.server import frontend
MK Ryu83184352014-12-10 14:59:40 -080036from autotest_lib.server import utils
Alex Millerde781112013-04-27 23:50:28 -070037
38
MK Ryu83184352014-12-10 14:59:40 -080039LOG_NAME_TEMPLATE = 'abort_suite-%s.log'
Alex Millerde781112013-04-27 23:50:28 -070040SUITE_JOB_NAME_TEMPLATE = '%s-test_suites/control.%s'
Fang Deng63b0e452014-12-19 14:38:15 -080041_timer = stats.Timer('abort_suites')
Alex Millerde781112013-04-27 23:50:28 -070042
43
44def parse_args():
45 """
46 Parse the arguments to this script.
47
48 @return The arguments to this script.
49
50 """
51 parser = argparse.ArgumentParser()
52 parser.add_argument('-s', '--suite_name', dest='name')
53 parser.add_argument('-i', '--build', dest='build')
54 return parser.parse_args()
55
56
Fang Deng63b0e452014-12-19 14:38:15 -080057@_timer.decorate
58def abort_suites(afe, substring):
Alex Millerde781112013-04-27 23:50:28 -070059 """
Fang Deng63b0e452014-12-19 14:38:15 -080060 Abort the suite.
Alex Millerde781112013-04-27 23:50:28 -070061
Fang Deng63b0e452014-12-19 14:38:15 -080062 This method aborts the suite jobs whose name contains |substring|.
63 Aborting a suite job will lead to all its child jobs to be aborted
64 by autotest scheduler.
65
66 @param afe: An instance of frontend.AFE to make RPCs with.
67 @param substring: A string used to search for the jobs.
Alex Millerde781112013-04-27 23:50:28 -070068
69 """
Fang Deng63b0e452014-12-19 14:38:15 -080070 hqe_info = afe.run('abort_host_queue_entries',
71 job__name__contains=substring, job__owner=getpass.getuser(),
72 job__parent_job__isnull=True)
73 if hqe_info:
74 logging.info('The following suites have been aborted:\n%s', hqe_info)
75 else:
76 logging.info('No suites have been aborted. The suite jobs may have '
77 'already been aborted/completed? Note this script does '
78 'not support asynchronus suites.')
Alex Millerde781112013-04-27 23:50:28 -070079
80
81def main():
82 """Main."""
Alex Millerde781112013-04-27 23:50:28 -070083 args = parse_args()
MK Ryu83184352014-12-10 14:59:40 -080084
85 log_dir = os.path.join(common.autotest_dir, 'logs')
86 if not os.path.exists(log_dir):
87 os.makedirs(log_dir)
88 log_name = LOG_NAME_TEMPLATE % args.build.replace('/', '_')
89 log_name = os.path.join(log_dir, log_name)
90
MK Ryu2d0a3642015-01-07 15:11:19 -080091 utils.setup_logging(logfile=log_name, prefix=True)
MK Ryu83184352014-12-10 14:59:40 -080092
93 afe = frontend.AFE()
Alex Millerde781112013-04-27 23:50:28 -070094 name = SUITE_JOB_NAME_TEMPLATE % (args.build, args.name)
Fang Deng63b0e452014-12-19 14:38:15 -080095 abort_suites(afe, name)
Alex Millerde781112013-04-27 23:50:28 -070096 return 0
97
98
99if __name__ == '__main__':
100 sys.exit(main())