def testReRead(self): """Test that we reread() loads the same config file over again.""" section = 'first' option1 = 'option1' value1 = 'value1' option2 = 'option2' value2 = 'value2' # Create initial file. initial = forgiving_config_parser.ForgivingConfigParser() initial.add_section(section) initial.set(section, option1, value1) with open(self._tmpconfig.name, 'w') as conf_file: initial.write(conf_file) to_test = forgiving_config_parser.ForgivingConfigParser() to_test.read(self._tmpconfig.name) self.assertEquals(value1, to_test.getstring(section, option1)) self.assertEquals(None, to_test.getstring(section, option2)) initial.set(section, option2, value2) initial.remove_option(section, option1) with open(self._tmpconfig.name, 'w') as conf_file: initial.write(conf_file) to_test.reread() self.assertEquals(None, to_test.getstring(section, option1)) self.assertEquals(value2, to_test.getstring(section, option2))
def testCreateFromAlwaysHandleConfig(self): """Test that creating with always_handle works as intended.""" config = forgiving_config_parser.ForgivingConfigParser() section = base_event.SectionName(build_event.NewBuild.KEYWORD) config.add_section(section) config.set(section, 'always_handle', 'True') self.mox.ReplayAll() event = build_event.NewBuild.CreateFromConfig(config, self.mv) self.assertTrue(event.ShouldHandle())
def setUp(self): super(TaskCreateTest, self).setUp() self.config = forgiving_config_parser.ForgivingConfigParser() self.config.add_section(self._TASK_NAME) self.config.set(self._TASK_NAME, 'suite', self._SUITE) self.config.set(self._TASK_NAME, 'branch_specs', self._BRANCH_SPEC) self.config.set(self._TASK_NAME, 'run_on', self._EVENT_KEY) self.config.set(self._TASK_NAME, 'pool', self._POOL) self.config.set(self._TASK_NAME, 'num', '%d' % self._NUM) self.config.set(self._TASK_NAME, 'boards', self._BOARD)
def testCreateFromEmptyConfig(self): """Test that creating from empty config uses defaults.""" config = forgiving_config_parser.ForgivingConfigParser() timed_event.TimedEvent._now().MultipleTimes().AndReturn( self.BaseTime()) self.mox.ReplayAll() self.assertEquals( timed_event.Nightly(self.mv, False), timed_event.Nightly.CreateFromConfig(config, self.mv))
def testCreateFromConfig(self): """Test that creating from config is equivalent to using constructor.""" config = forgiving_config_parser.ForgivingConfigParser() section = base_event.SectionName(timed_event.Weekly.KEYWORD) config.add_section(section) config.set(section, 'hour', '%d' % self._HOUR) timed_event.TimedEvent._now().MultipleTimes().AndReturn( self.BaseTime()) self.mox.ReplayAll() self.assertEquals(self.CreateEvent(), timed_event.Weekly.CreateFromConfig(config, self.mv))
def testCreateFromAlwaysHandleConfig(self): """Test that creating with always_handle works as intended.""" config = forgiving_config_parser.ForgivingConfigParser() section = base_event.SectionName(timed_event.Nightly.KEYWORD) config.add_section(section) config.set(section, 'always_handle', 'True') timed_event.TimedEvent._now().MultipleTimes().AndReturn( self.BaseTime()) self.mox.ReplayAll() event = timed_event.Nightly.CreateFromConfig(config, self.mv) self.assertTrue(event.ShouldHandle())
def setUp(self): super(DriverTest, self).setUp() self.afe = self.mox.CreateMock(frontend.AFE) self.be = board_enumerator.BoardEnumerator(self.afe) self.ds = deduping_scheduler.DedupingScheduler(self.afe) self.mv = self.mox.CreateMock(manifest_versions.ManifestVersions) self.config = forgiving_config_parser.ForgivingConfigParser() self.nightly_bvt = task.Task(timed_event.Nightly.KEYWORD, '', '') self.weekly_bvt = task.Task(timed_event.Weekly.KEYWORD, '', '') self.new_build_bvt = task.Task(build_event.NewBuild.KEYWORD, '', '') self.driver = driver.Driver(self.ds, self.be)
def main(): """Entry point for suite_scheduler.py""" signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGHUP, signal_handler) signal.signal(signal.SIGTERM, signal_handler) parser, options, args = parse_options() if args or options.events and not options.build: parser.print_help() return 1 if options.config_file and not os.path.exists(options.config_file): logging.error('Specified config file %s does not exist.', options.config_file) return 1 config = forgiving_config_parser.ForgivingConfigParser() config.read(options.config_file) if options.list: print 'Supported events:' for event_class in driver.Driver.EVENT_CLASSES: print ' ', event_class.KEYWORD return 0 # If we're just sanity checking, we can stop after we've parsed the # config file. if options.sanity: # config_file_getter generates a high amount of noise at DEBUG level logging.getLogger().setLevel(logging.WARNING) d = driver.Driver(None, None, True) d.SetUpEventsAndTasks(config, None) tasks_per_event = d.TasksFromConfig(config) # flatten [[a]] -> [a] tasks = [x for y in tasks_per_event.values() for x in y] control_files_exist = sanity.CheckControlFileExistence(tasks) return control_files_exist logging_manager.configure_logging(SchedulerLoggingConfig(), log_dir=options.log_dir) if not options.log_dir: logging.info('Not logging to a file, as --log_dir was not passed.') # If server database is enabled, check if the server has role # `suite_scheduler`. If the server does not have suite_scheduler role, # exception will be raised and suite scheduler will not continue to run. if not server_manager_utils: raise ImportError( 'Could not import autotest_lib.site_utils.server_manager_utils') if server_manager_utils.use_server_db(): server_manager_utils.confirm_server_has_role(hostname='localhost', role='suite_scheduler') afe_server = global_config.global_config.get_config_value( CONFIG_SECTION_SERVER, "suite_scheduler_afe", default=None) afe = frontend_wrappers.RetryingAFE(server=afe_server, timeout_min=10, delay_sec=5, debug=False) logging.info('Connecting to: %s', afe.server) enumerator = board_enumerator.BoardEnumerator(afe) scheduler = deduping_scheduler.DedupingScheduler(afe, options.file_bug) mv = manifest_versions.ManifestVersions(options.tmp_repo_dir) d = driver.Driver(scheduler, enumerator) d.SetUpEventsAndTasks(config, mv) # Set up metrics upload for Monarch. ts_mon_config.SetupTsMonGlobalState('autotest_suite_scheduler') try: if options.events: # Act as though listed events have just happened. keywords = re.split('\s*,\s*', options.events) if not options.tmp_repo_dir: logging.warn('To run a list of events, you may need to use ' '--repo_dir to specify a folder that already has ' 'manifest repo set up. This is needed for suites ' 'requiring firmware update.') logging.info('Forcing events: %r', keywords) d.ForceEventsOnceForBuild(keywords, options.build, options.os_type) else: if not options.tmp_repo_dir: mv.Initialize() d.RunForever(config, mv) except Exception as e: logging.error('Fatal exception in suite_scheduler: %r\n%s', e, traceback.format_exc()) return 1