summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildscripts/ciconfig/evergreen.py9
-rw-r--r--buildscripts/selected_tests.py28
-rw-r--r--buildscripts/tests/ciconfig/evergreen.yml4
-rw-r--r--buildscripts/tests/ciconfig/test_evergreen.py14
-rw-r--r--buildscripts/tests/test_selected_tests.py53
-rw-r--r--etc/evergreen.yml2
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