def create_generate_tasks_config( evg_config: Configuration, tests_by_task: Dict, generate_config: GenerateConfig, repeat_config: RepeatConfig, evg_api: Optional[EvergreenApi], evg_project_config: EvergreenProjectConfig, include_gen_task: bool = True, task_prefix: str = "burn_in") -> Configuration: # pylint: disable=too-many-arguments,too-many-locals """ Create the config for the Evergreen generate.tasks file. :param evg_config: Shrub configuration to add to. :param tests_by_task: Dictionary of tests to generate tasks for. :param generate_config: Configuration of what to generate. :param repeat_config: Configuration of how to repeat tests. :param evg_api: Evergreen API. :param include_gen_task: Should generating task be include in display task. :param task_prefix: Prefix all task names with this. :return: Shrub configuration with added tasks. """ task_list = TaskList(evg_config) resmoke_options = repeat_config.generate_resmoke_options() for task in sorted(tests_by_task): test_list = tests_by_task[task]["tests"] for index, test in enumerate(test_list): if task in evg_project_config.get_task_names_by_tag(RANDOM_MULTIVERSION_REPLSETS_TAG): # Exclude files that should be blacklisted from multiversion testing. task_name = gen_resmoke.remove_gen_suffix(task) files_to_exclude = gen_multiversion.get_exclude_files(task_name, TASK_PATH_SUFFIX) if test in files_to_exclude: LOGGER.debug("Files to exclude", files_to_exclude=files_to_exclude, test=test, suite=task) continue multiversion_path = tests_by_task[task].get("use_multiversion") display_task_name = tests_by_task[task]["display_task_name"] task_runtime_stats = _get_task_runtime_history( evg_api, generate_config.project, display_task_name, generate_config.build_variant) resmoke_args = tests_by_task[task]["resmoke_args"] distro = tests_by_task[task].get("distro", generate_config.distro) # Evergreen always uses a unix shell, even on Windows, so instead of using os.path.join # here, just use the forward slash; otherwise the path separator will be treated as # the escape character on Windows. sub_task_name = name_generated_task(f"{task_prefix}:{display_task_name}", index, len(test_list), generate_config.run_build_variant) LOGGER.debug("Generating sub-task", sub_task=sub_task_name) test_unix_style = test.replace('\\', '/') run_tests_vars = {"resmoke_args": f"{resmoke_args} {resmoke_options} {test_unix_style}"} if multiversion_path: run_tests_vars["task_path_suffix"] = multiversion_path timeout = _generate_timeouts(repeat_config, test, task_runtime_stats) commands = resmoke_commands("run tests", run_tests_vars, timeout, multiversion_path) task_list.add_task(sub_task_name, commands, ["compile"], distro) existing_tasks = [BURN_IN_TESTS_GEN_TASK] if include_gen_task else None task_list.add_to_variant(generate_config.run_build_variant, BURN_IN_TESTS_TASK, existing_tasks) return evg_config
def burn_in(repeat_config: RepeatConfig, generate_config: GenerateConfig, resmoke_args: str, generate_tasks_file: str, no_exec: bool, evg_conf: EvergreenProjectConfig, repos: Iterable[Repo], evg_api: EvergreenApi): """ Run burn_in_tests with the given configuration. :param repeat_config: Config on how much to repeat tests. :param generate_config: Config on how to generate tests. :param resmoke_args: Arguments to pass to resmoke. :param generate_tasks_file: File to write generated config to. :param no_exec: Do not execute tests, just discover tests to run. :param evg_conf: Evergreen configuration. :param repos: Git repositories to check. :param evg_api: Evergreen API client. """ # Populate the config values in order to use the helpers from resmokelib.suitesconfig. resmoke_cmd = _set_resmoke_cmd(repeat_config, list(resmoke_args)) tests_by_task = create_tests_by_task(generate_config.build_variant, repos, evg_conf) LOGGER.debug("tests and tasks found", tests_by_task=tests_by_task) if generate_tasks_file: if generate_config.use_multiversion: multiversion_tasks = evg_conf.get_task_names_by_tag( MULTIVERSION_PASSTHROUGH_TAG) LOGGER.debug("Multiversion tasks by tag", tasks=multiversion_tasks, tag=MULTIVERSION_PASSTHROUGH_TAG) # We expect the number of suites with MULTIVERSION_PASSTHROUGH_TAG to be the same as in # multiversion_suites. Multiversion passthrough suites must include # MULTIVERSION_CONFIG_KEY as a root level key and must be set to true. multiversion_suites = get_named_suites_with_root_level_key( MULTIVERSION_CONFIG_KEY) assert len(multiversion_tasks) == len(multiversion_suites) json_config = create_generate_tasks_file(tests_by_task, generate_config, repeat_config, evg_api, evg_conf) _write_json_file(json_config, generate_tasks_file) elif not no_exec: run_tests(tests_by_task, resmoke_cmd) else: LOGGER.info("Not running tests due to 'no_exec' option.")