diff options
| author | David Bradford <david.bradford@mongodb.com> | 2019-12-16 20:29:36 +0000 |
|---|---|---|
| committer | evergreen <evergreen@mongodb.com> | 2019-12-16 20:29:36 +0000 |
| commit | cdfda6e9e9c4b14c4bdb55657a4c5cb91991acdf (patch) | |
| tree | e97e7b0630b8d681934db6d9ccce471c1f4be3a2 /buildscripts | |
| parent | 7168b7100a106bec98d643bef9e15b705c439edb (diff) | |
| download | mongo-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-x | buildscripts/evergreen_generate_resmoke_tasks.py | 26 | ||||
| -rw-r--r-- | buildscripts/tests/test_evergreen_generate_resmoke_tasks.py | 50 |
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) |
