Compare commits

...

2 Commits

Author SHA1 Message Date
563c274d70 lint-fix
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2024-12-18 12:48:08 +01:00
a9fee67b44 blueprints: gate apply and discovery behing pg lock
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2024-12-18 12:36:41 +01:00

View File

@ -5,8 +5,9 @@ from hashlib import sha512
from pathlib import Path from pathlib import Path
from sys import platform from sys import platform
import pglock
from dacite.core import from_dict from dacite.core import from_dict
from django.db import DatabaseError, InternalError, ProgrammingError from django.db import DatabaseError, InternalError, ProgrammingError, connection
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -152,6 +153,18 @@ def blueprints_find() -> list[BlueprintFile]:
@prefill_task @prefill_task
def blueprints_discovery(self: SystemTask, path: str | None = None): def blueprints_discovery(self: SystemTask, path: str | None = None):
"""Find blueprints and check if they need to be created in the database""" """Find blueprints and check if they need to be created in the database"""
with pglock.advisory(
lock_id=f"goauthentik.io/{connection.schema_name}/blueprints/discovery",
timeout=0,
side_effect=pglock.Return,
) as lock_acquired:
if not lock_acquired:
LOGGER.debug("Not running blueprint discovery, lock was not acquired")
self.set_status(
TaskStatus.SUCCESSFUL,
_("Blueprint discovery lock could not be acquired. Skipping discovery."),
)
return
count = 0 count = 0
for blueprint in blueprints_find(): for blueprint in blueprints_find():
if path and blueprint.path != path: if path and blueprint.path != path:
@ -197,6 +210,18 @@ def check_blueprint_v1_file(blueprint: BlueprintFile):
def apply_blueprint(self: SystemTask, instance_pk: str): def apply_blueprint(self: SystemTask, instance_pk: str):
"""Apply single blueprint""" """Apply single blueprint"""
self.save_on_success = False self.save_on_success = False
with pglock.advisory(
lock_id=f"goauthentik.io/{connection.schema_name}/blueprints/apply/{instance_pk}",
timeout=0,
side_effect=pglock.Return,
) as lock_acquired:
if not lock_acquired:
LOGGER.debug("Not running blueprint discovery, lock was not acquired")
self.set_status(
TaskStatus.SUCCESSFUL,
_("Blueprint apply lock could not be acquired. Skipping apply."),
)
return
instance: BlueprintInstance | None = None instance: BlueprintInstance | None = None
try: try:
instance: BlueprintInstance = BlueprintInstance.objects.filter(pk=instance_pk).first() instance: BlueprintInstance = BlueprintInstance.objects.filter(pk=instance_pk).first()