outposts: ensure embedded outpost is created with integration selected

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer 2021-07-31 21:09:38 +02:00
parent f9382b8458
commit 293c479364
2 changed files with 33 additions and 3 deletions

View File

@ -1,5 +1,5 @@
"""Managed objects manager""" """Managed objects manager"""
from typing import Type from typing import Callable, Optional, Type
from structlog.stdlib import get_logger from structlog.stdlib import get_logger
@ -28,14 +28,28 @@ class EnsureOp:
class EnsureExists(EnsureOp): class EnsureExists(EnsureOp):
"""Ensure object exists, with kwargs as given values""" """Ensure object exists, with kwargs as given values"""
created_callback: Optional[Callable]
def __init__(
self,
obj: Type[ManagedModel],
managed_uid: str,
created_callback: Optional[Callable] = None,
**kwargs,
) -> None:
super().__init__(obj, managed_uid, **kwargs)
self.created_callback = created_callback
def run(self): def run(self):
self._kwargs.setdefault("managed", self._managed_uid) self._kwargs.setdefault("managed", self._managed_uid)
self._obj.objects.update_or_create( obj, created = self._obj.objects.update_or_create(
**{ **{
"managed": self._managed_uid, "managed": self._managed_uid,
"defaults": self._kwargs, "defaults": self._kwargs,
} }
) )
if created and self.created_callback is not None:
self.created_callback(obj)
class ObjectManager: class ObjectManager:

View File

@ -2,7 +2,13 @@
from dataclasses import asdict from dataclasses import asdict
from authentik.managed.manager import EnsureExists, ObjectManager from authentik.managed.manager import EnsureExists, ObjectManager
from authentik.outposts.models import Outpost, OutpostConfig, OutpostType from authentik.outposts.models import (
DockerServiceConnection,
KubernetesServiceConnection,
Outpost,
OutpostConfig,
OutpostType,
)
MANAGED_OUTPOST = "goauthentik.io/outposts/embedded" MANAGED_OUTPOST = "goauthentik.io/outposts/embedded"
@ -11,10 +17,20 @@ class OutpostManager(ObjectManager):
"""Outpost managed objects""" """Outpost managed objects"""
def reconcile(self): def reconcile(self):
def outpost_created(outpost: Outpost):
"""When outpost is initially created, and we already have a service connection,
auto-assign it."""
if KubernetesServiceConnection.objects.exists():
outpost.service_connection = KubernetesServiceConnection.objects.first()
elif DockerServiceConnection.objects.exists():
outpost.service_connection = DockerServiceConnection.objects.first()
outpost.save()
return [ return [
EnsureExists( EnsureExists(
Outpost, Outpost,
MANAGED_OUTPOST, MANAGED_OUTPOST,
created_callback=outpost_created,
name="authentik Embedded Outpost", name="authentik Embedded Outpost",
type=OutpostType.PROXY, type=OutpostType.PROXY,
_config=asdict( _config=asdict(