зеркало из https://github.com/mozilla/treeherder.git
WIP - add new_failure field to TextLogError and update when we have a new failure. (#8254)
This commit is contained in:
Родитель
2d22879767
Коммит
3fd8b1b5b3
|
@ -2,6 +2,7 @@ import json
|
||||||
|
|
||||||
from treeherder.etl.artifact import store_job_artifacts
|
from treeherder.etl.artifact import store_job_artifacts
|
||||||
from treeherder.model.models import TextLogError
|
from treeherder.model.models import TextLogError
|
||||||
|
from treeherder.model.error_summary import get_error_summary
|
||||||
|
|
||||||
|
|
||||||
def test_load_textlog_summary_twice(test_repository, test_job):
|
def test_load_textlog_summary_twice(test_repository, test_job):
|
||||||
|
@ -50,8 +51,19 @@ def test_load_non_ascii_textlog_errors(test_job):
|
||||||
"job_guid": test_job.guid,
|
"job_guid": test_job.guid,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ensure a result='failed' to treat failure as a NEW_failure
|
||||||
|
test_job.result = "testfailed"
|
||||||
|
test_job.save()
|
||||||
|
|
||||||
store_job_artifacts([text_log_summary_artifact])
|
store_job_artifacts([text_log_summary_artifact])
|
||||||
|
|
||||||
|
# ensure bug_suggestions data is stored and retrieved properly
|
||||||
|
tle_all = TextLogError.objects.all()
|
||||||
|
bug_suggestions = get_error_summary(test_job)
|
||||||
|
for suggestion in bug_suggestions:
|
||||||
|
tle = next(t for t in tle_all if t.line_number == suggestion["line_number"])
|
||||||
|
assert suggestion["failure_new_in_rev"] == tle.new_failure
|
||||||
|
|
||||||
assert TextLogError.objects.count() == 2
|
assert TextLogError.objects.count() == 2
|
||||||
assert TextLogError.objects.get(line_number=1587).line == "07:51:28 WARNING - \U000000c3"
|
assert TextLogError.objects.get(line_number=1587).line == "07:51:28 WARNING - \U000000c3"
|
||||||
assert TextLogError.objects.get(line_number=1588).line == "07:51:29 WARNING - <U+01D400>"
|
assert TextLogError.objects.get(line_number=1588).line == "07:51:29 WARNING - <U+01D400>"
|
||||||
|
|
|
@ -222,12 +222,14 @@ def test_text_log_errors(client, test_job):
|
||||||
"job": 1,
|
"job": 1,
|
||||||
"line": "failure 1",
|
"line": "failure 1",
|
||||||
"line_number": 101,
|
"line_number": 101,
|
||||||
|
"new_failure": False,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"job": 1,
|
"job": 1,
|
||||||
"line": "failure 2",
|
"line": "failure 2",
|
||||||
"line_number": 102,
|
"line_number": 102,
|
||||||
|
"new_failure": False,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,9 @@ def store_text_log_summary_artifact(job, text_log_summary_artifact):
|
||||||
ignore_conflicts=True,
|
ignore_conflicts=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Bulk create doesn't return .id field, so query to get them.
|
||||||
|
log_errors = TextLogError.objects.filter(job=job)
|
||||||
|
|
||||||
# get error summary immediately (to warm the cache)
|
# get error summary immediately (to warm the cache)
|
||||||
# Conflicts may have occured during the insert, but we pass the queryset for performance
|
# Conflicts may have occured during the insert, but we pass the queryset for performance
|
||||||
bugs = error_summary.get_error_summary(job, queryset=log_errors)
|
bugs = error_summary.get_error_summary(job, queryset=log_errors)
|
||||||
|
@ -42,7 +45,13 @@ def store_text_log_summary_artifact(job, text_log_summary_artifact):
|
||||||
]:
|
]:
|
||||||
# classify job as `new failure` - for filtering, etc.
|
# classify job as `new failure` - for filtering, etc.
|
||||||
job.failure_classification_id = 6
|
job.failure_classification_id = 6
|
||||||
job.save()
|
job.save(update_fields=["failure_classification_id"])
|
||||||
|
# for every log_errors (TLE object) there is a corresponding bugs/suggestion
|
||||||
|
for tle in log_errors:
|
||||||
|
if tle.line_number == suggestion["line_number"]:
|
||||||
|
tle.new_failure = True
|
||||||
|
tle.save(update_fields=["new_failure"])
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
def store_job_artifacts(artifact_data):
|
def store_job_artifacts(artifact_data):
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Generated by Django 4.2.13 on 2024-10-21 13:53
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
(
|
||||||
|
"model",
|
||||||
|
"0032_rename_failureline_job_guid_repository_failure_lin_job_gui_b67c6d_idx_and_more",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name="textlogerror",
|
||||||
|
name="new_failure",
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1219,6 +1219,7 @@ class TextLogError(models.Model):
|
||||||
job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name="text_log_error", null=True)
|
job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name="text_log_error", null=True)
|
||||||
line = models.TextField()
|
line = models.TextField()
|
||||||
line_number = models.PositiveIntegerField()
|
line_number = models.PositiveIntegerField()
|
||||||
|
new_failure = models.BooleanField(default=False)
|
||||||
|
|
||||||
# TODO delete this field and unique_together once backfill of jobs in TextLogError table has been completed
|
# TODO delete this field and unique_together once backfill of jobs in TextLogError table has been completed
|
||||||
step = models.ForeignKey(
|
step = models.ForeignKey(
|
||||||
|
|
Загрузка…
Ссылка в новой задаче