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