1# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""
6The job module contains the objects and methods used to
7manage jobs in Autotest.
8
9The valid actions are:
10list:    lists job(s)
11create:  create a job
12abort:   abort job(s)
13stat:    detailed listing of job(s)
14
15The common options are:
16
17See topic_common.py for a High Level Design and Algorithm.
18"""
19
20from autotest_lib.cli import topic_common, action_common
21
22
23class site_suite(topic_common.atest):
24    """Suite class
25    atest suite [create] [options]"""
26    usage_action = '[create]'
27    topic = msg_topic = 'suite'
28    msg_items = ''
29
30
31class site_suite_help(site_suite):
32    """Just here to get the atest logic working.
33    Usage is set by its parent"""
34    pass
35
36
37class site_suite_create(action_common.atest_create, site_suite):
38    """Class containing the code for creating a suite."""
39    msg_items = 'suite_id'
40
41    def __init__(self):
42        super(site_suite_create, self).__init__()
43
44        self.parser.add_option('-b', '--board', help='Board to test. Required.',
45                               metavar='BOARD')
46        self.parser.add_option('-i', '--build',
47                               help='OS image to install before running the '
48                                    'test, e.g. '
49                                    'x86-alex-release/R17-1412.144.0-a1-b115.'
50                                    ' Required.',
51                               metavar='BUILD')
52        self.parser.add_option('-c', '--check_hosts',
53                               default=False,
54                               help='Check that enough live hosts exist to '\
55                                    'run this suite. Default False.',
56                               action='store_true',
57                               metavar='CHECK_HOSTS')
58        self.parser.add_option('-f', '--file_bugs', default=False,
59                               help='File bugs on test failures.',
60                               action='store_true', metavar='FILE_BUGS')
61        self.parser.add_option('-n', '--num', type=int,
62                               help='Number of machines to schedule across.',
63                               metavar='NUM')
64        self.parser.add_option('-p', '--pool', help='Pool of machines to use.',
65                               metavar='POOL')
66        self.parser.add_option('-w', '--wait_for_results',
67                               default=True,
68                               help=('Set to False for suite job to exit '
69                                     'without waiting for test jobs to finish. '
70                                     'Default is True.'),
71                               metavar='WAIT_FOR_RESULTS')
72
73
74    def parse(self):
75        board_info = topic_common.item_parse_info(attribute_name='board',
76                                                  inline_option='board')
77        build_info = topic_common.item_parse_info(attribute_name='build',
78                                                  inline_option='build')
79        pool_info = topic_common.item_parse_info(attribute_name='pool',
80                                                 inline_option='pool')
81        num_info = topic_common.item_parse_info(attribute_name='num',
82                                                inline_option='num')
83        check_info = topic_common.item_parse_info(attribute_name='check_hosts',
84                                                  inline_option='check_hosts')
85        bugs_info = topic_common.item_parse_info(attribute_name='file_bugs',
86                                                 inline_option='file_bugs')
87        suite_info = topic_common.item_parse_info(attribute_name='name',
88                                                  use_leftover=True)
89        wait_for_results_info = topic_common.item_parse_info(
90            attribute_name='wait_for_results',
91            inline_option='wait_for_results')
92
93        options, leftover = site_suite.parse(
94            self,
95            [suite_info, board_info, build_info, pool_info, num_info,
96             check_info, bugs_info, wait_for_results_info],
97            req_items='name')
98        self.data = {}
99        name = getattr(self, 'name')
100        if len(name) > 1:
101            self.invalid_syntax('Too many arguments specified, only expected '
102                                'to receive suite name: %s' % name)
103        self.data['suite_name'] = name[0]
104        self.data['pool'] = options.pool  # None is OK.
105        self.data['num'] = options.num  # None is OK.
106        self.data['check_hosts'] = options.check_hosts
107        self.data['file_bugs'] = options.file_bugs
108        self.data['wait_for_results'] = options.wait_for_results
109        if options.board:
110            self.data['board'] = options.board
111        else:
112            self.invalid_syntax('--board is required.')
113        if options.build:
114            self.data['build'] = options.build
115        else:
116            self.invalid_syntax('--build is required.')
117
118        return options, leftover
119
120
121    def execute(self):
122        return [self.execute_rpc(op='create_suite_job', **self.data)]
123