Skip to content

Commit

Permalink
Bug 1288530 - Add a "classifier" field to PerformanceAlert, referenci…
Browse files Browse the repository at this point in the history
…ng the user model (#1718)
  • Loading branch information
roystchiang authored and wlach committed Jul 27, 2016
1 parent c9e4582 commit 5da09da
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 10 deletions.
12 changes: 7 additions & 5 deletions tests/perfalert/test_create_alerts.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ def _verify_alert(alertid, expected_result_set_id,
expected_prev_result_set_id,
expected_signature, expected_prev_value,
expected_new_value, expected_is_regression,
expected_status, expected_summary_status):
expected_status, expected_summary_status,
expected_classifier):
alert = PerformanceAlert.objects.get(id=alertid)
assert alert.prev_value == expected_prev_value
assert alert.new_value == expected_new_value
assert alert.series_signature == expected_signature
assert alert.is_regression == expected_is_regression
assert alert.status == expected_status
assert alert.classifier == expected_classifier

summary = PerformanceAlertSummary.objects.get(id=alertid)
assert summary.result_set_id == expected_result_set_id
Expand Down Expand Up @@ -47,15 +49,15 @@ def test_detect_alerts_in_series(test_project, test_repository,
assert PerformanceAlertSummary.objects.count() == 1
_verify_alert(1, (INTERVAL/2), (INTERVAL/2)-1, test_perf_signature, 0.5,
1.0, True, PerformanceAlert.UNTRIAGED,
PerformanceAlertSummary.UNTRIAGED)
PerformanceAlertSummary.UNTRIAGED, None)

# verify that no new alerts generated if we rerun
generate_new_alerts_in_series(test_perf_signature)
assert PerformanceAlert.objects.count() == 1
assert PerformanceAlertSummary.objects.count() == 1
_verify_alert(1, (INTERVAL/2), (INTERVAL/2)-1, test_perf_signature, 0.5,
1.0, True, PerformanceAlert.UNTRIAGED,
PerformanceAlertSummary.UNTRIAGED)
PerformanceAlertSummary.UNTRIAGED, None)

# add data to generate a new alert
for (t, v) in zip([i for i in range(INTERVAL, INTERVAL*2)],
Expand All @@ -74,7 +76,7 @@ def test_detect_alerts_in_series(test_project, test_repository,
assert PerformanceAlertSummary.objects.count() == 2
_verify_alert(2, INTERVAL, INTERVAL-1, test_perf_signature, 1.0, 2.0,
True, PerformanceAlert.UNTRIAGED,
PerformanceAlertSummary.UNTRIAGED)
PerformanceAlertSummary.UNTRIAGED, None)


def test_detect_alerts_in_series_with_retriggers(
Expand Down Expand Up @@ -103,7 +105,7 @@ def test_detect_alerts_in_series_with_retriggers(
generate_new_alerts_in_series(test_perf_signature)
_verify_alert(1, 2, 1, test_perf_signature, 0.5, 1.0, True,
PerformanceAlert.UNTRIAGED,
PerformanceAlertSummary.UNTRIAGED)
PerformanceAlertSummary.UNTRIAGED, None)


def test_no_alerts_with_old_data(
Expand Down
4 changes: 3 additions & 1 deletion tests/webapp/api/test_performance_alerts_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ def test_alerts_get(webapp, test_repository, test_perf_alert):
'series_signature',
'summary_id',
'status',
't_value'
't_value',
'classifier'
])
assert resp.json['results'][0]['related_summary_id'] is None

Expand Down Expand Up @@ -77,6 +78,7 @@ def test_alerts_put(webapp, test_repository, test_perf_alert, test_user,
}, format='json')
assert resp.status_code == 200
assert PerformanceAlert.objects.get(id=1).related_summary_id == 2
assert PerformanceAlert.objects.get(id=1).classifier == test_sheriff

