Skip to content

Commit bd8b0d8

Browse files
committed
Add v2 APIs for URL
We have added several APIs for retrieving URL data.
1 parent cbb0345 commit bd8b0d8

12 files changed

+170
-1
lines changed

promgen/filters.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import django_filters
22
from django.contrib.contenttypes.models import ContentType
33

4+
from promgen import models
5+
46

57
class ShardFilter(django_filters.rest_framework.FilterSet):
68
name = django_filters.CharFilter(field_name="name", lookup_expr="contains")
@@ -176,3 +178,16 @@ class ExporterFilter(django_filters.rest_framework.FilterSet):
176178
field_name="enabled",
177179
help_text="Filter by enabled status (true or false). Example: enabled=true",
178180
)
181+
182+
183+
class URLFilter(django_filters.rest_framework.FilterSet):
184+
project = django_filters.CharFilter(
185+
field_name="project__name",
186+
lookup_expr="contains",
187+
help_text="Filter by project name containing a specific substring. Example: project=Example Project",
188+
)
189+
probe = django_filters.ChoiceFilter(
190+
field_name="probe__module",
191+
choices=models.Probe.objects.values_list("module", "description").distinct(),
192+
help_text="Filter by exact probe scheme. Example: probe=http_2xx",
193+
)

promgen/fixtures/testcases.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,22 @@
9898
pk: 1
9999
fields:
100100
module: fixture_test
101+
- model: promgen.probe
102+
pk: 2
103+
fields:
104+
module: http_2xx
101105
- model: promgen.url
102106
pk: 1
103107
fields:
104108
project: 1
105109
probe: 1
106110
url: probe.example.com
111+
- model: promgen.url
112+
pk: 2
113+
fields:
114+
project: 2
115+
probe: 2
116+
url: probe-2.example.com
107117
- model: promgen.audit
108118
pk: 1
109119
fields:

promgen/rest_v2.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,19 @@ class ExporterViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets
272272
lookup_value_regex = "[^/]+"
273273
lookup_field = "id"
274274
pagination_class = PromgenPagination
275+
276+
277+
@extend_schema_view(
278+
list=extend_schema(summary="List URLs", description="Retrieve a list of all URLs."),
279+
retrieve=extend_schema(
280+
summary="Retrieve URL", description="Retrieve detailed information about a specific URL."
281+
),
282+
)
283+
@extend_schema(tags=["URL"])
284+
class URLViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
285+
queryset = models.URL.objects.all()
286+
filterset_class = filters.URLFilter
287+
serializer_class = serializers.URLSerializer
288+
lookup_value_regex = "[^/]+"
289+
lookup_field = "id"
290+
pagination_class = PromgenPagination

promgen/serializers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,12 @@ class ExporterSerializer(serializers.ModelSerializer):
240240
class Meta:
241241
model = models.Exporter
242242
fields = "__all__"
243+
244+
245+
class URLSerializer(serializers.ModelSerializer):
246+
project = serializers.ReadOnlyField(source="project.name")
247+
probe = serializers.ReadOnlyField(source="probe.module")
248+
249+
class Meta:
250+
model = models.URL
251+
fields = "__all__"
Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
[
2+
{
3+
"labels": {
4+
"__param_module": "http_2xx",
5+
"__shard": "test-shard",
6+
"job": "http_2xx",
7+
"project": "another-project",
8+
"service": "test-service"
9+
},
10+
"targets": [
11+
"probe-2.example.com"
12+
]
13+
},
214
{
315
"labels": {
416
"__param_module": "fixture_test",
@@ -7,6 +19,8 @@
719
"project": "test-project",
820
"service": "test-service"
921
},
10-
"targets": ["probe.example.com"]
22+
"targets": [
23+
"probe.example.com"
24+
]
1125
}
1226
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"count": 2,
3+
"next": null,
4+
"previous": null,
5+
"results": [
6+
{
7+
"id": 2,
8+
"probe": "http_2xx",
9+
"project": "another-project",
10+
"url": "probe-2.example.com"
11+
},
12+
{
13+
"id": 1,
14+
"probe": "fixture_test",
15+
"project": "test-project",
16+
"url": "probe.example.com"
17+
}
18+
]
19+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"id": 1,
3+
"probe": "fixture_test",
4+
"project": "test-project",
5+
"url": "probe.example.com"
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"count": 1,
3+
"next": null,
4+
"previous": null,
5+
"results": [
6+
{
7+
"id": 1,
8+
"probe": "fixture_test",
9+
"project": "test-project",
10+
"url": "probe.example.com"
11+
}
12+
]
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"count": 1,
3+
"next": null,
4+
"previous": null,
5+
"results": [
6+
{
7+
"id": 1,
8+
"probe": "fixture_test",
9+
"project": "test-project",
10+
"url": "probe.example.com"
11+
}
12+
]
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"count": 2,
3+
"next": null,
4+
"previous": "http://testserver/rest/v2/urls/?page_size=1",
5+
"results": [
6+
{
7+
"id": 1,
8+
"probe": "fixture_test",
9+
"project": "test-project",
10+
"url": "probe.example.com"
11+
}
12+
]
13+
}

