From f3c0ca1a59f8e0b2b70d0be4e82f52daa4bfccd4 Mon Sep 17 00:00:00 2001 From: Marc 'risson' Schmitt Date: Thu, 26 Jun 2025 15:54:17 +0200 Subject: [PATCH] fix api Signed-off-by: Marc 'risson' Schmitt --- authentik/lib/sync/api.py | 11 +++-------- authentik/lib/sync/outgoing/api.py | 14 +++++++------- authentik/sources/kerberos/api/source.py | 14 +++++++------- authentik/sources/ldap/api.py | 14 +++++++------- schema.yml | 9 +-------- 5 files changed, 25 insertions(+), 37 deletions(-) diff --git a/authentik/lib/sync/api.py b/authentik/lib/sync/api.py index f96ca69081..b4343bc64d 100644 --- a/authentik/lib/sync/api.py +++ b/authentik/lib/sync/api.py @@ -7,11 +7,6 @@ from authentik.tasks.models import TaskStatus class SyncStatusSerializer(PassiveSerializer): """Provider/source sync status""" - is_running = BooleanField(read_only=True, default=False) - last_successful_sync = DateTimeField(read_only=True, required=False, default=None) - last_sync_status = ChoiceField( - read_only=True, - required=False, - default=None, - choices=TaskStatus.choices, - ) + is_running = BooleanField() + last_successful_sync = DateTimeField(required=False) + last_sync_status = ChoiceField(required=False, choices=TaskStatus.choices) diff --git a/authentik/lib/sync/outgoing/api.py b/authentik/lib/sync/outgoing/api.py index 8b99980625..462aeb92f3 100644 --- a/authentik/lib/sync/outgoing/api.py +++ b/authentik/lib/sync/outgoing/api.py @@ -52,15 +52,19 @@ class OutgoingSyncProviderStatusMixin: """Get provider's sync status""" provider: OutgoingSyncProvider = self.get_object() + status = {} + + with provider.sync_lock as lock_acquired: + # If we could not acquire the lock, it means a task is using it, and thus is running + status["is_running"] = not lock_acquired + sync_schedule = None for schedule in provider.schedules.all(): if schedule.actor_name == self.sync_task.actor_name: sync_schedule = schedule if not sync_schedule: - return Response(SyncStatusSerializer({}).data) - - status = {} + return Response(SyncStatusSerializer(status).data) last_task: Task = ( sync_schedule.tasks.exclude( @@ -80,10 +84,6 @@ class OutgoingSyncProviderStatusMixin: if last_successful_task: status["last_successful_sync"] = last_successful_task.mtime - with provider.sync_lock as lock_acquired: - # If we could not acquire the lock, it means a task is using it, and thus is running - status["is_running"] = not lock_acquired - return Response(SyncStatusSerializer(status).data) @extend_schema( diff --git a/authentik/sources/kerberos/api/source.py b/authentik/sources/kerberos/api/source.py index 7aaa8ac890..9e9e6172ce 100644 --- a/authentik/sources/kerberos/api/source.py +++ b/authentik/sources/kerberos/api/source.py @@ -93,15 +93,19 @@ class KerberosSourceViewSet(UsedByMixin, ModelViewSet): """Get provider's sync status""" source: KerberosSource = self.get_object() + status = {} + + with source.sync_lock as lock_acquired: + # If we could not acquire the lock, it means a task is using it, and thus is running + status["is_running"] = not lock_acquired + sync_schedule = None for schedule in source.schedules.all(): if schedule.actor_name == kerberos_sync.actor_name: sync_schedule = schedule if not sync_schedule: - return Response(SyncStatusSerializer({}).data) - - status = {} + return Response(SyncStatusSerializer(status).data) last_task: Task = ( sync_schedule.tasks.exclude( @@ -121,8 +125,4 @@ class KerberosSourceViewSet(UsedByMixin, ModelViewSet): if last_successful_task: status["last_successful_sync"] = last_successful_task.mtime - with source.sync_lock as lock_acquired: - # If we could not acquire the lock, it means a task is using it, and thus is running - status["is_running"] = not lock_acquired - return Response(SyncStatusSerializer(status).data) diff --git a/authentik/sources/ldap/api.py b/authentik/sources/ldap/api.py index 72a7f3ce2f..212b63318f 100644 --- a/authentik/sources/ldap/api.py +++ b/authentik/sources/ldap/api.py @@ -168,15 +168,19 @@ class LDAPSourceViewSet(UsedByMixin, ModelViewSet): """Get provider's sync status""" source: LDAPSource = self.get_object() + status = {} + + with source.sync_lock as lock_acquired: + # If we could not acquire the lock, it means a task is using it, and thus is running + status["is_running"] = not lock_acquired + sync_schedule = None for schedule in source.schedules.all(): if schedule.actor_name == ldap_sync.actor_name: sync_schedule = schedule if not sync_schedule: - return Response(SyncStatusSerializer({}).data) - - status = {} + return Response(SyncStatusSerializer(status).data) last_task: Task = ( sync_schedule.tasks.exclude( @@ -196,10 +200,6 @@ class LDAPSourceViewSet(UsedByMixin, ModelViewSet): if last_successful_task: status["last_successful_sync"] = last_successful_task.mtime - with source.sync_lock as lock_acquired: - # If we could not acquire the lock, it means a task is using it, and thus is running - status["is_running"] = not lock_acquired - return Response(SyncStatusSerializer(status).data) @extend_schema( diff --git a/schema.yml b/schema.yml index f62c1e208b..44d11fd39c 100644 --- a/schema.yml +++ b/schema.yml @@ -60390,20 +60390,13 @@ components: properties: is_running: type: boolean - readOnly: true - default: false last_successful_sync: type: string format: date-time - readOnly: true last_sync_status: - allOf: - - $ref: '#/components/schemas/TaskAggregatedStatusEnum' - readOnly: true + $ref: '#/components/schemas/TaskAggregatedStatusEnum' required: - is_running - - last_successful_sync - - last_sync_status SystemInfo: type: object description: Get system information.