summaryrefslogtreecommitdiff
path: root/buildscripts
diff options
context:
space:
mode:
authorDavid Bradford <david.bradford@mongodb.com>2019-12-16 20:29:36 +0000
committerevergreen <evergreen@mongodb.com>2019-12-16 20:29:36 +0000
commitcdfda6e9e9c4b14c4bdb55657a4c5cb91991acdf (patch)
treee97e7b0630b8d681934db6d9ccce471c1f4be3a2 /buildscripts
parent7168b7100a106bec98d643bef9e15b705c439edb (diff)
downloadmongo-cdfda6e9e9c4b14c4bdb55657a4c5cb91991acdf.tar.gz
SERVER-40749: Do not create generate.tasks configuration on task restart
(cherry picked from commit be545c5b9b838456b456896959e891ceeab93758)
Diffstat (limited to 'buildscripts')
-rwxr-xr-xbuildscripts/evergreen_generate_resmoke_tasks.py26
-rw-r--r--buildscripts/tests/test_evergreen_generate_resmoke_tasks.py50
2 files changed, 76 insertions, 0 deletions
diff --git a/buildscripts/evergreen_generate_resmoke_tasks.py b/buildscripts/evergreen_generate_resmoke_tasks.py
index 3c2f61da7bd..4e9b184b813 100755
--- a/buildscripts/evergreen_generate_resmoke_tasks.py
+++ b/buildscripts/evergreen_generate_resmoke_tasks.py
@@ -365,6 +365,28 @@ def calculate_timeout(avg_runtime, scaling_factor):
return max(MIN_TIMEOUT_SECONDS, round_to_minute(avg_runtime)) * scaling_factor
+def should_tasks_be_generated(evg_api, task_id):
+ """
+ Determine if we should attempt to generate tasks.
+
+ If an evergreen task that calls 'generate.tasks' is restarted, the 'generate.tasks' command
+ will no-op. So, if we are in that state, we should avoid generating new configuration files
+ that will just be confusing to the user (since that would not be used).
+
+ :param evg_api: Evergreen API object.
+ :param task_id: Id of the task being run.
+ :return: Boolean of whether to generate tasks.
+ """
+ task = evg_api.task_by_id(task_id, fetch_all_executions=True)
+ # If any previous execution was successful, do not generate more tasks.
+ for i in range(task.execution):
+ task_execution = task.get_execution(i)
+ if task_execution.is_success():
+ return False
+
+ return True
+
+
class EvergreenConfigGenerator(object):
"""Generate evergreen configurations."""
@@ -702,6 +724,10 @@ class GenerateSubSuites(object):
"""Generate resmoke suites that run within a specified target execution time."""
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
+
end_date = datetime.datetime.utcnow().replace(microsecond=0)
start_date = end_date - datetime.timedelta(days=LOOKBACK_DURATION_DAYS)
diff --git a/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py b/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py
index e108bfbf727..4432002c6cf 100644
--- a/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py
+++ b/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py
@@ -825,3 +825,53 @@ class GenerateSubSuitesTest(unittest.TestCase):
self.assertIn(tests_runtimes[2], filtered_list)
self.assertIn(tests_runtimes[0], filtered_list)
self.assertEqual(2, len(filtered_list))
+
+
+class TestShouldTasksBeGenerated(unittest.TestCase):
+ def test_during_first_execution(self):
+ evg_api = MagicMock()
+ task_id = "task_id"
+ evg_api.task_by_id.return_value.execution = 0
+
+ self.assertTrue(under_test.should_tasks_be_generated(evg_api, task_id))
+ evg_api.task_by_id.assert_called_with(task_id, fetch_all_executions=True)
+
+ def test_after_successful_execution(self):
+ evg_api = MagicMock()
+ task_id = "task_id"
+ task = evg_api.task_by_id.return_value
+ task.execution = 1
+ task.get_execution.return_value.is_success.return_value = True
+
+ self.assertFalse(under_test.should_tasks_be_generated(evg_api, task_id))
+ evg_api.task_by_id.assert_called_with(task_id, fetch_all_executions=True)
+
+ def test_after_multiple_successful_execution(self):
+ evg_api = MagicMock()
+ task_id = "task_id"
+ task = evg_api.task_by_id.return_value
+ task.execution = 5
+ task.get_execution.return_value.is_success.return_value = True
+
+ self.assertFalse(under_test.should_tasks_be_generated(evg_api, task_id))
+ evg_api.task_by_id.assert_called_with(task_id, fetch_all_executions=True)
+
+ def test_after_failed_execution(self):
+ evg_api = MagicMock()
+ task_id = "task_id"
+ task = evg_api.task_by_id.return_value
+ task.execution = 1
+ task.get_execution.return_value.is_success.return_value = False
+
+ self.assertTrue(under_test.should_tasks_be_generated(evg_api, task_id))
+ evg_api.task_by_id.assert_called_with(task_id, fetch_all_executions=True)
+
+ def test_after_multiple_failed_execution(self):
+ evg_api = MagicMock()
+ task_id = "task_id"
+ task = evg_api.task_by_id.return_value
+ task.execution = 5
+ task.get_execution.return_value.is_success.return_value = False
+
+ self.assertTrue(under_test.should_tasks_be_generated(evg_api, task_id))
+ evg_api.task_by_id.assert_called_with(task_id, fetch_all_executions=True)