# verify that we can unset it too
resp = client.put(reverse('performance-alerts-list') + '1/', {
Expand Down
3 changes: 2 additions & 1 deletion tests/webapp/api/test_performance_alertsummary_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ def test_alert_summaries_get(webapp, test_perf_alert_summary,
'amount_abs',
'amount_pct',
'summary_id',
'related_summary_id'
'related_summary_id',
'classifier'
])
assert len(resp.json['results'][0]['related_alerts']) == 0

Expand Down
21 changes: 21 additions & 0 deletions treeherder/perf/migrations/0019_performancealert_classifier.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
from django.conf import settings


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('perf', '0018_merge'),
]

operations = [
migrations.AddField(
model_name='performancealert',
name='classifier',
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True),
),
]
2 changes: 2 additions & 0 deletions treeherder/perf/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.core.validators import MinLengthValidator
from django.db import models
Expand Down Expand Up @@ -231,6 +232,7 @@ class PerformanceAlert(models.Model):
null=True)
series_signature = models.ForeignKey(PerformanceSignature)
is_regression = models.BooleanField()
classifier = models.ForeignKey(User, null=True) # null if autoclassified

UNTRIAGED = 0
DOWNSTREAM = 1
Expand Down
5 changes: 5 additions & 0 deletions treeherder/webapp/api/performance_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,11 @@ class AlertPagination(pagination.CursorPagination):

pagination_class = AlertPagination

def update(self, request, *args, **kwargs):
if 'related_summary_id' in request.data:
request.data['classifier'] = request.user.email
return super(PerformanceAlertViewSet, self).update(request, *args, **kwargs)

def create(self, request, *args, **kwargs):
data = request.data
if 'summary_id' not in data or 'signature_id' not in data:
Expand Down
6 changes: 5 additions & 1 deletion treeherder/webapp/api/performance_serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.contrib.auth.models import User
from rest_framework import (exceptions,
serializers)

Expand Down Expand Up @@ -59,6 +60,9 @@ class PerformanceAlertSerializer(serializers.ModelSerializer):
slug_field="id", source="related_summary",
allow_null=True, required=False,
queryset=PerformanceAlertSummary.objects.all())
classifier = serializers.SlugRelatedField(
slug_field="email", allow_null=True, required=False,
queryset=User.objects.all())

# express quantities in terms of decimals to save space
amount_abs = PerformanceDecimalField(read_only=True)
Expand All @@ -84,7 +88,7 @@ class Meta:
fields = ['id', 'status', 'series_signature', 'is_regression',
'prev_value', 'new_value', 't_value', 'amount_abs',
'amount_pct', 'summary_id', 'related_summary_id',
'manually_created']
'manually_created', 'classifier']


class PerformanceAlertSummarySerializer(serializers.ModelSerializer):
Expand Down
8 changes: 6 additions & 2 deletions ui/partials/perf/alertsctrl.html
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,15 @@
&nbsp;(<span ng-class="{'alert-invalid': alert.isInvalid(), 'alert-untriaged': alert.isUntriaged()}">{{alert.getStatusText()}}</span><span ng-show="alert.related_summary_id">
<!-- Reassigned or downstream *to* another alert -->
<span ng-if="alert.related_summary_id !== alertSummary.id">
to <a href="#/alerts?id={{alert.related_summary_id}}" target="_blank">alert #{{alert.related_summary_id}}</a>
to <a href="#/alerts?id={{alert.related_summary_id}}" target="_blank"
uib-tooltip="{{alert.classifier ? 'Classified by ' + alert.classifier : 'Classified automatically'}}"
>alert #{{alert.related_summary_id}}</a>
</span>
<!-- Reassigned or downstream *from* the another alert -->
<span ng-if="alert.related_summary_id === alertSummary.id">
from <a href="#/alerts?id={{alert.summary_id}}" target="_blank">alert #{{alert.summary_id}}</a>
from <a href="#/alerts?id={{alert.summary_id}}" target="_blank"
uib-tooltip="{{alert.classifier ? 'Classified by ' + alert.classifier : 'Classified automatically'}}"
>alert #{{alert.summary_id}}</a>
</span>
</span>)&nbsp;&nbsp;
<span class="result-links">
Expand Down

0 comments on commit 5da09da

Please sign in to comment.