Skip to content

Commit e623409

Browse files
committed
Add v2 APIs for Shard
We have added several APIs for retrieving Shard data and the list of projects for each shard.
1 parent 6d2ffcd commit e623409

10 files changed

+180
-0
lines changed

promgen/fixtures/testcases.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@
3838
url: http://prometheus.example.com
3939
proxy: true
4040
enabled: true
41+
- model: promgen.shard
42+
pk: 2
43+
fields:
44+
name: other-shard
45+
url: http://prometheus-002.example.com
46+
proxy: false
47+
enabled: false
4148
- model: promgen.service
4249
pk: 1
4350
fields:

promgen/rest_v2.py

+34
Original file line numberDiff line numberDiff line change
@@ -697,3 +697,37 @@ def register_rule(self, request, id):
697697

698698
rule, _ = models.Rule.objects.get_or_create(**attributes)
699699
return Response(serializers.RuleSerializer(service.rule_set, many=True).data)
700+
701+
702+
@extend_schema_view(
703+
list=extend_schema(summary="List Shards", description="Retrieve a list of all shards."),
704+
retrieve=extend_schema(
705+
summary="Retrieve Shard",
706+
description="Retrieve detailed information about a specific shard.",
707+
),
708+
)
709+
@extend_schema(tags=["Shard"])
710+
class ShardViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
711+
queryset = models.Shard.objects.all()
712+
filterset_class = filters.ShardFilter
713+
serializer_class = serializers.ShardRetrieveSerializer
714+
lookup_field = "id"
715+
pagination_class = PromgenPagination
716+
717+
@extend_schema(
718+
summary="List Projects in Shard",
719+
description="Retrieve all projects associated with the specified shard.",
720+
parameters=[
721+
OpenApiParameter(name="page_number", required=False, type=int),
722+
OpenApiParameter(name="page_size", required=False, type=int),
723+
],
724+
responses=serializers.ProjectRetrieveSerializer(many=True),
725+
)
726+
@action(detail=True, methods=["get"], filterset_class=None)
727+
def projects(self, request, id):
728+
shard = self.get_object()
729+
projects = shard.project_set.all()
730+
page = self.paginate_queryset(projects)
731+
return self.get_paginated_response(
732+
serializers.ProjectRetrieveSerializer(page, many=True).data
733+
)

promgen/serializers.py

+6
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,9 @@ class ServiceUpdateSerializer(serializers.ModelSerializer):
390390
class Meta:
391391
model = models.Service
392392
fields = "__all__"
393+
394+
395+
class ShardRetrieveSerializer(serializers.ModelSerializer):
396+
class Meta:
397+
model = models.Shard
398+
exclude = ("authorization",)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"count": 2,
3+
"next": null,
4+
"previous": null,
5+
"results": [
6+
{
7+
"enabled": false,
8+
"id": 2,
9+
"name": "other-shard",
10+
"proxy": false,
11+
"samples": 5000000,
12+
"targets": 10000,
13+
"url": "http://prometheus-002.example.com"
14+
},
15+
{
16+
"enabled": true,
17+
"id": 1,
18+
"name": "test-shard",
19+
"proxy": true,
20+
"samples": 5000000,
21+
"targets": 10000,
22+
"url": "http://prometheus.example.com"
23+
}
24+
]
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"enabled": true,
3+
"id": 1,
4+
"name": "test-shard",
5+
"proxy": true,
6+
"samples": 5000000,
7+
"targets": 10000,
8+
"url": "http://prometheus.example.com"
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"count": 1,
3+
"next": null,
4+
"previous": null,
5+
"results": [
6+
{
7+
"enabled": true,
8+
"id": 1,
9+
"name": "test-shard",
10+
"proxy": true,
11+
"samples": 5000000,
12+
"targets": 10000,
13+
"url": "http://prometheus.example.com"
14+
}
15+
]
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"count": 2,
3+
"next": "http://testserver/rest/v2/shards/?page_number=2&page_size=1",
4+
"previous": null,
5+
"results": [
6+
{
7+
"enabled": false,
8+
"id": 2,
9+
"name": "other-shard",
10+
"proxy": false,
11+
"samples": 5000000,
12+
"targets": 10000,
13+
"url": "http://prometheus-002.example.com"
14+
}
15+
]
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"count": 2,
3+
"next": null,
4+
"previous": null,
5+
"results": [
6+
{
7+
"description": "",
8+
"farm": "test-farm",
9+
"id": 2,
10+
"name": "another-project",
11+
"owner": "demo",
12+
"service": "other-service",
13+
"shard": "test-shard"
14+
},
15+
{
16+
"description": "",
17+
"farm": "test-farm",
18+
"id": 1,
19+
"name": "test-project",
20+
"owner": "admin",
21+
"service": "test-service",
22+
"shard": "test-shard"
23+
}
24+
]
25+
}

