Example #1
0
def run(evg_api: EvergreenApi, evg_conf: EvergreenProjectConfig,
        selected_tests_service: SelectedTestsService,
        selected_tests_variant_expansions: Dict[str, str],
        repos: List[Repo]) -> Dict[str, str]:
    # pylint: disable=too-many-locals
    """
    Run code to select tasks to run based on test and task mappings for each of the build variants.

    :param evg_api: Evergreen API object.
    :param evg_conf: Evergreen configuration.
    :param selected_tests_service: Selected-tests service.
    :param selected_tests_variant_expansions: Expansions of the selected-tests variant.
    :param repos: List of repos containing changed files.
    :return: Dict of files and file contents for generated tasks.
    """
    config_dict_of_suites_and_tasks = {}

    task_id = selected_tests_variant_expansions[TASK_ID_EXPANSION]
    revision_map = generate_revision_map_from_manifest(repos, task_id, evg_api)
    changed_files = find_changed_files_in_repos(repos, revision_map)
    changed_files = {
        _remove_repo_path_prefix(file_path)
        for file_path in changed_files
    }
    LOGGER.info("Found changed files", files=changed_files)

    shrub_project = ShrubProject()
    for build_variant_config in evg_conf.get_required_variants():
        shrub_build_variant = BuildVariant(build_variant_config.name)
        origin_variant_expansions = build_variant_config.expansions

        task_configs = _get_task_configs(evg_conf, selected_tests_service,
                                         selected_tests_variant_expansions,
                                         build_variant_config, changed_files)

        remove_task_configs_already_in_build(
            task_configs, evg_api, build_variant_config,
            selected_tests_variant_expansions["version_id"])

        for task_config in task_configs.values():
            Suite.reset_current_index()
            config_options = SelectedTestsConfigOptions.from_file(
                origin_variant_expansions,
                selected_tests_variant_expansions,
                task_config,
                REQUIRED_CONFIG_KEYS,
                DEFAULT_CONFIG_VALUES,
                CONFIG_FORMAT_FN,
            )
            _update_config_with_task(evg_api, shrub_build_variant,
                                     config_options,
                                     config_dict_of_suites_and_tasks)

        shrub_project.add_build_variant(shrub_build_variant)

    config_dict_of_suites_and_tasks[
        "selected_tests_config.json"] = shrub_project.json()
    return config_dict_of_suites_and_tasks
def run(evg_api: EvergreenApi, evg_conf: EvergreenProjectConfig,
        selected_tests_service: SelectedTestsService,
        selected_tests_variant_expansions: Dict[str, str], repos: List[Repo],
        origin_build_variants: List[str]) -> Dict[str, str]:
    # pylint: disable=too-many-locals
    """
    Run code to select tasks to run based on test and task mappings for each of the build variants.

    :param evg_api: Evergreen API object.
    :param evg_conf: Evergreen configuration.
    :param selected_tests_service: Selected-tests service.
    :param selected_tests_variant_expansions: Expansions of the selected-tests variant.
    :param repos: List of repos containing changed files.
    :param origin_build_variants: Build variants to collect task info from.
    :return: Dict of files and file contents for generated tasks.
    """
    config_dict_of_suites_and_tasks = {}

    changed_files = find_changed_files_in_repos(repos)
    changed_files = {_remove_repo_path_prefix(file_path) for file_path in changed_files}
    LOGGER.debug("Found changed files", files=changed_files)

    shrub_project = ShrubProject()
    for build_variant in origin_build_variants:
        shrub_build_variant = BuildVariant(build_variant)
        build_variant_config = evg_conf.get_variant(build_variant)
        origin_variant_expansions = build_variant_config.expansions

        task_configs = _get_task_configs(evg_conf, selected_tests_service,
                                         selected_tests_variant_expansions, build_variant_config,
                                         changed_files)

        for task_config in task_configs.values():
            config_options = SelectedTestsConfigOptions.from_file(
                origin_variant_expansions,
                selected_tests_variant_expansions,
                task_config,
                REQUIRED_CONFIG_KEYS,
                DEFAULT_CONFIG_VALUES,
                CONFIG_FORMAT_FN,
            )
            _update_config_with_task(evg_api, shrub_build_variant, config_options,
                                     config_dict_of_suites_and_tasks)

        shrub_project.add_build_variant(shrub_build_variant)

    config_dict_of_suites_and_tasks["selected_tests_config.json"] = shrub_project.json()
    return config_dict_of_suites_and_tasks
