summaryrefslogtreecommitdiff
path: root/buildscripts/update_test_lifecycle.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildscripts/update_test_lifecycle.py')
-rwxr-xr-xbuildscripts/update_test_lifecycle.py304
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)