promgen/tests/test_rest.py

+41
Original file line numberDiff line numberDiff line change
@@ -1756,3 +1756,44 @@ def test_rest_service(self):
17561756
HTTP_AUTHORIZATION=f"Token {token}",
17571757
)
17581758
self.assertEqual(response.status_code, 204)
1759+
1760+
@override_settings(PROMGEN=tests.SETTINGS)
1761+
def test_rest_shard(self):
1762+
# Check retrieving all shards
1763+
expected = tests.Data("examples", "rest.shard.default.json").json()
1764+
response = self.client.get(reverse("api-v2:shard-list"))
1765+
self.assertEqual(response.status_code, 200)
1766+
self.assertEqual(response.json(), expected)
1767+
1768+
# Check retrieving paginated shards
1769+
expected = tests.Data("examples", "rest.shard.paginated.json").json()
1770+
response = self.client.get(reverse("api-v2:shard-list"), {"page_number": 1, "page_size": 1})
1771+
self.assertEqual(response.status_code, 200)
1772+
self.assertEqual(response.json(), expected)
1773+
1774+
# Check retrieving shards whose "name" contains "test"
1775+
expected = tests.Data("examples", "rest.shard.filter_by_name.json").json()
1776+
response = self.client.get(reverse("api-v2:shard-list"), {"name": "test"})
1777+
self.assertEqual(response.status_code, 200)
1778+
self.assertEqual(response.json(), expected)
1779+
1780+
# Check retrieving shards with a non-existent "name" returns an empty list
1781+
response = self.client.get(reverse("api-v2:shard-list"), {"name": "non-existent"})
1782+
self.assertEqual(response.status_code, 200)
1783+
self.assertEqual(response.data["count"], 0)
1784+
1785+
# Check retrieving shards whose "id" is "1"
1786+
expected = tests.Data("examples", "rest.shard.detail.json").json()
1787+
response = self.client.get(reverse("api-v2:shard-detail", args=[1]))
1788+
self.assertEqual(response.status_code, 200)
1789+
self.assertEqual(response.json(), expected)
1790+
1791+
# Check retrieving shards with a non-existent "id" returns 404 Not Found
1792+
response = self.client.get(reverse("api-v2:shard-detail", args=[-1]))
1793+
self.assertEqual(response.status_code, 404)
1794+
1795+
# Check retrieving list of projects for a shard
1796+
expected = tests.Data("examples", "rest.shard.projects.json").json()
1797+
response = self.client.get(reverse("api-v2:shard-projects", args=[1]))
1798+
self.assertEqual(response.status_code, 200)
1799+
self.assertEqual(response.json(), expected)

promgen/urls.py

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
v2_router.register("urls", rest_v2.URLViewSet)
4343
v2_router.register("projects", rest_v2.ProjectViewSet)
4444
v2_router.register("services", rest_v2.ServiceViewSet)
45+
v2_router.register("shards", rest_v2.ShardViewSet)
4546

4647
urlpatterns = [
4748
path("admin/", admin.site.urls),

0 commit comments

Comments
 (0)