| # 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. |
| """ |
| |
| import warnings |
| |
| 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. |
| if options.num is not None: |
| warnings.warn('num is deprecated') |
| del options.num |
| 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)] |