1
1
"""authentik administration overview"""
2
2
3
+ from socket import gethostname
4
+
3
5
from django .conf import settings
4
6
from drf_spectacular .utils import extend_schema , inline_serializer
5
- from rest_framework .fields import IntegerField
7
+ from packaging .version import parse
8
+ from rest_framework .fields import BooleanField , CharField
6
9
from rest_framework .request import Request
7
10
from rest_framework .response import Response
8
11
from rest_framework .views import APIView
9
12
13
+ from authentik import get_full_version
10
14
from authentik .rbac .permissions import HasPermission
11
15
from authentik .root .celery import CELERY_APP
12
16
@@ -16,11 +20,38 @@ class WorkerView(APIView):
16
20
17
21
permission_classes = [HasPermission ("authentik_rbac.view_system_info" )]
18
22
19
- @extend_schema (responses = inline_serializer ("Workers" , fields = {"count" : IntegerField ()}))
23
+ @extend_schema (
24
+ responses = inline_serializer (
25
+ "Worker" ,
26
+ fields = {
27
+ "worker_id" : CharField (),
28
+ "version" : CharField (),
29
+ "version_matching" : BooleanField (),
30
+ },
31
+ many = True ,
32
+ )
33
+ )
20
34
def get (self , request : Request ) -> Response :
21
35
"""Get currently connected worker count."""
22
- count = len (CELERY_APP .control .ping (timeout = 0.5 ))
36
+ raw : list [dict [str , dict ]] = CELERY_APP .control .ping (timeout = 0.5 )
37
+ our_version = parse (get_full_version ())
38
+ response = []
39
+ for worker in raw :
40
+ key = list (worker .keys ())[0 ]
41
+ version = worker [key ].get ("version" )
42
+ version_matching = False
43
+ if version :
44
+ version_matching = parse (version ) == our_version
45
+ response .append (
46
+ {"worker_id" : key , "version" : version , "version_matching" : version_matching }
47
+ )
23
48
# In debug we run with `task_always_eager`, so tasks are ran on the main process
24
49
if settings .DEBUG : # pragma: no cover
25
- count += 1
26
- return Response ({"count" : count })
50
+ response .append (
51
+ {
52
+ "worker_id" : f"authentik-debug@{ gethostname ()} " ,
53
+ "version" : get_full_version (),
54
+ "version_matching" : True ,
55
+ }
56
+ )
57
+ return Response (response )
0 commit comments