1859fdecd96355279570007849d8bc46ff71874d7Chris Masone# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2859fdecd96355279570007849d8bc46ff71874d7Chris Masone# Use of this source code is governed by a BSD-style license that can be
3859fdecd96355279570007849d8bc46ff71874d7Chris Masone# found in the LICENSE file.
4859fdecd96355279570007849d8bc46ff71874d7Chris Masone
5859fdecd96355279570007849d8bc46ff71874d7Chris Masone"""
6859fdecd96355279570007849d8bc46ff71874d7Chris MasoneThe job module contains the objects and methods used to
7859fdecd96355279570007849d8bc46ff71874d7Chris Masonemanage jobs in Autotest.
8859fdecd96355279570007849d8bc46ff71874d7Chris Masone
9859fdecd96355279570007849d8bc46ff71874d7Chris MasoneThe valid actions are:
10859fdecd96355279570007849d8bc46ff71874d7Chris Masonelist:    lists job(s)
11859fdecd96355279570007849d8bc46ff71874d7Chris Masonecreate:  create a job
12859fdecd96355279570007849d8bc46ff71874d7Chris Masoneabort:   abort job(s)
13859fdecd96355279570007849d8bc46ff71874d7Chris Masonestat:    detailed listing of job(s)
14859fdecd96355279570007849d8bc46ff71874d7Chris Masone
15859fdecd96355279570007849d8bc46ff71874d7Chris MasoneThe common options are:
16859fdecd96355279570007849d8bc46ff71874d7Chris Masone
17859fdecd96355279570007849d8bc46ff71874d7Chris MasoneSee topic_common.py for a High Level Design and Algorithm.
18859fdecd96355279570007849d8bc46ff71874d7Chris Masone"""
19859fdecd96355279570007849d8bc46ff71874d7Chris Masone
20859fdecd96355279570007849d8bc46ff71874d7Chris Masonefrom autotest_lib.cli import topic_common, action_common
21859fdecd96355279570007849d8bc46ff71874d7Chris Masone
22859fdecd96355279570007849d8bc46ff71874d7Chris Masone
23859fdecd96355279570007849d8bc46ff71874d7Chris Masoneclass site_suite(topic_common.atest):
24859fdecd96355279570007849d8bc46ff71874d7Chris Masone    """Suite class
25859fdecd96355279570007849d8bc46ff71874d7Chris Masone    atest suite [create] [options]"""
26859fdecd96355279570007849d8bc46ff71874d7Chris Masone    usage_action = '[create]'
27859fdecd96355279570007849d8bc46ff71874d7Chris Masone    topic = msg_topic = 'suite'
28859fdecd96355279570007849d8bc46ff71874d7Chris Masone    msg_items = ''
29859fdecd96355279570007849d8bc46ff71874d7Chris Masone
30859fdecd96355279570007849d8bc46ff71874d7Chris Masone
31859fdecd96355279570007849d8bc46ff71874d7Chris Masoneclass site_suite_help(site_suite):
32859fdecd96355279570007849d8bc46ff71874d7Chris Masone    """Just here to get the atest logic working.
33859fdecd96355279570007849d8bc46ff71874d7Chris Masone    Usage is set by its parent"""
34859fdecd96355279570007849d8bc46ff71874d7Chris Masone    pass
35859fdecd96355279570007849d8bc46ff71874d7Chris Masone
36859fdecd96355279570007849d8bc46ff71874d7Chris Masone
37859fdecd96355279570007849d8bc46ff71874d7Chris Masoneclass site_suite_create(action_common.atest_create, site_suite):
38859fdecd96355279570007849d8bc46ff71874d7Chris Masone    """Class containing the code for creating a suite."""
39859fdecd96355279570007849d8bc46ff71874d7Chris Masone    msg_items = 'suite_id'
40859fdecd96355279570007849d8bc46ff71874d7Chris Masone
41859fdecd96355279570007849d8bc46ff71874d7Chris Masone    def __init__(self):
42859fdecd96355279570007849d8bc46ff71874d7Chris Masone        super(site_suite_create, self).__init__()
43859fdecd96355279570007849d8bc46ff71874d7Chris Masone
44859fdecd96355279570007849d8bc46ff71874d7Chris Masone        self.parser.add_option('-b', '--board', help='Board to test. Required.',
45859fdecd96355279570007849d8bc46ff71874d7Chris Masone                               metavar='BOARD')
46859fdecd96355279570007849d8bc46ff71874d7Chris Masone        self.parser.add_option('-i', '--build',
47859fdecd96355279570007849d8bc46ff71874d7Chris Masone                               help='OS image to install before running the '
48859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                    'test, e.g. '
49859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                    'x86-alex-release/R17-1412.144.0-a1-b115.'
50859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                    ' Required.',
51859fdecd96355279570007849d8bc46ff71874d7Chris Masone                               metavar='BUILD')
5262579122694934d942a4844a615bc034bc2e8aa1Chris Masone        self.parser.add_option('-c', '--check_hosts',
5362579122694934d942a4844a615bc034bc2e8aa1Chris Masone                               default=False,
5462579122694934d942a4844a615bc034bc2e8aa1Chris Masone                               help='Check that enough live hosts exist to '\
5562579122694934d942a4844a615bc034bc2e8aa1Chris Masone                                    'run this suite. Default False.',
5662579122694934d942a4844a615bc034bc2e8aa1Chris Masone                               action='store_true',
5762579122694934d942a4844a615bc034bc2e8aa1Chris Masone                               metavar='CHECK_HOSTS')
58f43d0eb812e32df81accf388f3aa73b051b35d47Alex Miller        self.parser.add_option('-f', '--file_bugs', default=False,
59f43d0eb812e32df81accf388f3aa73b051b35d47Alex Miller                               help='File bugs on test failures.',
60f43d0eb812e32df81accf388f3aa73b051b35d47Alex Miller                               action='store_true', metavar='FILE_BUGS')
6118c70b3d929b759ea9ba4e876517c6b8fd4d6921Chris Sosa        self.parser.add_option('-n', '--num', type=int,
6246d0eb11086d97db0178aa3cf316c8eb6d23c88dChris Masone                               help='Number of machines to schedule across.',
6346d0eb11086d97db0178aa3cf316c8eb6d23c88dChris Masone                               metavar='NUM')
64fc96a684c0b0827671e1e8c5dacb519fedb628c5Chris Masone        self.parser.add_option('-p', '--pool', help='Pool of machines to use.',
65fc96a684c0b0827671e1e8c5dacb519fedb628c5Chris Masone                               metavar='POOL')
669512241978928631e38d59b5aca6467172fd404bDan Shi        self.parser.add_option('-w', '--wait_for_results',
679512241978928631e38d59b5aca6467172fd404bDan Shi                               default=True,
689512241978928631e38d59b5aca6467172fd404bDan Shi                               help=('Set to False for suite job to exit '
699512241978928631e38d59b5aca6467172fd404bDan Shi                                     'without waiting for test jobs to finish. '
709512241978928631e38d59b5aca6467172fd404bDan Shi                                     'Default is True.'),
719512241978928631e38d59b5aca6467172fd404bDan Shi                               metavar='WAIT_FOR_RESULTS')
72859fdecd96355279570007849d8bc46ff71874d7Chris Masone
73859fdecd96355279570007849d8bc46ff71874d7Chris Masone
74859fdecd96355279570007849d8bc46ff71874d7Chris Masone    def parse(self):
75859fdecd96355279570007849d8bc46ff71874d7Chris Masone        board_info = topic_common.item_parse_info(attribute_name='board',
76859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                                  inline_option='board')
77859fdecd96355279570007849d8bc46ff71874d7Chris Masone        build_info = topic_common.item_parse_info(attribute_name='build',
78859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                                  inline_option='build')
7962579122694934d942a4844a615bc034bc2e8aa1Chris Masone        pool_info = topic_common.item_parse_info(attribute_name='pool',
8062579122694934d942a4844a615bc034bc2e8aa1Chris Masone                                                 inline_option='pool')
8146d0eb11086d97db0178aa3cf316c8eb6d23c88dChris Masone        num_info = topic_common.item_parse_info(attribute_name='num',
8246d0eb11086d97db0178aa3cf316c8eb6d23c88dChris Masone                                                inline_option='num')
8362579122694934d942a4844a615bc034bc2e8aa1Chris Masone        check_info = topic_common.item_parse_info(attribute_name='check_hosts',
8462579122694934d942a4844a615bc034bc2e8aa1Chris Masone                                                  inline_option='check_hosts')
85f43d0eb812e32df81accf388f3aa73b051b35d47Alex Miller        bugs_info = topic_common.item_parse_info(attribute_name='file_bugs',
86f43d0eb812e32df81accf388f3aa73b051b35d47Alex Miller                                                 inline_option='file_bugs')
87859fdecd96355279570007849d8bc46ff71874d7Chris Masone        suite_info = topic_common.item_parse_info(attribute_name='name',
88859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                                  use_leftover=True)
899512241978928631e38d59b5aca6467172fd404bDan Shi        wait_for_results_info = topic_common.item_parse_info(
909512241978928631e38d59b5aca6467172fd404bDan Shi            attribute_name='wait_for_results',
919512241978928631e38d59b5aca6467172fd404bDan Shi            inline_option='wait_for_results')
92859fdecd96355279570007849d8bc46ff71874d7Chris Masone
9362579122694934d942a4844a615bc034bc2e8aa1Chris Masone        options, leftover = site_suite.parse(
9462579122694934d942a4844a615bc034bc2e8aa1Chris Masone            self,
9546d0eb11086d97db0178aa3cf316c8eb6d23c88dChris Masone            [suite_info, board_info, build_info, pool_info, num_info,
969512241978928631e38d59b5aca6467172fd404bDan Shi             check_info, bugs_info, wait_for_results_info],
9762579122694934d942a4844a615bc034bc2e8aa1Chris Masone            req_items='name')
98859fdecd96355279570007849d8bc46ff71874d7Chris Masone        self.data = {}
99859fdecd96355279570007849d8bc46ff71874d7Chris Masone        name = getattr(self, 'name')
100859fdecd96355279570007849d8bc46ff71874d7Chris Masone        if len(name) > 1:
101859fdecd96355279570007849d8bc46ff71874d7Chris Masone            self.invalid_syntax('Too many arguments specified, only expected '
102859fdecd96355279570007849d8bc46ff71874d7Chris Masone                                'to receive suite name: %s' % name)
103859fdecd96355279570007849d8bc46ff71874d7Chris Masone        self.data['suite_name'] = name[0]
104fc96a684c0b0827671e1e8c5dacb519fedb628c5Chris Masone        self.data['pool'] = options.pool  # None is OK.
10546d0eb11086d97db0178aa3cf316c8eb6d23c88dChris Masone        self.data['num'] = options.num  # None is OK.
10662579122694934d942a4844a615bc034bc2e8aa1Chris Masone        self.data['check_hosts'] = options.check_hosts
107f43d0eb812e32df81accf388f3aa73b051b35d47Alex Miller        self.data['file_bugs'] = options.file_bugs
1089512241978928631e38d59b5aca6467172fd404bDan Shi        self.data['wait_for_results'] = options.wait_for_results
109859fdecd96355279570007849d8bc46ff71874d7Chris Masone        if options.board:
110859fdecd96355279570007849d8bc46ff71874d7Chris Masone            self.data['board'] = options.board
111859fdecd96355279570007849d8bc46ff71874d7Chris Masone        else:
112859fdecd96355279570007849d8bc46ff71874d7Chris Masone            self.invalid_syntax('--board is required.')
113859fdecd96355279570007849d8bc46ff71874d7Chris Masone        if options.build:
114859fdecd96355279570007849d8bc46ff71874d7Chris Masone            self.data['build'] = options.build
115859fdecd96355279570007849d8bc46ff71874d7Chris Masone        else:
116859fdecd96355279570007849d8bc46ff71874d7Chris Masone            self.invalid_syntax('--build is required.')
117859fdecd96355279570007849d8bc46ff71874d7Chris Masone
118859fdecd96355279570007849d8bc46ff71874d7Chris Masone        return options, leftover
119859fdecd96355279570007849d8bc46ff71874d7Chris Masone
120859fdecd96355279570007849d8bc46ff71874d7Chris Masone
121859fdecd96355279570007849d8bc46ff71874d7Chris Masone    def execute(self):
122859fdecd96355279570007849d8bc46ff71874d7Chris Masone        return [self.execute_rpc(op='create_suite_job', **self.data)]
123