#!/usr/bin/python2 -u
#
# autotest <control file> - run the autotest control file specified.
#
import os, sys
import common
from optparse import OptionParser
from autotest_lib.client.bin import job
from autotest_lib.client.common_lib import global_config


# Use the name of the binary to find the real installation directory
# aka $AUTODIR.  Update our path to include the $AUTODIR/bin/tests
# directory and ensure we have $AUTODIR in our environment.
autodirbin = os.path.dirname(os.path.realpath(sys.argv[0]))
autodir = os.path.dirname(autodirbin)

sys.path.insert(0, autodirbin)

os.environ['AUTODIR'] = autodir
os.environ['AUTODIRBIN'] = autodirbin
os.environ['PYTHONPATH'] = autodirbin

parser = OptionParser(usage='Usage: %prog [options] <control-file>')

parser.add_option("-a", "--args", dest='args',
                        help="additional args to pass to control file")

parser.add_option("-c", "--continue", dest="cont", action="store_true",
                        default=False, help="continue previously started job")

parser.add_option("-t", "--tag", dest="tag", type="string", default="default",
                        help="set the job tag")

parser.add_option("-H", "--harness", dest="harness", type="string", default='',
                        help="set the harness type")

parser.add_option("-P", "--harness_args", dest="harness_args", type="string", default='',
                        help="arguments delivered to harness")

parser.add_option("-U", "--user", dest="user", type="string",
                        default='', help="set the job username")

parser.add_option("-l", "--external_logging", dest="log", action="store_true",
                        default=False, help="enable external logging")

parser.add_option('--verbose', dest='verbose', action='store_true',
                  help='Include DEBUG messages in console output')

parser.add_option('--quiet', dest='verbose', action='store_false',
                  help='Not include DEBUG messages in console output')

parser.add_option('--hostname', dest='hostname', type='string',
                  default=None, action='store',
                  help='Take this as the hostname of this machine '
                       '(given by autoserv)')

parser.add_option('--output_dir', dest='output_dir',
                  type='string', default="", action='store',
                  help='Specify an alternate path to store test result logs')

parser.add_option('--client_test_setup', dest='client_test_setup',
                  type='string', default=None, action='store',
                  help='a comma seperated list of client tests to prebuild on '
                       'the server. Use all to prebuild all of them.')

parser.add_option('--tap', dest='tap_report', action='store_true',
                  default=None, help='Deprecated, do not use.')

def usage():
    parser.print_help()
    sys.exit(1)

options, args = parser.parse_args()

# Check for a control file if not in prebuild mode.
if len(args) != 1 and options.client_test_setup is None:
    print "Missing control file!"
    usage()

drop_caches = global_config.global_config.get_config_value('CLIENT',
                                                           'drop_caches',
                                                           type=bool,
                                                           default=True)

if options.client_test_setup:
    from autotest_lib.client.bin import setup_job
    exit_code = 0
    try:
        setup_job.setup_tests(options)
    except:
        exit_code = 1
    sys.exit(exit_code)

# JOB: run the specified job control file.
job.runjob(os.path.realpath(args[0]), drop_caches, options)
