diff options
Diffstat (limited to 'buildscripts/update_test_lifecycle.py')
-rwxr-xr-x | buildscripts/update_test_lifecycle.py | 304 |
1 files changed, 112 insertions, 192 deletions
diff --git a/buildscripts/update_test_lifecycle.py b/buildscripts/update_test_lifecycle.py index 887f0cc78af..922c4a5da63 100755 --- a/buildscripts/update_test_lifecycle.py +++ b/buildscripts/update_test_lifecycle.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - """Test Failures Update etc/test_lifecycle.yml to tag unreliable tests based on historic failure rates. @@ -36,7 +35,6 @@ from buildscripts import test_failures as tf from buildscripts.ciconfig import evergreen as ci_evergreen from buildscripts.ciconfig import tags as ci_tags - LOGGER = logging.getLogger(__name__) if sys.version_info[0] == 2: @@ -44,10 +42,8 @@ if sys.version_info[0] == 2: else: _NUMBER_TYPES = (int, float) - Rates = collections.namedtuple("Rates", ["acceptable", "unacceptable"]) - Config = collections.namedtuple("Config", [ "test_fail_rates", "task_fail_rates", @@ -59,21 +55,16 @@ Config = collections.namedtuple("Config", [ "unreliable_time_period", ]) - DEFAULT_CONFIG = Config( - test_fail_rates=Rates(acceptable=0.1, unacceptable=0.3), - task_fail_rates=Rates(acceptable=0.1, unacceptable=0.3), - variant_fail_rates=Rates(acceptable=0.2, unacceptable=0.4), - distro_fail_rates=Rates(acceptable=0.2, unacceptable=0.4), - reliable_min_runs=5, - reliable_time_period=datetime.timedelta(weeks=1), - unreliable_min_runs=20, - unreliable_time_period=datetime.timedelta(weeks=4)) - + test_fail_rates=Rates(acceptable=0.1, unacceptable=0.3), task_fail_rates=Rates( + acceptable=0.1, unacceptable=0.3), + variant_fail_rates=Rates(acceptable=0.2, unacceptable=0.4), distro_fail_rates=Rates( + acceptable=0.2, + unacceptable=0.4), reliable_min_runs=5, reliable_time_period=datetime.timedelta(weeks=1), + unreliable_min_runs=20, unreliable_time_period=datetime.timedelta(weeks=4)) DEFAULT_PROJECT = "mongodb-mongo-master" - DEFAULT_NUM_THREADS = 12 @@ -133,8 +124,8 @@ def create_batch_groups(test_groups, batch_size): class TestHistorySource(object): - """A class used to parallelize requests to buildscripts.test_failures.TestHistory.""" + def __init__(self, project, variants, distros, start_revision, end_revision, thread_pool_size=DEFAULT_NUM_THREADS): """ @@ -161,18 +152,17 @@ class TestHistorySource(object): The requests for each task will be parallelized using the internal thread pool. """ history_data = [] - jobs = [self._thread_pool.apply_async(self._get_task_history_data, (tests, task)) - for task in tasks] + jobs = [ + self._thread_pool.apply_async(self._get_task_history_data, (tests, task)) + for task in tasks + ] for job in jobs: history_data.extend(job.get()) return history_data def _get_task_history_data(self, tests, task): - test_history = tf.TestHistory(project=self._project, - tests=tests, - tasks=[task], - variants=self._variants, - distros=self._distros) + test_history = tf.TestHistory(project=self._project, tests=tests, tasks=[task], + variants=self._variants, distros=self._distros) return test_history.get_history_by_revision(start_revision=self._start_revision, end_revision=self._end_revision) @@ -235,9 +225,8 @@ def check_days(name, days): def unreliable_tag(task, variant, distro): """Returns the unreliable tag.""" - for (component_name, component_value) in (("task", task), - ("variant", variant), - ("distro", distro)): + for (component_name, component_value) in (("task", task), ("variant", variant), ("distro", + distro)): if isinstance(component_value, (tf.Wildcard, tf.Missing)): if component_name == "task": return "unreliable" @@ -255,17 +244,13 @@ def update_lifecycle(lifecycle_tags_file, report, method_test, add_tags, fail_ra The test_method checks unreliable or reliable fail_rates. """ for summary in report: - if method_test(summary.fail_rate, - fail_rate, - summary.num_pass + summary.num_fail, - min_run): + if method_test(summary.fail_rate, fail_rate, summary.num_pass + summary.num_fail, min_run): update_tag = unreliable_tag(summary.task, summary.variant, summary.distro) if add_tags: - lifecycle_tags_file.add_tag("js_test", summary.test, - update_tag, summary.fail_rate) + lifecycle_tags_file.add_tag("js_test", summary.test, update_tag, summary.fail_rate) else: - lifecycle_tags_file.remove_tag("js_test", summary.test, - update_tag, summary.fail_rate) + lifecycle_tags_file.remove_tag("js_test", summary.test, update_tag, + summary.fail_rate) def compare_tags(tag_a, tag_b): @@ -280,10 +265,9 @@ def validate_config(config): Raises a TypeError or ValueError exception if 'config' isn't a valid model. """ - for (name, fail_rates) in (("test", config.test_fail_rates), - ("task", config.task_fail_rates), - ("variant", config.variant_fail_rates), - ("distro", config.distro_fail_rates)): + for (name, fail_rates) in (("test", config.test_fail_rates), ("task", config.task_fail_rates), + ("variant", config.variant_fail_rates), ("distro", + config.distro_fail_rates)): if not isinstance(fail_rates.acceptable, _NUMBER_TYPES): raise TypeError("The acceptable {} failure rate must be a number, but got {}".format( name, fail_rates.acceptable)) @@ -299,11 +283,11 @@ def validate_config(config): elif fail_rates.acceptable > fail_rates.unacceptable: raise ValueError( ("The acceptable {0} failure rate ({1}) must be no larger than unacceptable {0}" - " failure rate ({2})").format( - name, fail_rates.acceptable, fail_rates.unacceptable)) + " failure rate ({2})").format(name, fail_rates.acceptable, + fail_rates.unacceptable)) - for (name, min_runs) in (("reliable", config.reliable_min_runs), - ("unreliable", config.unreliable_min_runs)): + for (name, min_runs) in (("reliable", config.reliable_min_runs), ("unreliable", + config.unreliable_min_runs)): if not isinstance(min_runs, _NUMBER_TYPES): raise TypeError(("The minimum number of runs for considering a test {} must be a" " number, but got {}").format(name, min_runs)) @@ -365,10 +349,9 @@ def update_tags(lifecycle_tags, config, report, tests): # before assignment. grouped_entries = None for (i, (components, rates)) in enumerate( - ((tf.Report.TEST_TASK_VARIANT_DISTRO, config.distro_fail_rates), - (tf.Report.TEST_TASK_VARIANT, config.variant_fail_rates), - (tf.Report.TEST_TASK, config.task_fail_rates), - (tf.Report.TEST, config.test_fail_rates))): + ((tf.Report.TEST_TASK_VARIANT_DISTRO, + config.distro_fail_rates), (tf.Report.TEST_TASK_VARIANT, config.variant_fail_rates), + (tf.Report.TEST_TASK, config.task_fail_rates), (tf.Report.TEST, config.test_fail_rates))): if i > 0: report = tf.Report(grouped_entries) @@ -379,14 +362,17 @@ def update_tags(lifecycle_tags, config, report, tests): # Create the reliable report. # Filter out any test executions from prior to 'config.reliable_time_period'. - reliable_start_date = (report.end_date - config.reliable_time_period - + datetime.timedelta(days=1)) - reliable_entries = [entry for entry in grouped_entries - if entry.start_date >= reliable_start_date] + reliable_start_date = ( + report.end_date - config.reliable_time_period + datetime.timedelta(days=1)) + reliable_entries = [ + entry for entry in grouped_entries if entry.start_date >= reliable_start_date + ] if reliable_entries: reliable_report = tf.Report(reliable_entries) - reliable_combinations = {_test_combination_from_entry(entry, components) - for entry in reliable_entries} + reliable_combinations = { + _test_combination_from_entry(entry, components) + for entry in reliable_entries + } reliable_summaries = reliable_report.summarize_by(components) else: reliable_combinations = set() @@ -396,12 +382,12 @@ def update_tags(lifecycle_tags, config, report, tests): # Filter out any test executions from prior to 'config.unreliable_time_period'. # Also filter out any test that is not present in the reliable_report in order # to avoid tagging as unreliable tests that are no longer running. - unreliable_start_date = (report.end_date - config.unreliable_time_period - + datetime.timedelta(days=1)) + unreliable_start_date = ( + report.end_date - config.unreliable_time_period + datetime.timedelta(days=1)) unreliable_entries = [ entry for entry in grouped_entries - if (entry.start_date >= unreliable_start_date and - _test_combination_from_entry(entry, components) in reliable_combinations) + if (entry.start_date >= unreliable_start_date + and _test_combination_from_entry(entry, components) in reliable_combinations) ] if unreliable_entries: unreliable_report = tf.Report(unreliable_entries) @@ -410,19 +396,11 @@ def update_tags(lifecycle_tags, config, report, tests): unreliable_summaries = [] # Update the tags using the unreliable report. - update_lifecycle(lifecycle_tags, - unreliable_summaries, - unreliable_test, - True, - rates.unacceptable, - config.unreliable_min_runs) + update_lifecycle(lifecycle_tags, unreliable_summaries, unreliable_test, True, + rates.unacceptable, config.unreliable_min_runs) # Update the tags using the reliable report. - update_lifecycle(lifecycle_tags, - reliable_summaries, - reliable_test, - False, - rates.acceptable, + update_lifecycle(lifecycle_tags, reliable_summaries, reliable_test, False, rates.acceptable, config.reliable_min_runs) def should_be_removed(test, tag): @@ -497,18 +475,12 @@ def _config_as_options(config): "--taskFailRates {} {} " "--variantFailRates {} {} " "--distroFailRates {} {}").format( - config.reliable_min_runs, - config.reliable_time_period.days, - config.unreliable_min_runs, - config.unreliable_time_period.days, - config.test_fail_rates.acceptable, - config.test_fail_rates.unacceptable, - config.task_fail_rates.acceptable, - config.task_fail_rates.unacceptable, - config.variant_fail_rates.acceptable, - config.variant_fail_rates.unacceptable, - config.distro_fail_rates.acceptable, - config.distro_fail_rates.unacceptable) + config.reliable_min_runs, config.reliable_time_period.days, + config.unreliable_min_runs, config.unreliable_time_period.days, + config.test_fail_rates.acceptable, config.test_fail_rates.unacceptable, + config.task_fail_rates.acceptable, config.task_fail_rates.unacceptable, + config.variant_fail_rates.acceptable, config.variant_fail_rates.unacceptable, + config.distro_fail_rates.acceptable, config.distro_fail_rates.unacceptable) class TagsConfigWithChangelog(object): @@ -571,28 +543,17 @@ class JiraIssueCreator(object): _PROJECT = "TIGBOT" _MAX_DESCRIPTION_SIZE = 32767 - def __init__(self, - server=None, - username=None, - password=None, - access_token=None, - access_token_secret=None, - consumer_key=None, - key_cert=None): + def __init__(self, server=None, username=None, password=None, access_token=None, + access_token_secret=None, consumer_key=None, key_cert=None): self._client = jiraclient.JiraClient( - server=server, - username=username, - password=password, - access_token=access_token, - access_token_secret=access_token_secret, - consumer_key=consumer_key, - key_cert=key_cert) + server=server, username=username, password=password, access_token=access_token, + access_token_secret=access_token_secret, consumer_key=consumer_key, key_cert=key_cert) def create_issue(self, evg_project, mongo_revision, model_config, added, removed, cleaned_up): """Create a JIRA issue for the test lifecycle tag update.""" summary = self._get_jira_summary(evg_project) - description = self._get_jira_description(evg_project, mongo_revision, model_config, - added, removed, cleaned_up) + description = self._get_jira_description(evg_project, mongo_revision, model_config, added, + removed, cleaned_up) issue_key = self._client.create_issue(self._PROJECT, summary, description, [self._LABEL]) return issue_key @@ -643,8 +604,8 @@ class JiraIssueCreator(object): "h5. Tags added\n{3}\n\n" "h5. Tags removed\n{4}\n\n" "h5. Tags cleaned up (no longer relevant)\n{5}\n").format( - project_link, revision_link, mono(config_desc), - added_desc, removed_desc, cleaned_up_desc) + project_link, revision_link, mono(config_desc), added_desc, removed_desc, + cleaned_up_desc) return JiraIssueCreator._truncate_description(full_desc) @@ -738,8 +699,8 @@ class LifecycleTagsFile(object): @staticmethod def _clone_repository(metadata_repo_url, branch): directory_name = posixpath.splitext(posixpath.basename(metadata_repo_url))[0] - LOGGER.info("Cloning the repository %s into the directory %s", - metadata_repo_url, directory_name) + LOGGER.info("Cloning the repository %s into the directory %s", metadata_repo_url, + directory_name) return git.Repository.clone(metadata_repo_url, directory_name, branch) def is_modified(self): @@ -749,9 +710,8 @@ class LifecycleTagsFile(object): def _create_issue(self): LOGGER.info("Creating a JIRA issue") issue_key = self.jira_issue_creator.create_issue( - self.project, self.mongo_revision, self.model_config, - self.changelog_lifecycle.added, self.changelog_lifecycle.removed, - self.changelog_lifecycle.cleaned_up) + self.project, self.mongo_revision, self.model_config, self.changelog_lifecycle.added, + self.changelog_lifecycle.removed, self.changelog_lifecycle.cleaned_up) LOGGER.info("JIRA issue created: %s", issue_key) return issue_key @@ -766,8 +726,8 @@ class LifecycleTagsFile(object): def _ready_for_commit(self, ref_branch, references): # Check that the test lifecycle tags file has changed. - diff = self.metadata_repo.git_diff(["--name-only", ref_branch, - self.relative_lifecycle_file]) + diff = self.metadata_repo.git_diff( + ["--name-only", ref_branch, self.relative_lifecycle_file]) if not diff: LOGGER.info("The local lifecycle file is identical to the the one on branch '%s'", ref_branch) @@ -777,8 +737,8 @@ class LifecycleTagsFile(object): if update_revision and not self.mongo_repo.is_ancestor(update_revision, self.mongo_revision): LOGGER.warning(("The existing lifecycle file is based on revision '%s' which is not a" - " parent revision of the current revision '%s'"), - update_revision, self.mongo_revision) + " parent revision of the current revision '%s'"), update_revision, + self.mongo_revision) return False return True @@ -875,14 +835,9 @@ def make_lifecycle_tags_file(options, model_config): jira_issue_creator = None git_config = None - lifecycle_tags_file = LifecycleTagsFile( - options.project, - options.tag_file, - options.metadata_repo_url, - options.references_file, - jira_issue_creator, - git_config, - model_config) + lifecycle_tags_file = LifecycleTagsFile(options.project, options.tag_file, + options.metadata_repo_url, options.references_file, + jira_issue_creator, git_config, model_config) return lifecycle_tags_file @@ -893,25 +848,21 @@ def main(): Evergreen API. """ - parser = optparse.OptionParser(description=textwrap.dedent(main.__doc__), - usage="Usage: %prog [options] [test1 test2 ...]") + parser = optparse.OptionParser( + description=textwrap.dedent(main.__doc__), usage="Usage: %prog [options] [test1 test2 ...]") data_options = optparse.OptionGroup( - parser, - title="Data options", + parser, title="Data options", description=("Options used to configure what historical test failure data to retrieve from" " Evergreen.")) parser.add_option_group(data_options) - data_options.add_option( - "--project", dest="project", - metavar="<project-name>", - default=tf.TestHistory.DEFAULT_PROJECT, - help="The Evergreen project to analyze. Defaults to '%default'.") + data_options.add_option("--project", dest="project", metavar="<project-name>", + default=tf.TestHistory.DEFAULT_PROJECT, + help="The Evergreen project to analyze. Defaults to '%default'.") data_options.add_option( - "--tasks", dest="tasks", - metavar="<task1,task2,...>", + "--tasks", dest="tasks", metavar="<task1,task2,...>", help=("The Evergreen tasks to analyze for tagging unreliable tests. If specified in" " additional to having test positional arguments, then only tests that run under the" " specified Evergreen tasks will be analyzed. If omitted, then the list of tasks" @@ -919,27 +870,21 @@ def main(): " --evergreenProjectConfig file.")) data_options.add_option( - "--variants", dest="variants", - metavar="<variant1,variant2,...>", - default="", + "--variants", dest="variants", metavar="<variant1,variant2,...>", default="", help="The Evergreen build variants to analyze for tagging unreliable tests.") - data_options.add_option( - "--distros", dest="distros", - metavar="<distro1,distro2,...>", - default="", - help="The Evergreen distros to analyze for tagging unreliable tests.") + data_options.add_option("--distros", dest="distros", metavar="<distro1,distro2,...>", + default="", + help="The Evergreen distros to analyze for tagging unreliable tests.") data_options.add_option( "--evergreenProjectConfig", dest="evergreen_project_config", - metavar="<project-config-file>", - default="etc/evergreen.yml", + metavar="<project-config-file>", default="etc/evergreen.yml", help=("The Evergreen project configuration file used to get the list of tasks if --tasks is" " omitted. Defaults to '%default'.")) model_options = optparse.OptionGroup( - parser, - title="Model options", + parser, title="Model options", description=("Options used to configure whether (test,), (test, task)," " (test, task, variant), and (test, task, variant, distro) combinations are" " considered unreliable.")) @@ -947,16 +892,14 @@ def main(): model_options.add_option( "--reliableTestMinRuns", type="int", dest="reliable_test_min_runs", - metavar="<reliable-min-runs>", - default=DEFAULT_CONFIG.reliable_min_runs, + metavar="<reliable-min-runs>", default=DEFAULT_CONFIG.reliable_min_runs, help=("The minimum number of test executions required for a test's failure rate to" " determine whether the test is considered reliable. If a test has fewer than" " <reliable-min-runs> executions, then it cannot be considered unreliable.")) model_options.add_option( "--unreliableTestMinRuns", type="int", dest="unreliable_test_min_runs", - metavar="<unreliable-min-runs>", - default=DEFAULT_CONFIG.unreliable_min_runs, + metavar="<unreliable-min-runs>", default=DEFAULT_CONFIG.unreliable_min_runs, help=("The minimum number of test executions required for a test's failure rate to" " determine whether the test is considered unreliable. If a test has fewer than" " <unreliable-min-runs> executions, then it cannot be considered unreliable.")) @@ -1011,105 +954,84 @@ def main(): " unreliable. Defaults to %default.")) model_options.add_option( - "--reliableDays", type="int", dest="reliable_days", - metavar="<ndays>", + "--reliableDays", type="int", dest="reliable_days", metavar="<ndays>", default=DEFAULT_CONFIG.reliable_time_period.days, help=("The time period to analyze when determining if a test has become reliable. Defaults" " to %default day(s).")) model_options.add_option( - "--unreliableDays", type="int", dest="unreliable_days", - metavar="<ndays>", + "--unreliableDays", type="int", dest="unreliable_days", metavar="<ndays>", default=DEFAULT_CONFIG.unreliable_time_period.days, help=("The time period to analyze when determining if a test has become unreliable." " Defaults to %default day(s).")) - parser.add_option("--resmokeTagFile", dest="tag_file", - metavar="<tagfile>", + parser.add_option("--resmokeTagFile", dest="tag_file", metavar="<tagfile>", default="etc/test_lifecycle.yml", help=("The resmoke.py tag file to update. If --metadataRepo is specified, it" " is the relative path in the metadata repository, otherwise it can be" " an absolute path or a relative path from the current directory." " Defaults to '%default'.")) - parser.add_option("--metadataRepo", dest="metadata_repo_url", - metavar="<metadata-repo-url>", + parser.add_option("--metadataRepo", dest="metadata_repo_url", metavar="<metadata-repo-url>", default="git@github.com:mongodb/mongo-test-metadata.git", help=("The repository that contains the lifecycle file. " "It will be cloned in the current working directory. " "Defaults to '%default'.")) - parser.add_option("--referencesFile", dest="references_file", - metavar="<references-file>", + parser.add_option("--referencesFile", dest="references_file", metavar="<references-file>", default="references.yml", help=("The YAML file in the metadata repository that contains the revision " "mappings. Defaults to '%default'.")) - parser.add_option("--requestBatchSize", type="int", dest="batch_size", - metavar="<batch-size>", + parser.add_option("--requestBatchSize", type="int", dest="batch_size", metavar="<batch-size>", default=100, help=("The maximum number of tests to query the Evergreen API for in a single" " request. A higher value for this option will reduce the number of" " roundtrips between this client and Evergreen. Defaults to %default.")) parser.add_option("--requestThreads", type="int", dest="num_request_threads", - metavar="<num-request-threads>", - default=DEFAULT_NUM_THREADS, + metavar="<num-request-threads>", default=DEFAULT_NUM_THREADS, help=("The maximum number of threads to use when querying the Evergreen API." " Batches are processed sequentially but the test history is queried in" " parallel for each task. Defaults to %default.")) commit_options = optparse.OptionGroup( - parser, - title="Commit options", + parser, title="Commit options", description=("Options used to configure whether and how to commit the updated test" " lifecycle tags.")) parser.add_option_group(commit_options) - commit_options.add_option( - "--commit", action="store_true", dest="commit", - default=False, - help="Indicates that the updated tag file should be committed.") + commit_options.add_option("--commit", action="store_true", dest="commit", default=False, + help="Indicates that the updated tag file should be committed.") commit_options.add_option( - "--jiraConfig", dest="jira_config", - metavar="<jira-config>", - default=None, + "--jiraConfig", dest="jira_config", metavar="<jira-config>", default=None, help=("The YAML file containing the JIRA access configuration ('user', 'password'," "'server').")) commit_options.add_option( - "--gitUserName", dest="git_user_name", - metavar="<git-user-name>", - default="Test Lifecycle", + "--gitUserName", dest="git_user_name", metavar="<git-user-name>", default="Test Lifecycle", help=("The git user name that will be set before committing to the metadata repository." " Defaults to '%default'.")) commit_options.add_option( - "--gitUserEmail", dest="git_user_email", - metavar="<git-user-email>", + "--gitUserEmail", dest="git_user_email", metavar="<git-user-email>", default="buil+testlifecycle@mongodb.com", help=("The git user email address that will be set before committing to the metadata" " repository. Defaults to '%default'.")) logging_options = optparse.OptionGroup( - parser, - title="Logging options", + parser, title="Logging options", description="Options used to configure the logging output of the script.") parser.add_option_group(logging_options) - logging_options.add_option( - "--logLevel", dest="log_level", - metavar="<log-level>", - choices=["DEBUG", "INFO", "WARNING", "ERROR"], - default="INFO", - help=("The log level. Accepted values are: DEBUG, INFO, WARNING and ERROR." - " Defaults to '%default'.")) + logging_options.add_option("--logLevel", dest="log_level", metavar="<log-level>", choices=[ + "DEBUG", "INFO", "WARNING", "ERROR" + ], default="INFO", help=("The log level. Accepted values are: DEBUG, INFO, WARNING and ERROR." + " Defaults to '%default'.")) logging_options.add_option( - "--logFile", dest="log_file", - metavar="<log-file>", - default=None, + "--logFile", dest="log_file", metavar="<log-file>", default=None, help="The destination file for the logs output. Defaults to the standard output.") (options, tests) = parser.parse_args() @@ -1120,8 +1042,8 @@ def main(): " isn't returned by the Evergreen API. This option will therefore be ignored."), RuntimeWarning) - logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s", - level=options.log_level, filename=options.log_file) + logging.basicConfig(format="%(asctime)s %(levelname)s %(message)s", level=options.log_level, + filename=options.log_file) evg_conf = ci_evergreen.EvergreenProjectConfig(options.evergreen_project_config) use_test_tasks_membership = False @@ -1136,11 +1058,10 @@ def main(): distros = options.distros.split(",") if options.distros else [] config = Config( - test_fail_rates=Rates(*options.test_fail_rates), - task_fail_rates=Rates(*options.task_fail_rates), - variant_fail_rates=Rates(*options.variant_fail_rates), - distro_fail_rates=Rates(*options.distro_fail_rates), - reliable_min_runs=options.reliable_test_min_runs, + test_fail_rates=Rates(*options.test_fail_rates), task_fail_rates=Rates( + *options.task_fail_rates), variant_fail_rates=Rates( + *options.variant_fail_rates), distro_fail_rates=Rates( + *options.distro_fail_rates), reliable_min_runs=options.reliable_test_min_runs, reliable_time_period=datetime.timedelta(days=options.reliable_days), unreliable_min_runs=options.unreliable_test_min_runs, unreliable_time_period=datetime.timedelta(days=options.unreliable_days)) @@ -1163,9 +1084,8 @@ def main(): # For efficiency purposes, group the tests and process in batches of batch_size. test_groups = create_batch_groups(create_test_groups(tests), options.batch_size) - test_history_source = TestHistorySource(options.project, variants, distros, - commit_prior, commit_last, - options.num_request_threads) + test_history_source = TestHistorySource(options.project, variants, distros, commit_prior, + commit_last, options.num_request_threads) LOGGER.info("Updating the tags") nb_groups = len(test_groups) |