#!/usr/bin/python2 -t
#
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""
Usage: ./abort_suite.py [-i and -s you passed to run_suite.py]

This code exists to allow buildbot to abort a HWTest run if another part of
the build fails while HWTesting is going on.  If we're going to fail the
build anyway, there's no point in continuing to run tests.

One can also pass just the build version to -i, to abort all boards running the
suite against that version. ie. |./abort_suite.py -i R28-3993.0.0 -s dummy|
would abort all boards running dummy on R28-3993.0.0.

To achieve better performance, this script aborts suite jobs and relies on
autotest scheduler to aborts its subjobs instead of directly aborting subjobs.
So only synchronous suites is supported.

"""


import argparse
import getpass
import logging
import os
import sys

import common
from autotest_lib.server import frontend
from autotest_lib.server import utils


LOG_NAME_TEMPLATE = 'abort_suite-%s.log'
SUITE_JOB_NAME_TEMPLATE = '%s-test_suites/control.%s'


def parse_args():
    """
    Parse the arguments to this script.

    @return The arguments to this script.

    """
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', '--suite_name', dest='name')
    parser.add_argument('-i', '--build', dest='build')
    return parser.parse_args()


def abort_suites(afe, substring):
    """
    Abort the suite.

    This method aborts the suite jobs whose name contains |substring|.
    Aborting a suite job will lead to all its child jobs to be aborted
    by autotest scheduler.

    @param afe: An instance of frontend.AFE to make RPCs with.
    @param substring: A string used to search for the jobs (case insensitive
            matching).

    """
    hqe_info = afe.run('abort_host_queue_entries',
            job__name__icontains=substring, job__owner=getpass.getuser(),
            job__parent_job__isnull=True)
    if hqe_info:
        logging.info('The following suites have been aborted:\n%s', hqe_info)
    else:
        logging.info('No suites have been aborted. The suite jobs may have '
                     'already been aborted/completed? Note this script does '
                     'not support asynchronus suites.')


def main():
    """Main."""
    args = parse_args()

    log_dir = os.path.join(common.autotest_dir, 'logs')
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
    log_name = LOG_NAME_TEMPLATE % args.build.replace('/', '_')
    log_name = os.path.join(log_dir, log_name)

    utils.setup_logging(logfile=log_name, prefix=True)

    afe = frontend.AFE()
    name = SUITE_JOB_NAME_TEMPLATE % (args.build, args.name)

    abort_suites(afe, name)
    return 0


if __name__ == '__main__':
    sys.exit(main())
