From 1997d41e5bd2e253842ba504aadba9187bab8a59 Mon Sep 17 00:00:00 2001 From: Vadim Stepanov Date: Wed, 8 Nov 2023 09:18:15 +0000 Subject: [PATCH] Add labels to alert group API responses (#3292) # What this PR does Adds a field to the internal API alert group serializer to display labels. ## Which issue(s) this PR fixes Related to https://github.com/grafana/oncall-private/issues/2179 ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required) --- engine/apps/api/serializers/alert_group.py | 16 ++++++++++++++++ engine/apps/api/tests/test_alert_group.py | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/engine/apps/api/serializers/alert_group.py b/engine/apps/api/serializers/alert_group.py index 1e8371ea..3aac2cda 100644 --- a/engine/apps/api/serializers/alert_group.py +++ b/engine/apps/api/serializers/alert_group.py @@ -56,6 +56,19 @@ class AlertGroupFieldsCacheSerializerMixin(AlertsFieldCacheBusterMixin): return field +class AlertGroupLabelSerializer(serializers.Serializer): + class KeySerializer(serializers.Serializer): + id = serializers.CharField(source="key_name") + name = serializers.CharField(source="key_name") + + class ValueSerializer(serializers.Serializer): + id = serializers.CharField(source="value_name") + name = serializers.CharField(source="value_name") + + key = KeySerializer(source="*") + value = ValueSerializer(source="*") + + class ShortAlertGroupSerializer(AlertGroupFieldsCacheSerializerMixin, serializers.ModelSerializer): pk = serializers.CharField(read_only=True, source="public_primary_key") alert_receive_channel = FastAlertReceiveChannelSerializer(source="channel") @@ -105,6 +118,8 @@ class AlertGroupListSerializer(EagerLoadingMixin, AlertGroupFieldsCacheSerialize render_for_web = serializers.SerializerMethodField() render_for_classic_markdown = serializers.SerializerMethodField() + labels = AlertGroupLabelSerializer(many=True, read_only=True) + PREFETCH_RELATED = [ "dependent_alert_groups", "log_records__author", @@ -150,6 +165,7 @@ class AlertGroupListSerializer(EagerLoadingMixin, AlertGroupFieldsCacheSerialize "declare_incident_link", "team", "grafana_incident_id", + "labels", ] @extend_schema_field( diff --git a/engine/apps/api/tests/test_alert_group.py b/engine/apps/api/tests/test_alert_group.py index 54124c15..5ff8cc81 100644 --- a/engine/apps/api/tests/test_alert_group.py +++ b/engine/apps/api/tests/test_alert_group.py @@ -2121,3 +2121,24 @@ def test_delete(mock_delete_alert_group, make_user_auth_headers, alert_group_int url = reverse("api-internal:alertgroup-detail", kwargs={"pk": "potato"}) response = client.delete(url, **auth_headers) assert response.status_code == status.HTTP_404_NOT_FOUND + + +@pytest.mark.django_db +def test_alert_group_list_labels( + alert_group_internal_api_setup, + make_alert_group_label_association, + make_alert_receive_channel, + make_alert_group, + make_user_auth_headers, +): + user, token, alert_groups = alert_group_internal_api_setup + make_alert_group_label_association(user.organization, alert_groups[0], key_name="a", value_name="b") + + client = APIClient() + url = reverse("api-internal:alertgroup-list") + response = client.get(url, **make_user_auth_headers(user, token)) + + assert response.status_code == status.HTTP_200_OK + assert response.json()["results"][-1]["labels"] == [ + {"key": {"id": "a", "name": "a"}, "value": {"id": "b", "name": "b"}} + ]