Example #3
0
    def test_generate_evg_tasks_no_tests_changed(self, create_tests_by_task_mock):
        evg_conf_mock = get_evergreen_config()
        create_tests_by_task_mock.return_value = {}
        expansions_file_data = get_expansions_data()
        buildvariant_map = {
            "enterprise-rhel-62-64-bit-inmem": "enterprise-rhel-62-64-bit-inmem-required",
            "enterprise-rhel-62-64-bit-majority-read-concern-off":
                "enterprise-rhel-62-64-bit-majority-read-concern-off-required",
        }  # yapf: disable
        shrub_config = ShrubProject()
        evergreen_api = MagicMock()
        repo = MagicMock()
        under_test._generate_evg_tasks(evergreen_api, shrub_config, expansions_file_data,
                                       buildvariant_map, [repo], evg_conf_mock)

        self.assertEqual(shrub_config.as_dict(), EMPTY_PROJECT)
    def test_evg_config_has_timeouts_for_repeated_suites(self):
        options = self.generate_mock_options()
        options.repeat_suites = 5
        suites = self.generate_mock_suites(3)
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(
            suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()
        self.assertEqual(len(config["tasks"]), len(suites) + 1)
        command1 = config["tasks"][0]["commands"][2]
        self.assertIn(" --repeatSuites=5 ", command1["vars"]["resmoke_args"])
        self.assertIn(options.resmoke_args, command1["vars"]["resmoke_args"])
        timeout_cmd = config["tasks"][0]["commands"][0]
        self.assertEqual("timeout.update", timeout_cmd["command"])
        expected_timeout = under_test.calculate_timeout(
            suites[0].max_runtime, 3) * 5
        self.assertEqual(expected_timeout,
                         timeout_cmd["params"]["timeout_secs"])
        expected_exec_timeout = under_test.calculate_timeout(
            suites[0].get_runtime(), 3) * 5
        self.assertEqual(expected_exec_timeout,
                         timeout_cmd["params"]["exec_timeout_secs"])
Example #5
0
    def run(self):
        """Generate resmoke suites that run within a target execution time and write to disk."""
        LOGGER.debug("config options", config_options=self.config_options)
        if not should_tasks_be_generated(self.evergreen_api,
                                         self.config_options.task_id):
            LOGGER.info(
                "Not generating configuration due to previous successful generation."
            )
            return

        suites = self.get_suites()
        LOGGER.debug("Creating suites",
                     num_suites=len(suites),
                     task=self.config_options.task,
                     dir=self.config_options.generated_config_dir)

        config_dict_of_suites = self.generate_suites_config(suites)

        shrub_config = ShrubProject.empty()
        shrub_config.add_build_variant(self.generate_task_config(suites))

        config_dict_of_suites[self.config_options.task +
                              ".json"] = shrub_config.json()
        write_file_dict(self.config_options.generated_config_dir,
                        config_dict_of_suites)
    def gen_lint_config():
        targets = ["src", "test"]
        max_hosts = 5
        task_group_name = "lint group"
        variant_name = "lint variant"

        def define_task(target):
            name = f"make-lint-{target}"
            return Task(name, [FunctionCall("run-make", {"target": name})])

        task_group = TaskGroup(
            task_group_name,
            [define_task(target) for target in targets],
            max_hosts=max_hosts,
            setup_group=[
                git_get_project("src").set_type(CommandType.SYSTEM),
                FunctionCall("set-up-credentials"),
            ],
            teardown_group=[
                FunctionCall("attach-test-results"),
                FunctionCall("remove-test-results"),
            ],
        )

        variant = BuildVariant(variant_name).add_task_group(task_group)
        project = ShrubProject({variant})
        return project
Example #7
0
    def test_evg_config_is_created_without_multiversion(self):
        build_variant = BuildVariant("build variant")
        options = self._create_options_mock()

        under_test.create_fuzzer_task(options, build_variant)
        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()

        self.assertEqual(options.num_tasks, len(config["tasks"]))

        self.assertEqual("setup jstestfuzz",
                         config["tasks"][0]["commands"][1]["func"])

        command1 = config["tasks"][0]["commands"][2]
        self.assertIn(str(options.num_files),
                      command1["vars"]["jstestfuzz_vars"])
        self.assertIn(options.npm_command, command1["vars"]["npm_command"])
        self.assertEqual("run jstestfuzz", command1["func"])

        buildvariant = config["buildvariants"][0]
        self.assertEqual(options.variant, buildvariant["name"])
        self.assertEqual(options.num_tasks, len(buildvariant["tasks"]))
        self.assertEqual(
            1, len(buildvariant["display_tasks"][0]["execution_tasks"]))
        self.assertEqual(under_test.GEN_PARENT_TASK,
                         buildvariant["display_tasks"][0]["name"])
        self.assertIn(options.name + "_gen",
                      buildvariant["display_tasks"][0]["execution_tasks"])
        self.assertEqual(
            options.num_tasks,
            len(buildvariant["display_tasks"][1]["execution_tasks"]))
        self.assertEqual(options.name,
                         buildvariant["display_tasks"][1]["name"])
Example #8
0
    def test_generate_evg_tasks_one_test_changed(self, create_tests_by_task_mock):
        evg_conf_mock = get_evergreen_config()
        create_tests_by_task_mock.return_value = {
            "aggregation_mongos_passthrough": {
                "display_task_name": "aggregation_mongos_passthrough",
                "resmoke_args":
                    "--suites=aggregation_mongos_passthrough --storageEngine=wiredTiger",
                "tests": ["jstests/aggregation/bugs/ifnull.js"],
                "use_multiversion": None
            }
        }  # yapf: disable
        expansions_file_data = get_expansions_data()
        buildvariant_map = {
            "enterprise-rhel-62-64-bit-inmem": "enterprise-rhel-62-64-bit-inmem-required",
            "enterprise-rhel-62-64-bit-majority-read-concern-off":
                "enterprise-rhel-62-64-bit-majority-read-concern-off-required",
        }  # yapf: disable
        shrub_config = ShrubProject.empty()
        evergreen_api = MagicMock()
        repo = MagicMock()
        evergreen_api.test_stats_by_project.return_value = [
            MagicMock(test_file="dir/test2.js", avg_duration_pass=10)
        ]
        under_test._generate_evg_tasks(evergreen_api, shrub_config, expansions_file_data,
                                       buildvariant_map, [repo], evg_conf_mock)

        generated_config = shrub_config.as_dict()
        self.assertEqual(len(generated_config["buildvariants"]), 2)
        first_generated_build_variant = generated_config["buildvariants"][0]
        self.assertIn(first_generated_build_variant["name"], buildvariant_map.values())
        self.assertEqual(first_generated_build_variant["display_tasks"][0]["name"], "burn_in_tests")
        self.assertEqual(
            first_generated_build_variant["display_tasks"][0]["execution_tasks"][0],
            f"burn_in:aggregation_mongos_passthrough_0_{first_generated_build_variant['name']}")
def main(expansions_file: str = "expansions.yml",
         output_file: str = "powercycle_tasks.json") -> None:
    """Generate multiple powercycle tasks to run in evergreen."""

    config = make_config(expansions_file)
    build_variant = BuildVariant(config.build_variant)
    for task_name in config.task_names:
        if "skip_compile" in task_name:
            commands, task_dependency = get_skip_compile_setup_commands()
        else:
            commands, task_dependency = get_setup_commands()

        commands.extend([
            FunctionCall("set up remote credentials", config.remote_credentials_vars),
            BuiltInCommand("timeout.update", config.timeout_params),
            FunctionCall("set up EC2 instance", config.set_up_ec2_instance_vars),
            FunctionCall("run powercycle test", config.run_powercycle_vars),
        ])

        build_variant.display_task(
            task_name, {
                Task(
                    name_generated_task(task_name, index, config.num_tasks, config.build_variant),
                    commands, task_dependency)
                for index in range(config.num_tasks)
            }, distros=[config.distro])

    shrub_project = ShrubProject.empty()
    shrub_project.add_build_variant(build_variant)

    write_file(output_file, shrub_project.json())
Example #10
0
def create_generate_tasks_file(tests_by_task: Dict,
                               generate_config: GenerateConfig,
                               repeat_config: RepeatConfig,
                               evg_api: Optional[EvergreenApi],
                               task_prefix: str = 'burn_in',
                               include_gen_task: bool = True) -> str:
    """
    Create an Evergreen generate.tasks file to run the given tasks and tests.

    :param tests_by_task: Dictionary of tests and tasks to run.
    :param generate_config: Information about how burn_in should generate tasks.
    :param repeat_config: Information about how burn_in should repeat tests.
    :param evg_api: Evergreen api.
    :param task_prefix: Prefix to start generated task's name with.
    :param include_gen_task: Should the generating task be included in the display task.
    :returns: Configuration to pass to 'generate.tasks'.
    """
    build_variant = BuildVariant(generate_config.run_build_variant)
    create_generate_tasks_config(build_variant,
                                 tests_by_task,
                                 generate_config,
                                 repeat_config,
                                 evg_api,
                                 include_gen_task=include_gen_task,
                                 task_prefix=task_prefix)

    shrub_project = ShrubProject.empty()
    shrub_project.add_build_variant(build_variant)

    if not validate_task_generation_limit(shrub_project):
        sys.exit(1)

    return shrub_project.json()
Example #11
0
def _generate_evg_tasks(evergreen_api: EvergreenApi,
                        shrub_project: ShrubProject,
                        task_expansions: Dict[str, Any],
                        build_variant_map: Dict[str, str], repos: List[Repo],
                        evg_conf: EvergreenProjectConfig,
                        install_dir: str) -> None:
    """
    Generate burn in tests tasks for a given shrub config and group of build variants.

    :param evergreen_api: Evergreen.py object.
    :param shrub_project: Shrub config object that the build variants will be built upon.
    :param task_expansions: Dictionary of expansions for the running task.
    :param build_variant_map: Map of base buildvariants to their generated buildvariant.
    :param repos: Git repositories.
    """
    for build_variant, run_build_variant in build_variant_map.items():
        config_options = _get_config_options(task_expansions, build_variant,
                                             run_build_variant)
        task_id = task_expansions[TASK_ID_EXPANSION]
        change_detector = EvergreenFileChangeDetector(task_id, evergreen_api,
                                                      os.environ)
        changed_tests = change_detector.find_changed_tests(repos)
        tests_by_task = create_tests_by_task(build_variant, evg_conf,
                                             changed_tests, install_dir)
        if tests_by_task:
            shrub_build_variant = _generate_evg_build_variant(
                evg_conf.get_variant(build_variant), run_build_variant,
                task_expansions["build_variant"])
            gen_config = GenerateConfig(
                build_variant,
                config_options.project,
                run_build_variant,
                config_options.distro,
                include_gen_task=False).validate(evg_conf)
            repeat_config = RepeatConfig(
                repeat_tests_min=config_options.repeat_tests_min,
                repeat_tests_max=config_options.repeat_tests_max,
                repeat_tests_secs=config_options.repeat_tests_secs)

            burn_in_generator = GenerateBurnInExecutor(gen_config,
                                                       repeat_config,
                                                       evergreen_api)
            burn_in_generator.generate_tasks_for_variant(
                tests_by_task, shrub_build_variant)
            shrub_project.add_build_variant(shrub_build_variant)
Example #12
0
def burn_in(task_expansions: Dict[str, Any], evg_conf: EvergreenProjectConfig,
            evergreen_api: RetryingEvergreenApi, repos: Iterable[Repo]):
    """Execute Main program."""
    shrub_project = ShrubProject.empty()
    build_variant_map = _create_evg_build_variant_map(task_expansions,
                                                      evg_conf)
    _generate_evg_tasks(evergreen_api, shrub_project, task_expansions,
                        build_variant_map, repos, evg_conf)

    write_file_to_dir(CONFIG_DIRECTORY, CONFIG_FILE, shrub_project.json())
    def test_evg_config_is_created_with_multiversion(self):
        build_variant = BuildVariant("build variant")
        options = self._create_options_mock()
        options.use_multiversion = "/data/multiversion"

        under_test.create_fuzzer_task(options, build_variant)
        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()

        self.assertEqual("do multiversion setup", config["tasks"][0]["commands"][2]["func"])
        self.assertEqual("/data/multiversion",
                         config["tasks"][0]["commands"][5]["vars"]["task_path_suffix"])
Example #14
0
    def run(self) -> None:
        """Generate multiversion suites that run within a specified target execution time."""
        if not generate_resmoke.should_tasks_be_generated(self.evg_api, self.options.task_id):
            LOGGER.info("Not generating configuration due to previous successful generation.")
            return

        build_variant = BuildVariant(self.options.variant)
        self.generate_evg_tasks(build_variant)

        shrub_project = ShrubProject.empty()
        shrub_project.add_build_variant(build_variant)
        write_file_to_dir(CONFIG_DIR, f"{self.task}.json", shrub_project.json())
Example #15
0
def _generate_evg_tasks(evergreen_api: EvergreenApi,
                        shrub_project: ShrubProject,
                        task_expansions: Dict[str, Any],
                        build_variant_map: Dict[str,
                                                str], repos: Iterable[Repo],
                        evg_conf: EvergreenProjectConfig) -> None:
    """
    Generate burn in tests tasks for a given shrub config and group of build variants.

    :param evergreen_api: Evergreen.py object.
    :param shrub_project: Shrub config object that the build variants will be built upon.
    :param task_expansions: Dictionary of expansions for the running task.
    :param build_variant_map: Map of base buildvariants to their generated buildvariant.
    :param repos: Git repositories.
    """
    for build_variant, run_build_variant in build_variant_map.items():
        config_options = _get_config_options(task_expansions, build_variant,
                                             run_build_variant)
        changed_tests = find_changed_tests(repos)
        tests_by_task = create_tests_by_task(build_variant, evg_conf,
                                             changed_tests)
        if tests_by_task:
            shrub_build_variant = _generate_evg_build_variant(
                evg_conf.get_variant(build_variant), run_build_variant,
                task_expansions["build_variant"])
            gen_config = GenerateConfig(
                build_variant, config_options.project, run_build_variant,
                config_options.distro).validate(evg_conf)
            repeat_config = RepeatConfig(
                repeat_tests_min=config_options.repeat_tests_min,
                repeat_tests_max=config_options.repeat_tests_max,
                repeat_tests_secs=config_options.repeat_tests_secs)

            create_generate_tasks_config(shrub_build_variant,
                                         tests_by_task,
                                         gen_config,
                                         repeat_config,
                                         evergreen_api,
                                         include_gen_task=False)
            shrub_project.add_build_variant(shrub_build_variant)
Example #16
0
    def test_with_large_distro(self):
        build_variant = BuildVariant("build variant")
        options = self._create_options_mock()
        options.large_distro_name = "large build variant"
        options.use_large_distro = True

        under_test.create_fuzzer_task(options, build_variant)
        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()

        for variant in config["buildvariants"]:
            for task in variant["tasks"]:
                self.assertEqual(task["distros"], [options.large_distro_name])
    def test_evg_config_does_not_overwrite_repeat_resmoke_arg_with_repeatSuites_default(self):
        options = self.generate_mock_options()
        options.resmoke_args = "resmoke_args --repeat=5"
        suites = self.generate_mock_suites(1)
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()
        command1 = config["tasks"][0]["commands"][2]
        self.assertIn("--repeat=5", command1["vars"]["resmoke_args"])
        self.assertNotIn("--repeatSuites=1", command1["vars"]["resmoke_args"])
Example #18
0
def validate_task_generation_limit(shrub_project: ShrubProject) -> bool:
    """
    Determine if this shrub configuration generates less than the limit.

    :param shrub_project: Shrub configuration to validate.
    :return: True if the configuration is under the limit.
    """
    tasks_to_create = len(shrub_project.all_tasks())
    if tasks_to_create > MAX_SHRUB_TASKS_FOR_SINGLE_TASK:
        LOGGER.warning("Attempting to create more tasks than max, aborting",
                       tasks=tasks_to_create,
                       max=MAX_SHRUB_TASKS_FOR_SINGLE_TASK)
        return False
    return True
    def test_timeout_info_not_included_if_use_default_timeouts_set(self):
        suite_without_timing_info = 1
        options = self.generate_mock_options()
        suites = self.generate_mock_suites(3)
        options.use_default_timeouts = True
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()
        timeout_cmd = config["tasks"][suite_without_timing_info]["commands"][0]
        self.assertNotIn("command", timeout_cmd)
        self.assertEqual("do setup", timeout_cmd["func"])
Example #20
0
    def test_suites_without_enough_info_should_not_include_timeouts(self):
        suite_without_timing_info = 1
        options = self.generate_mock_options()
        suites = self.generate_mock_suites(3)
        suites[suite_without_timing_info].should_overwrite_timeout.return_value = False
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()
        timeout_cmd = config["tasks"][suite_without_timing_info]["commands"][0]
        self.assertNotIn("command", timeout_cmd)
        self.assertEqual("do setup", timeout_cmd["func"])
    def test_evg_config_can_use_large_distro(self):
        options = self.generate_mock_options()
        options.use_large_distro = "true"
        options.large_distro_name = "large distro name"
        suites = self.generate_mock_suites(3)
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()

        self.assertEqual(len(config["tasks"]), len(suites) + 1)
        self.assertEqual(options.large_distro_name,
                         config["buildvariants"][0]["tasks"][0]["distros"][0])
    def test_evg_config_is_created(self):
        options = self.generate_mock_options()
        suites = self.generate_mock_suites(3)
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()
        self.assertEqual(len(config["tasks"]), len(suites) + 1)
        command1 = config["tasks"][0]["commands"][2]
        self.assertIn(options.resmoke_args, command1["vars"]["resmoke_args"])
        self.assertIn(" --originSuite=suite", command1["vars"]["resmoke_args"])
        self.assertIn(options.run_multiple_jobs, command1["vars"]["run_multiple_jobs"])
        self.assertEqual("run generated tests", command1["func"])
    def create_generate_tasks_configuration(self, tests_by_task: Dict[str, TaskInfo]) -> str:
        """
        Create the configuration with the configuration to generate the burn_in tasks.

        :param tests_by_task: Dictionary of tasks and test to generate.
        :return: Configuration to use to create generated tasks.
        """
        build_variant = BuildVariant(self.generate_config.run_build_variant)
        self.add_config_for_build_variant(build_variant, tests_by_task)

        shrub_project = ShrubProject.empty()
        shrub_project.add_build_variant(build_variant)

        if not validate_task_generation_limit(shrub_project):
            sys.exit(1)

        return shrub_project.json()
Example #24
0
def burn_in(task_expansions: Dict[str, Any], evg_conf: EvergreenProjectConfig,
            evergreen_api: RetryingEvergreenApi, repos: List[Repo]):
    """
    Execute main program.

    :param task_expansions: Dictionary of expansions for the running task.
    :param evg_conf: Evergreen configuration.
    :param evergreen_api: Evergreen.py object.
    :param repos: Git repositories.
    """
    shrub_project = ShrubProject.empty()
    build_variant_map = _create_evg_build_variant_map(task_expansions,
                                                      evg_conf)
    _generate_evg_tasks(evergreen_api, shrub_project, task_expansions,
                        build_variant_map, repos, evg_conf)

    write_file_to_dir(CONFIG_DIRECTORY, CONFIG_FILE, shrub_project.json())
Example #25
0
    def execute(self, tests_by_task: Dict[str, TaskInfo]) -> None:
        """
        Execute the given tests in the given tasks.

        :param tests_by_task: Dictionary of tasks to run with tests to run in each.
        """

        build_variant = BuildVariant(self.generate_config.run_build_variant)
        self.generate_tasks_for_variant(tests_by_task, build_variant)

        shrub_project = ShrubProject.empty()
        shrub_project.add_build_variant(build_variant)
        if not validate_task_generation_limit(shrub_project):
            sys.exit(1)

        assert self.generate_tasks_file is not None
        if self.generate_tasks_file:
            write_file(self.generate_tasks_file, shrub_project.json())
Example #26
0
    def test_no_suites_or_tasks_are_generated(self, generate_subsuites_mock,
                                              selected_tests_config_options_mock):
        generate_subsuites_mock.return_value.generate_suites_config.return_value = {}

        def generate_task_config(shrub_config, suites):
            pass

        generate_subsuites_mock.return_value.generate_task_config.side_effect = generate_task_config

        build_variant = BuildVariant("variant")
        config_dict_of_suites_and_tasks = {}
        under_test._update_config_with_task(
            MagicMock(), build_variant, config_options=MagicMock(),
            config_dict_of_suites_and_tasks=config_dict_of_suites_and_tasks)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        self.assertEqual(config_dict_of_suites_and_tasks, {})
        self.assertEqual(shrub_project.as_dict(), empty_build_variant("variant"))
    def test_build_variant_without_large_distro_defined_can_be_ignored(self):
        options = self.generate_mock_options()
        options.use_large_distro = "true"
        options.large_distro_name = None
        suites = self.generate_mock_suites(3)
        build_variant = BuildVariant("variant")
        generate_config = under_test.GenerationConfiguration(
            build_variant_large_distro_exceptions={"variant"})

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock(),
                                                        generate_config)
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()

        self.assertEqual(len(config["tasks"]), len(suites) + 1)
        self.assertIsNone(config["buildvariants"][0]["tasks"][0].get("distros"))
