• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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 suite_help(suite):
32    """Just here to get the atest logic working.
33    Usage is set by its parent"""
34    pass
35
36
37class suite_create(action_common.atest_create, suite):
38    """Class containing the code for creating a suite."""
39    msg_items = 'suite_id'
40
41    def __init__(self):
42        super(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        self.parser.add_option('-d', '--delay_minutes', type=int, default=0,
73                               help=('Delay the creation of test jobs for a '
74                                     'given number of minutes. This argument '
75                                     'can be used to force provision jobs '
76                                     'being delayed, which helps to distribute '
77                                     'loads across devservers.'),
78                               metavar='DELAY_MINUTES')
79
80
81    def parse(self):
82        board_info = topic_common.item_parse_info(attribute_name='board',
83                                                  inline_option='board')
84        build_info = topic_common.item_parse_info(attribute_name='build',
85                                                  inline_option='build')
86        pool_info = topic_common.item_parse_info(attribute_name='pool',
87                                                 inline_option='pool')
88        num_info = topic_common.item_parse_info(attribute_name='num',
89                                                inline_option='num')
90        check_info = topic_common.item_parse_info(attribute_name='check_hosts',
91                                                  inline_option='check_hosts')
92        bugs_info = topic_common.item_parse_info(attribute_name='file_bugs',
93                                                 inline_option='file_bugs')
94        suite_info = topic_common.item_parse_info(attribute_name='name',
95                                                  use_leftover=True)
96        wait_for_results_info = topic_common.item_parse_info(
97                attribute_name='wait_for_results',
98                inline_option='wait_for_results')
99        delay_minutes_info = topic_common.item_parse_info(
100                attribute_name='delay_minutes',
101                inline_option='delay_minutes')
102
103        options, leftover = suite.parse(
104            self,
105            [suite_info, board_info, build_info, pool_info, num_info,
106             check_info, bugs_info, wait_for_results_info, delay_minutes_info],
107            req_items='name')
108        self.data = {}
109        name = getattr(self, 'name')
110        if len(name) > 1:
111            self.invalid_syntax('Too many arguments specified, only expected '
112                                'to receive suite name: %s' % name)
113        self.data['suite_name'] = name[0]
114        self.data['pool'] = options.pool  # None is OK.
115        self.data['num'] = options.num  # None is OK.
116        self.data['check_hosts'] = options.check_hosts
117        self.data['file_bugs'] = options.file_bugs
118        self.data['wait_for_results'] = options.wait_for_results
119        self.data['delay_minutes'] = options.delay_minutes
120        if options.board:
121            self.data['board'] = options.board
122        else:
123            self.invalid_syntax('--board is required.')
124        if options.build:
125            self.data['build'] = options.build
126        else:
127            self.invalid_syntax('--build is required.')
128
129        return options, leftover
130
131
132    def execute(self):
133        return [self.execute_rpc(op='create_suite_job', **self.data)]
134