Skip to content

Commit

Permalink
Fix filter model unique fields
Browse files Browse the repository at this point in the history
  • Loading branch information
kfdm committed Mar 6, 2019
1 parent 181c58a commit 95684ce
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 36 deletions.
13 changes: 10 additions & 3 deletions promgen/migrations/0007_message_filter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 2.1.2 on 2019-03-06 01:50
# Generated by Django 2.1.2 on 2019-03-06 06:20

from django.db import migrations, models
import django.db.models.deletion
Expand All @@ -15,13 +15,20 @@ class Migration(migrations.Migration):
name='Filter',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=128, unique=True)),
('value', models.CharField(max_length=128, unique=True)),
('name', models.CharField(max_length=128)),
('value', models.CharField(max_length=128)),
],
options={
'ordering': ('sender', 'name', 'value'),
},
),
migrations.AddField(
model_name='filter',
name='sender',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='promgen.Sender'),
),
migrations.AlterUniqueTogether(
name='filter',
unique_together={('sender', 'name', 'value')},
),
]
8 changes: 6 additions & 2 deletions promgen/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,12 @@ def filtered(self, alert):

class Filter(models.Model):
sender = models.ForeignKey("Sender", on_delete=models.CASCADE)
name = models.CharField(max_length=128, unique=True)
value = models.CharField(max_length=128, unique=True)
name = models.CharField(max_length=128)
value = models.CharField(max_length=128)

class Meta:
ordering = ("sender", "name", "value")
unique_together = (("sender", "name", "value"),)


class Shard(models.Model):
Expand Down
74 changes: 43 additions & 31 deletions promgen/tests/test_webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,69 +11,81 @@
from promgen.tests import PromgenTest


TEST_SETTINGS = PromgenTest.data_yaml('examples', 'promgen.yml')
TEST_ALERT = PromgenTest.data('examples', 'alertmanager.json')
TEST_SETTINGS = PromgenTest.data_yaml("examples", "promgen.yml")
TEST_ALERT = PromgenTest.data("examples", "alertmanager.json")


class WebhookTest(PromgenTest):
@mock.patch('django.dispatch.dispatcher.Signal.send')
@mock.patch("django.dispatch.dispatcher.Signal.send")
def setUp(self, mock_signal):
self.shard = models.Shard.objects.create(name='test.shard')
self.service = models.Service.objects.create(name='test.service', shard=self.shard)
self.project = models.Project.objects.create(name='test.project', service=self.service)
self.shard = models.Shard.objects.create(name="test.shard")
self.service = models.Service.objects.create(
name="test.service", shard=self.shard
)
self.project = models.Project.objects.create(
name="test.project", service=self.service
)

self.sender = models.Sender.objects.create(
self.senderA = models.Sender.objects.create(
obj=self.project,
sender=NotificationWebhook.__module__,
value='http://project.example.com',
value="http://project.example.com",
)

self.sender = models.Sender.objects.create(
self.senderB = models.Sender.objects.create(
obj=self.service,
sender=NotificationWebhook.__module__,
value='http://service.example.com',
value="http://service.example.com",
)

@override_settings(PROMGEN=TEST_SETTINGS)
@override_settings(CELERY_TASK_ALWAYS_EAGER=True)
@override_settings(CELERY_TASK_EAGER_PROPAGATES=True)
@mock.patch("promgen.util.post")
def test_webhook(self, mock_post):
self.client.post(reverse('alert'),
data=TEST_ALERT,
content_type='application/json'
response = self.client.post(
reverse("alert"), data=TEST_ALERT, content_type="application/json"
)

self.assertEqual(models.Alert.objects.count(), 1, 'Alert should be queued')
self.assertEqual(response.status_code, 202)
self.assertEqual(models.Alert.objects.count(), 1, "Alert should be queued")
self.assertEqual(mock_post.call_count, 2, "Two alerts should be sent")

# Our sample is the same as the original, with some annotations added
_SAMPLE = PromgenTest.data_json('examples', 'alertmanager.json')
_SAMPLE['commonAnnotations']['service'] = 'http://example.com' + self.service.get_absolute_url()
_SAMPLE['commonAnnotations']['project'] = 'http://example.com' + self.project.get_absolute_url()

mock_post.assert_has_calls([
mock.call(
'http://project.example.com',
json=_SAMPLE,
),
mock.call(
'http://service.example.com',
json=_SAMPLE,
)
], any_order=True)
_SAMPLE = PromgenTest.data_json("examples", "alertmanager.json")
_SAMPLE["commonAnnotations"]["service"] = (
"http://example.com" + self.service.get_absolute_url()
)
_SAMPLE["commonAnnotations"]["project"] = (
"http://example.com" + self.project.get_absolute_url()
)

mock_post.assert_has_calls(
[
mock.call("http://project.example.com", json=_SAMPLE),
mock.call("http://service.example.com", json=_SAMPLE),
],
any_order=True,
)

@override_settings(PROMGEN=TEST_SETTINGS)
@override_settings(CELERY_TASK_ALWAYS_EAGER=True)
@override_settings(CELERY_TASK_EAGER_PROPAGATES=True)
@mock.patch("promgen.util.post")
def test_filter(self, mock_post):
models.Filter.objects.create(sender=self.sender, name="severity", value="major")
self.assertEqual(models.Filter.objects.count(), 1, "Should be one filter")
# Our first sender will only allow critical messages
models.Filter.objects.create(sender=self.senderA, name="severity", value="critical")

# Our second sender allows critical and major
models.Filter.objects.create(sender=self.senderB, name="severity", value="critical")
models.Filter.objects.create(sender=self.senderB, name="severity", value="major")

self.assertEqual(models.Filter.objects.count(), 3, "Should be three filters")

response = self.client.post(
reverse("alert"), data=TEST_ALERT, content_type="application/json"
)
self.assertEqual(response.status_code, 202)

self.assertEqual(models.Alert.objects.count(), 1, "Alert should be queued")
self.assertEqual(mock_post.call_count, 0, "Alert should not send")
self.assertEqual(mock_post.call_count, 1, "One notification should be skipped")

0 comments on commit 95684ce

Please sign in to comment.