예제 #1
0
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
예제 #2
0
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.")