133 lines
5.8 KiB
Python
133 lines
5.8 KiB
Python
# 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)]
|