diff options
-rw-r--r-- | buildscripts/ciconfig/evergreen.py | 9 | ||||
-rw-r--r-- | buildscripts/selected_tests.py | 28 | ||||
-rw-r--r-- | buildscripts/tests/ciconfig/evergreen.yml | 4 | ||||
-rw-r--r-- | buildscripts/tests/ciconfig/test_evergreen.py | 14 | ||||
-rw-r--r-- | buildscripts/tests/test_selected_tests.py | 53 | ||||
-rw-r--r-- | etc/evergreen.yml | 2 |
6 files changed, 63 insertions, 47 deletions
diff --git a/buildscripts/ciconfig/evergreen.py b/buildscripts/ciconfig/evergreen.py index 4731525290d..4dc50248fc0 100644 --- a/buildscripts/ciconfig/evergreen.py +++ b/buildscripts/ciconfig/evergreen.py @@ -8,6 +8,7 @@ from __future__ import annotations import datetime import distutils.spawn # pylint: disable=no-name-in-module import re +from typing import Set import yaml @@ -84,6 +85,10 @@ class EvergreenProjectConfig(object): # pylint: disable=too-many-instance-attri """Return the variant with the given name as a Variant instance.""" return self._variants_by_name.get(variant_name) + def get_required_variants(self) -> Set[Variant]: + """Get the list of required build variants.""" + return {variant for variant in self.variants if variant.is_required_variant()} + def get_task_names_by_tag(self, tag): """Return the list of tasks that have the given tag.""" return list(task.name for task in self.tasks if tag in task.tags) @@ -304,6 +309,10 @@ class Variant(object): """Get list of task names.""" return [t.name for t in self.tasks] + def is_required_variant(self) -> bool: + """Return True if the variant is a required variant.""" + return self.display_name.startswith("! ") + def get_task(self, task_name): """Return the task with the given name as an instance of VariantTask. diff --git a/buildscripts/selected_tests.py b/buildscripts/selected_tests.py index a9aa7f0f88a..8c09818dbbe 100644 --- a/buildscripts/selected_tests.py +++ b/buildscripts/selected_tests.py @@ -240,6 +240,7 @@ def _get_evg_task_config( :param build_variant_config: Config of build variant to collect task info from. :return: Task configuration values. """ + LOGGER.info("Calculating evg_task_config values for task", task=task.name) if task.is_generate_resmoke_task: task_vars = task.generate_resmoke_tasks_command["vars"] else: @@ -302,7 +303,6 @@ def _get_task_configs_for_test_mappings(selected_tests_variant_expansions: Dict[ evg_task_config = _get_evg_task_config(selected_tests_variant_expansions, task, build_variant_config) evg_task_config.update({"selected_tests_to_run": set(test_list_info["tests"])}) - LOGGER.debug("Calculated evg_task_config values", evg_task_config=evg_task_config) evg_task_configs[task.name] = evg_task_config return evg_task_configs @@ -325,7 +325,6 @@ def _get_task_configs_for_task_mappings(selected_tests_variant_expansions: Dict[ if task and not _exclude_task(task): evg_task_config = _get_evg_task_config(selected_tests_variant_expansions, task, build_variant_config) - LOGGER.debug("Calculated evg_task_config values", evg_task_config=evg_task_config) evg_task_configs[task.name] = evg_task_config return evg_task_configs @@ -363,21 +362,21 @@ def _get_task_configs(evg_conf: EvergreenProjectConfig, task_configs = {} related_test_files = _find_selected_test_files(selected_tests_service, changed_files) - LOGGER.debug("related test files found", related_test_files=related_test_files, - variant=build_variant_config.name) + LOGGER.info("related test files found", related_test_files=related_test_files, + variant=build_variant_config.name) if related_test_files: tests_by_task = create_task_list_for_tests(related_test_files, build_variant_config.name, evg_conf) - LOGGER.debug("tests and tasks found", tests_by_task=tests_by_task) + LOGGER.info("tests and tasks found", tests_by_task=tests_by_task) test_mapping_task_configs = _get_task_configs_for_test_mappings( selected_tests_variant_expansions, tests_by_task, build_variant_config) task_configs.update(test_mapping_task_configs) related_tasks = _find_selected_tasks(selected_tests_service, changed_files) - LOGGER.debug("related tasks found", related_tasks=related_tasks, - variant=build_variant_config.name) + LOGGER.info("related tasks found", related_tasks=related_tasks, + variant=build_variant_config.name) if related_tasks: task_mapping_task_configs = _get_task_configs_for_task_mappings( selected_tests_variant_expansions, related_tasks, build_variant_config) @@ -389,11 +388,9 @@ def _get_task_configs(evg_conf: EvergreenProjectConfig, return task_configs -# pylint: disable=too-many-arguments 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]: + 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. @@ -403,19 +400,17 @@ def run(evg_api: EvergreenApi, evg_conf: EvergreenProjectConfig, :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) + LOGGER.info("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) + 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, @@ -487,10 +482,9 @@ def main( buildscripts.resmokelib.parser.set_run_options() task_expansions = read_config.read_config_file(expansion_file) - origin_build_variants = task_expansions["selected_tests_buildvariants"].split(" ") config_dict_of_suites_and_tasks = run(evg_api, evg_conf, selected_tests_service, - task_expansions, repos, origin_build_variants) + task_expansions, repos) write_file_dict(SELECTED_TESTS_CONFIG_DIR, config_dict_of_suites_and_tasks) diff --git a/buildscripts/tests/ciconfig/evergreen.yml b/buildscripts/tests/ciconfig/evergreen.yml index 3deb0f1ea3c..eeca00586b2 100644 --- a/buildscripts/tests/ciconfig/evergreen.yml +++ b/buildscripts/tests/ciconfig/evergreen.yml @@ -177,13 +177,13 @@ buildvariants: distros: - pdp-11 - name: debian - display_name: Debian + display_name: "! Debian" run_on: - debian-stretch tasks: - name: resmoke_task - name: amazon - display_name: Amazon + display_name: "! Amazon" run_on: - amazon tasks: diff --git a/buildscripts/tests/ciconfig/test_evergreen.py b/buildscripts/tests/ciconfig/test_evergreen.py index fa18bf0dadc..2132e5ecf91 100644 --- a/buildscripts/tests/ciconfig/test_evergreen.py +++ b/buildscripts/tests/ciconfig/test_evergreen.py @@ -52,6 +52,11 @@ class TestEvergreenProjectConfig(unittest.TestCase): self.assertIsNotNone(variant) self.assertEqual("osx-108", variant.name) + def test_get_required_variants(self): + variants = self.conf.get_required_variants() + + self.assertEqual(len(variants), 2) + def test_list_distro_names(self): self.assertEqual(5, len(self.conf.distro_names)) self.assertIn("localtestdistro", self.conf.distro_names) @@ -387,6 +392,15 @@ class TestVariant(unittest.TestCase): variant_osx = self.conf.get_variant("osx-108") self.assertIsNone(variant_osx.batchtime) + def test_is_required_variant(self): + variant_debian = self.conf.get_variant("debian") + is_required_variant = variant_debian.is_required_variant() + self.assertEqual(is_required_variant, True) + + variant_ubuntu = self.conf.get_variant("ubuntu") + is_required_variant = variant_ubuntu.is_required_variant() + self.assertEqual(is_required_variant, False) + def test_expansion(self): variant_ubuntu = self.conf.get_variant("ubuntu") self.assertEqual("--param=value --ubuntu", variant_ubuntu.expansion("test_flags")) diff --git a/buildscripts/tests/test_selected_tests.py b/buildscripts/tests/test_selected_tests.py index 05293b9aade..96487218129 100644 --- a/buildscripts/tests/test_selected_tests.py +++ b/buildscripts/tests/test_selected_tests.py @@ -57,15 +57,12 @@ class TestAcceptance(unittest.TestCase): "build_id": "my_build_id", "project": "mongodb-mongo-master" } repos = [mock_changed_git_files([])] - origin_build_variants = ["enterprise-rhel-62-64-bit"] config_dict = under_test.run(evg_api_mock, evg_config, selected_tests_service_mock, - selected_tests_variant_expansions, repos, - origin_build_variants) + selected_tests_variant_expansions, repos) - self.assertEqual( - json.loads(config_dict["selected_tests_config.json"]), - empty_build_variant(origin_build_variants[0])) + # assert that config_dict does not contain keys for any generated task configs + self.assertEqual(config_dict.keys(), {"selected_tests_config.json"}) @unittest.skipIf(sys.platform.startswith("win"), "not supported on windows") def test_when_test_mappings_are_found_for_changed_files(self): @@ -83,23 +80,25 @@ class TestAcceptance(unittest.TestCase): "build_id": "my_build_id", "project": "mongodb-mongo-master" } repos = [mock_changed_git_files(["src/file1.cpp"])] - origin_build_variants = ["enterprise-rhel-62-64-bit"] config_dict = under_test.run(evg_api_mock, evg_config, selected_tests_service_mock, - selected_tests_variant_expansions, repos, - origin_build_variants) + selected_tests_variant_expansions, repos) self.assertIn("selected_tests_config.json", config_dict) + + # assert that tasks are generated on all required build variants + build_variants_with_generated_tasks = json.loads( + config_dict["selected_tests_config.json"])["buildvariants"] + self.assertEqual( + len(build_variants_with_generated_tasks), len(evg_config.get_required_variants())) + # jstests/auth/auth1.js belongs to two suites, auth and auth_audit, each of which has # fallback_num_sub_suites = 4 in their resmoke args, resulting in 4 subtasks being generated - # for each - self.assertEqual(len(config_dict), 9) - self.assertEqual( - sorted(config_dict.keys()), [ - "auth_0.yml", "auth_1.yml", "auth_2.yml", "auth_3.yml", "auth_audit_4.yml", - "auth_audit_5.yml", "auth_audit_6.yml", "auth_audit_7.yml", - "selected_tests_config.json" - ]) + # for each, hence 8 tasks total + rhel_62_with_generated_tasks = next( + (variant for variant in build_variants_with_generated_tasks + if variant["name"] == "enterprise-rhel-62-64-bit-dynamic-required"), None) + self.assertEqual(len(rhel_62_with_generated_tasks["tasks"]), 8) @unittest.skipIf(sys.platform.startswith("win"), "not supported on windows") def test_when_task_mappings_are_found_for_changed_files(self): @@ -117,21 +116,21 @@ class TestAcceptance(unittest.TestCase): "build_id": "my_build_id", "project": "mongodb-mongo-master" } repos = [mock_changed_git_files(["src/file1.cpp"])] - origin_build_variants = ["enterprise-rhel-62-64-bit"] config_dict = under_test.run(evg_api_mock, evg_config, selected_tests_service_mock, - selected_tests_variant_expansions, repos, - origin_build_variants) + selected_tests_variant_expansions, repos) self.assertIn("selected_tests_config.json", config_dict) + # the auth task's generator task, auth_gen, has fallback_num_sub_suites = 4 in - # its resmoke args, resulting in 4 subtasks being generated, plus a _misc task - self.assertEqual(len(config_dict), 6) - self.assertEqual( - sorted(config_dict.keys()), [ - "auth_0.yml", "auth_1.yml", "auth_2.yml", "auth_3.yml", "auth_misc.yml", - "selected_tests_config.json" - ]) + # its resmoke args, resulting in 4 subtasks being generated, plus a _misc task, hence 5 + # tasks total + build_variants_with_generated_tasks = json.loads( + config_dict["selected_tests_config.json"])["buildvariants"] + rhel_62_with_generated_tasks = next( + (variant for variant in build_variants_with_generated_tasks + if variant["name"] == "enterprise-rhel-62-64-bit-dynamic-required"), None) + self.assertEqual(len(rhel_62_with_generated_tasks["tasks"]), 5) class TestSelectedTestsConfigOptions(unittest.TestCase): diff --git a/etc/evergreen.yml b/etc/evergreen.yml index e0d044ceb22..389d5fb8bb8 100644 --- a/etc/evergreen.yml +++ b/etc/evergreen.yml @@ -1557,7 +1557,7 @@ functions: else ${activate_virtualenv} - PATH=$PATH:$HOME $python buildscripts/selected_tests.py --expansion-file expansions.yml --verbose --selected-tests-config .selected_tests.yml + PATH=$PATH:$HOME $python buildscripts/selected_tests.py --expansion-file expansions.yml --selected-tests-config .selected_tests.yml fi - command: archive.targz_pack |