*: fix remaining old cache keys
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
parent
d785edbbe3
commit
c158ef80db
|
@ -23,7 +23,7 @@ from authentik.events.utils import sanitize_dict
|
||||||
from authentik.flows.api.flows_diagram import FlowDiagram, FlowDiagramSerializer
|
from authentik.flows.api.flows_diagram import FlowDiagram, FlowDiagramSerializer
|
||||||
from authentik.flows.exceptions import FlowNonApplicableException
|
from authentik.flows.exceptions import FlowNonApplicableException
|
||||||
from authentik.flows.models import Flow
|
from authentik.flows.models import Flow
|
||||||
from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER, FlowPlanner, cache_key
|
from authentik.flows.planner import CACHE_PREFIX, PLAN_CONTEXT_PENDING_USER, FlowPlanner, cache_key
|
||||||
from authentik.flows.views.executor import SESSION_KEY_HISTORY, SESSION_KEY_PLAN
|
from authentik.flows.views.executor import SESSION_KEY_HISTORY, SESSION_KEY_PLAN
|
||||||
from authentik.lib.utils.file import (
|
from authentik.lib.utils.file import (
|
||||||
FilePathSerializer,
|
FilePathSerializer,
|
||||||
|
@ -121,7 +121,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet):
|
||||||
@action(detail=False, pagination_class=None, filter_backends=[])
|
@action(detail=False, pagination_class=None, filter_backends=[])
|
||||||
def cache_info(self, request: Request) -> Response:
|
def cache_info(self, request: Request) -> Response:
|
||||||
"""Info about cached flows"""
|
"""Info about cached flows"""
|
||||||
return Response(data={"count": len(cache.keys("flow_*"))})
|
return Response(data={"count": len(cache.keys(f"{CACHE_PREFIX}*"))})
|
||||||
|
|
||||||
@permission_required(None, ["authentik_flows.clear_flow_cache"])
|
@permission_required(None, ["authentik_flows.clear_flow_cache"])
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
|
@ -134,7 +134,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet):
|
||||||
@action(detail=False, methods=["POST"])
|
@action(detail=False, methods=["POST"])
|
||||||
def cache_clear(self, request: Request) -> Response:
|
def cache_clear(self, request: Request) -> Response:
|
||||||
"""Clear flow cache"""
|
"""Clear flow cache"""
|
||||||
keys = cache.keys("flow_*")
|
keys = cache.keys(f"{CACHE_PREFIX}*")
|
||||||
cache.delete_many(keys)
|
cache.delete_many(keys)
|
||||||
LOGGER.debug("Cleared flow cache", keys=len(keys))
|
LOGGER.debug("Cleared flow cache", keys=len(keys))
|
||||||
return Response(status=204)
|
return Response(status=204)
|
||||||
|
|
|
@ -27,11 +27,12 @@ PLAN_CONTEXT_SOURCE = "source"
|
||||||
# was restored.
|
# was restored.
|
||||||
PLAN_CONTEXT_IS_RESTORED = "is_restored"
|
PLAN_CONTEXT_IS_RESTORED = "is_restored"
|
||||||
CACHE_TIMEOUT = int(CONFIG.y("redis.cache_timeout_flows"))
|
CACHE_TIMEOUT = int(CONFIG.y("redis.cache_timeout_flows"))
|
||||||
|
CACHE_PREFIX = "goauthentik.io/flows/planner/"
|
||||||
|
|
||||||
|
|
||||||
def cache_key(flow: Flow, user: Optional[User] = None) -> str:
|
def cache_key(flow: Flow, user: Optional[User] = None) -> str:
|
||||||
"""Generate Cache key for flow"""
|
"""Generate Cache key for flow"""
|
||||||
prefix = f"goauthentik.io/flows/planner/{flow.pk}"
|
prefix = CACHE_PREFIX + str(flow.pk)
|
||||||
if user:
|
if user:
|
||||||
prefix += f"#{user.pk}"
|
prefix += f"#{user.pk}"
|
||||||
return prefix
|
return prefix
|
||||||
|
@ -141,6 +142,7 @@ class FlowPlanner:
|
||||||
# First off, check the flow's direct policy bindings
|
# First off, check the flow's direct policy bindings
|
||||||
# to make sure the user even has access to the flow
|
# to make sure the user even has access to the flow
|
||||||
engine = PolicyEngine(self.flow, user, request)
|
engine = PolicyEngine(self.flow, user, request)
|
||||||
|
engine.use_cache = self.use_cache
|
||||||
if default_context:
|
if default_context:
|
||||||
span.set_data("default_context", cleanse_dict(default_context))
|
span.set_data("default_context", cleanse_dict(default_context))
|
||||||
engine.request.context.update(default_context)
|
engine.request.context.update(default_context)
|
||||||
|
@ -206,6 +208,7 @@ class FlowPlanner:
|
||||||
stage=stage,
|
stage=stage,
|
||||||
)
|
)
|
||||||
engine = PolicyEngine(binding, user, request)
|
engine = PolicyEngine(binding, user, request)
|
||||||
|
engine.use_cache = self.use_cache
|
||||||
engine.request.context["flow_plan"] = plan
|
engine.request.context["flow_plan"] = plan
|
||||||
engine.request.context.update(plan.context)
|
engine.request.context.update(plan.context)
|
||||||
engine.build()
|
engine.build()
|
||||||
|
|
|
@ -5,6 +5,7 @@ from django.dispatch import receiver
|
||||||
from structlog.stdlib import get_logger
|
from structlog.stdlib import get_logger
|
||||||
|
|
||||||
from authentik.flows.apps import GAUGE_FLOWS_CACHED
|
from authentik.flows.apps import GAUGE_FLOWS_CACHED
|
||||||
|
from authentik.flows.planner import CACHE_PREFIX
|
||||||
from authentik.root.monitoring import monitoring_set
|
from authentik.root.monitoring import monitoring_set
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
@ -21,7 +22,7 @@ def delete_cache_prefix(prefix: str) -> int:
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def monitoring_set_flows(sender, **kwargs):
|
def monitoring_set_flows(sender, **kwargs):
|
||||||
"""set flow gauges"""
|
"""set flow gauges"""
|
||||||
GAUGE_FLOWS_CACHED.set(len(cache.keys("flow_*") or []))
|
GAUGE_FLOWS_CACHED.set(len(cache.keys(f"{CACHE_PREFIX}*") or []))
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save)
|
@receiver(post_save)
|
||||||
|
|
|
@ -44,6 +44,7 @@ from authentik.flows.models import (
|
||||||
Stage,
|
Stage,
|
||||||
)
|
)
|
||||||
from authentik.flows.planner import (
|
from authentik.flows.planner import (
|
||||||
|
CACHE_PREFIX,
|
||||||
PLAN_CONTEXT_IS_RESTORED,
|
PLAN_CONTEXT_IS_RESTORED,
|
||||||
PLAN_CONTEXT_PENDING_USER,
|
PLAN_CONTEXT_PENDING_USER,
|
||||||
PLAN_CONTEXT_REDIRECT,
|
PLAN_CONTEXT_REDIRECT,
|
||||||
|
@ -216,7 +217,7 @@ class FlowExecutorView(APIView):
|
||||||
self._logger.warning(
|
self._logger.warning(
|
||||||
"f(exec): found incompatible flow plan, invalidating run", exc=exc
|
"f(exec): found incompatible flow plan, invalidating run", exc=exc
|
||||||
)
|
)
|
||||||
keys = cache.keys("flow_*")
|
keys = cache.keys(f"{CACHE_PREFIX}*")
|
||||||
cache.delete_many(keys)
|
cache.delete_many(keys)
|
||||||
return self.stage_invalid()
|
return self.stage_invalid()
|
||||||
if not next_binding:
|
if not next_binding:
|
||||||
|
@ -351,7 +352,7 @@ class FlowExecutorView(APIView):
|
||||||
# from the cache. If there are errors, just delete all cached flows
|
# from the cache. If there are errors, just delete all cached flows
|
||||||
_ = plan.has_stages
|
_ = plan.has_stages
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception: # pylint: disable=broad-except
|
||||||
keys = cache.keys("flow_*")
|
keys = cache.keys(f"{CACHE_PREFIX}*")
|
||||||
cache.delete_many(keys)
|
cache.delete_many(keys)
|
||||||
return self._initiate_plan()
|
return self._initiate_plan()
|
||||||
return plan
|
return plan
|
||||||
|
|
|
@ -21,7 +21,7 @@ from authentik.lib.utils.reflection import all_subclasses
|
||||||
from authentik.policies.api.exec import PolicyTestResultSerializer, PolicyTestSerializer
|
from authentik.policies.api.exec import PolicyTestResultSerializer, PolicyTestSerializer
|
||||||
from authentik.policies.models import Policy, PolicyBinding
|
from authentik.policies.models import Policy, PolicyBinding
|
||||||
from authentik.policies.process import PolicyProcess
|
from authentik.policies.process import PolicyProcess
|
||||||
from authentik.policies.types import PolicyRequest
|
from authentik.policies.types import CACHE_PREFIX, PolicyRequest
|
||||||
|
|
||||||
LOGGER = get_logger()
|
LOGGER = get_logger()
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ class PolicyViewSet(
|
||||||
@action(detail=False, pagination_class=None, filter_backends=[])
|
@action(detail=False, pagination_class=None, filter_backends=[])
|
||||||
def cache_info(self, request: Request) -> Response:
|
def cache_info(self, request: Request) -> Response:
|
||||||
"""Info about cached policies"""
|
"""Info about cached policies"""
|
||||||
return Response(data={"count": len(cache.keys("policy_*"))})
|
return Response(data={"count": len(cache.keys(f"{CACHE_PREFIX}*"))})
|
||||||
|
|
||||||
@permission_required(None, ["authentik_policies.clear_policy_cache"])
|
@permission_required(None, ["authentik_policies.clear_policy_cache"])
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
|
@ -127,7 +127,7 @@ class PolicyViewSet(
|
||||||
@action(detail=False, methods=["POST"])
|
@action(detail=False, methods=["POST"])
|
||||||
def cache_clear(self, request: Request) -> Response:
|
def cache_clear(self, request: Request) -> Response:
|
||||||
"""Clear policy cache"""
|
"""Clear policy cache"""
|
||||||
keys = cache.keys("policy_*")
|
keys = cache.keys(f"{CACHE_PREFIX}*")
|
||||||
cache.delete_many(keys)
|
cache.delete_many(keys)
|
||||||
LOGGER.debug("Cleared Policy cache", keys=len(keys))
|
LOGGER.debug("Cleared Policy cache", keys=len(keys))
|
||||||
# Also delete user application cache
|
# Also delete user application cache
|
||||||
|
|
|
@ -10,12 +10,12 @@ from authentik.policies.dummy.models import DummyPolicy
|
||||||
from authentik.policies.expression.models import ExpressionPolicy
|
from authentik.policies.expression.models import ExpressionPolicy
|
||||||
from authentik.policies.models import Policy, PolicyBinding
|
from authentik.policies.models import Policy, PolicyBinding
|
||||||
from authentik.policies.process import PolicyProcess
|
from authentik.policies.process import PolicyProcess
|
||||||
from authentik.policies.types import PolicyRequest
|
from authentik.policies.types import CACHE_PREFIX, PolicyRequest
|
||||||
|
|
||||||
|
|
||||||
def clear_policy_cache():
|
def clear_policy_cache():
|
||||||
"""Ensure no policy-related keys are still cached"""
|
"""Ensure no policy-related keys are still cached"""
|
||||||
keys = cache.keys("policy_*")
|
keys = cache.keys(f"{CACHE_PREFIX}*")
|
||||||
cache.delete(keys)
|
cache.delete(keys)
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue