# Copyright (c) 2012 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.

"""
The job module contains the objects and methods used to
manage jobs in Autotest.

The valid actions are:
list:    lists job(s)
create:  create a job
abort:   abort job(s)
stat:    detailed listing of job(s)

The common options are:

See topic_common.py for a High Level Design and Algorithm.
"""

from autotest_lib.cli import topic_common, action_common


class suite(topic_common.atest):
    """Suite class
    atest suite [create] [options]"""
    usage_action = '[create]'
    topic = msg_topic = 'suite'
    msg_items = ''


class suite_help(suite):
    """Just here to get the atest logic working.
    Usage is set by its parent"""
    pass


class suite_create(action_common.atest_create, suite):
    """Class containing the code for creating a suite."""
    msg_items = 'suite_id'

    def __init__(self):
        super(suite_create, self).__init__()

        self.parser.add_option('-b', '--board', help='Board to test. Required.',
                               metavar='BOARD')
        self.parser.add_option('-i', '--build',
                               help='OS image to install before running the '
                                    'test, e.g. '
                                    'x86-alex-release/R17-1412.144.0-a1-b115.'
                                    ' Required.',
                               metavar='BUILD')
        self.parser.add_option('-c', '--check_hosts',
                               default=False,
                               help='Check that enough live hosts exist to '\
                                    'run this suite. Default False.',
                               action='store_true',
                               metavar='CHECK_HOSTS')
        self.parser.add_option('-f', '--file_bugs', default=False,
                               help='File bugs on test failures.',
                               action='store_true', metavar='FILE_BUGS')
        self.parser.add_option('-n', '--num', type=int,
                               help='Number of machines to schedule across.',
                               metavar='NUM')
        self.parser.add_option('-p', '--pool', help='Pool of machines to use.',
                               metavar='POOL')
        self.parser.add_option('-w', '--wait_for_results',
                               default=True,
                               help=('Set to False for suite job to exit '
                                     'without waiting for test jobs to finish. '
                                     'Default is True.'),
                               metavar='WAIT_FOR_RESULTS')
        self.parser.add_option('-d', '--delay_minutes', type=int, default=0,
                               help=('Delay the creation of test jobs for a '
                                     'given number of minutes. This argument '
                                     'can be used to force provision jobs '
                                     'being delayed, which helps to distribute '
                                     'loads across devservers.'),
                               metavar='DELAY_MINUTES')


    def parse(self):
        board_info = topic_common.item_parse_info(attribute_name='board',
                                                  inline_option='board')
        build_info = topic_common.item_parse_info(attribute_name='build',
                                                  inline_option='build')
        pool_info = topic_common.item_parse_info(attribute_name='pool',
                                                 inline_option='pool')
        num_info = topic_common.item_parse_info(attribute_name='num',
                                                inline_option='num')
        check_info = topic_common.item_parse_info(attribute_name='check_hosts',
                                                  inline_option='check_hosts')
        bugs_info = topic_common.item_parse_info(attribute_name='file_bugs',
                                                 inline_option='file_bugs')
        suite_info = topic_common.item_parse_info(attribute_name='name',
                                                  use_leftover=True)
        wait_for_results_info = topic_common.item_parse_info(
                attribute_name='wait_for_results',
                inline_option='wait_for_results')
        delay_minutes_info = topic_common.item_parse_info(
                attribute_name='delay_minutes',
                inline_option='delay_minutes')

        options, leftover = suite.parse(
            self,
            [suite_info, board_info, build_info, pool_info, num_info,
             check_info, bugs_info, wait_for_results_info, delay_minutes_info],
            req_items='name')
        self.data = {}
        name = getattr(self, 'name')
        if len(name) > 1:
            self.invalid_syntax('Too many arguments specified, only expected '
                                'to receive suite name: %s' % name)
        self.data['suite_name'] = name[0]
        self.data['pool'] = options.pool  # None is OK.
        self.data['num'] = options.num  # None is OK.
        self.data['check_hosts'] = options.check_hosts
        self.data['file_bugs'] = options.file_bugs
        self.data['wait_for_results'] = options.wait_for_results
        self.data['delay_minutes'] = options.delay_minutes
        if options.board:
            self.data['board'] = options.board
        else:
            self.invalid_syntax('--board is required.')
        if options.build:
            self.data['build'] = options.build
        else:
            self.invalid_syntax('--build is required.')

        return options, leftover


    def execute(self):
        return [self.execute_rpc(op='create_suite_job', **self.data)]