Example #28
0
def burn_in(task_expansions: Dict[str, Any], evg_conf: EvergreenProjectConfig,
            evergreen_api: RetryingEvergreenApi, repos: List[Repo],
            install_dir: str):
    """
    Execute main program.

    :param task_expansions: Dictionary of expansions for the running task.
    :param evg_conf: Evergreen configuration.
    :param evergreen_api: Evergreen.py object.
    :param repos: Git repositories.
    :param install_dir: path to bin directory of a testable installation
    """
    shrub_project = ShrubProject.empty()
    build_variant_map = _create_evg_build_variant_map(task_expansions)
    _generate_evg_tasks(evergreen_api, shrub_project, task_expansions,
                        build_variant_map, repos, evg_conf, install_dir)

    if not validate_task_generation_limit(shrub_project):
        sys.exit(1)
    write_file_to_dir(CONFIG_DIRECTORY, CONFIG_FILE, shrub_project.json())
    def test_multiversion_path_is_used(self):
        n_tasks = 1
        n_tests = 1
        build_variant = BuildVariant("variant")
        gen_config = MagicMock(run_build_variant="variant", distro=None)
        repeat_config = MagicMock()
        tests_by_task = create_tests_by_task_mock(n_tasks, n_tests)
        first_task = "task_0_gen"
        multiversion_path = "multiversion_path"
        tests_by_task[first_task]["use_multiversion"] = multiversion_path

        create_generate_tasks_config(build_variant, tests_by_task, gen_config,
                                     repeat_config, None)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        evg_config_dict = shrub_project.as_dict()
        tasks = evg_config_dict["tasks"]
        self.assertEqual(n_tasks * n_tests, len(tasks))
        self.assertEqual(multiversion_path,
                         tasks[0]["commands"][2]["vars"]["task_path_suffix"])
    def test_evg_config_is_created_with_diff_task_and_suite(self):
        options = self.generate_mock_options()
        options.task = "task"
        options.display_task_name = "display task"
        options.generate_display_task.return_value = DisplayTaskDefinition("task")
        suites = self.generate_mock_suites(3)
        build_variant = BuildVariant("variant")

        generator = under_test.EvergreenConfigGenerator(suites, options, MagicMock())
        generator.generate_config(build_variant)

        shrub_project = ShrubProject.empty().add_build_variant(build_variant)
        config = shrub_project.as_dict()
        self.assertEqual(len(config["tasks"]), len(suites) + 1)
        display_task = config["buildvariants"][0]["display_tasks"][0]
        self.assertEqual(options.display_task_name, display_task["name"])

        task = config["tasks"][0]
        self.assertIn(options.variant, task["name"])
        self.assertIn(options.suite, task["commands"][2]["vars"]["resmoke_args"])