promgen/tests/test_rest.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,3 +848,43 @@ def test_rest_exporter(self):
848848
# Check retrieving exporters with a non-existent "id" returns 404 Not Found
849849
response = self.client.get(reverse("api-v2:exporter-detail", args=[-1]))
850850
self.assertEqual(response.status_code, 404)
851+
852+
@override_settings(PROMGEN=tests.SETTINGS)
853+
def test_rest_url(self):
854+
# Check retrieving all urls
855+
expected = tests.Data("examples", "rest.url.default.json").json()
856+
response = self.client.get(reverse("api-v2:url-list"))
857+
self.assertEqual(response.status_code, 200)
858+
self.assertEqual(response.json(), expected)
859+
860+
# Check retrieving paginated urls
861+
expected = tests.Data("examples", "rest.url.paginated.json").json()
862+
response = self.client.get(reverse("api-v2:url-list"), {"page_number": 2, "page_size": 1})
863+
self.assertEqual(response.status_code, 200)
864+
self.assertEqual(response.json(), expected)
865+
866+
# Check retrieving urls whose "probe" is "fixture_test"
867+
expected = tests.Data("examples", "rest.url.filter_by_probe.json").json()
868+
response = self.client.get(reverse("api-v2:url-list"), {"probe": "fixture_test"})
869+
self.assertEqual(response.status_code, 200)
870+
self.assertEqual(response.json(), expected)
871+
872+
# Check retrieving urls with a non-existent "probe" returns 400 Bad Request
873+
response = self.client.get(reverse("api-v2:url-list"), {"probe": "non-existent"})
874+
self.assertEqual(response.status_code, 400)
875+
876+
# Check retrieving urls whose "project" contains "test"
877+
expected = tests.Data("examples", "rest.url.filter_by_project.json").json()
878+
response = self.client.get(reverse("api-v2:url-list"), {"project": "test"})
879+
self.assertEqual(response.status_code, 200)
880+
self.assertEqual(response.json(), expected)
881+
882+
# Check retrieving urls with a non-existent "project" returns an empty list
883+
response = self.client.get(reverse("api-v2:url-list"), {"project": "non-existent"})
884+
self.assertEqual(response.status_code, 200)
885+
886+
# Check retrieving urls whose "id" is "1"
887+
expected = tests.Data("examples", "rest.url.detail.json").json()
888+
response = self.client.get(reverse("api-v2:url-detail", args=[1]))
889+
self.assertEqual(response.status_code, 200)
890+
self.assertEqual(response.json(), expected)

promgen/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
v2_router.register("rules", rest_v2.RuleViewSet)
4040
v2_router.register("farms", rest_v2.FarmViewSet)
4141
v2_router.register("exporters", rest_v2.ExporterViewSet)
42+
v2_router.register("urls", rest_v2.URLViewSet)
4243

4344
urlpatterns = [
4445
path("admin/", admin.site.urls),

0 commit comments

Comments
 (0)