authentik.tasks.api.workers

 1from django.utils.timezone import now, timedelta
 2from drf_spectacular.utils import extend_schema, inline_serializer
 3from packaging.version import parse
 4from rest_framework.fields import BooleanField, CharField
 5from rest_framework.request import Request
 6from rest_framework.response import Response
 7from rest_framework.views import APIView
 8
 9from authentik import authentik_full_version
10from authentik.rbac.permissions import HasPermission
11from authentik.tasks.models import WorkerStatus
12
13
14class WorkerView(APIView):
15    """Get currently connected worker count."""
16
17    permission_classes = [HasPermission("authentik_rbac.view_system_info")]
18
19    @extend_schema(
20        responses=inline_serializer(
21            "Worker",
22            fields={
23                "worker_id": CharField(),
24                "version": CharField(),
25                "version_matching": BooleanField(),
26            },
27            many=True,
28        )
29    )
30    def get(self, request: Request) -> Response:
31        response = []
32        our_version = parse(authentik_full_version())
33        for status in WorkerStatus.objects.filter(last_seen__gt=now() - timedelta(seconds=45)):
34            version_matching = parse(status.version) == our_version
35            response.append(
36                {
37                    "worker_id": f"{status.pk}@{status.hostname}",
38                    "version": status.version,
39                    "version_matching": version_matching,
40                }
41            )
42        return Response(response)
class WorkerView(rest_framework.views.APIView):
15class WorkerView(APIView):
16    """Get currently connected worker count."""
17
18    permission_classes = [HasPermission("authentik_rbac.view_system_info")]
19
20    @extend_schema(
21        responses=inline_serializer(
22            "Worker",
23            fields={
24                "worker_id": CharField(),
25                "version": CharField(),
26                "version_matching": BooleanField(),
27            },
28            many=True,
29        )
30    )
31    def get(self, request: Request) -> Response:
32        response = []
33        our_version = parse(authentik_full_version())
34        for status in WorkerStatus.objects.filter(last_seen__gt=now() - timedelta(seconds=45)):
35            version_matching = parse(status.version) == our_version
36            response.append(
37                {
38                    "worker_id": f"{status.pk}@{status.hostname}",
39                    "version": status.version,
40                    "version_matching": version_matching,
41                }
42            )
43        return Response(response)

Get currently connected worker count.

permission_classes = [<class 'authentik.rbac.permissions.HasPermission.<locals>.checker'>]
@extend_schema(responses=inline_serializer('Worker', fields={'worker_id': CharField(), 'version': CharField(), 'version_matching': BooleanField()}, many=True))
def get( self, request: rest_framework.request.Request) -> rest_framework.response.Response:
20    @extend_schema(
21        responses=inline_serializer(
22            "Worker",
23            fields={
24                "worker_id": CharField(),
25                "version": CharField(),
26                "version_matching": BooleanField(),
27            },
28            many=True,
29        )
30    )
31    def get(self, request: Request) -> Response:
32        response = []
33        our_version = parse(authentik_full_version())
34        for status in WorkerStatus.objects.filter(last_seen__gt=now() - timedelta(seconds=45)):
35            version_matching = parse(status.version) == our_version
36            response.append(
37                {
38                    "worker_id": f"{status.pk}@{status.hostname}",
39                    "version": status.version,
40                    "version_matching": version_matching,
41                }
42            )
43        return Response(response)