outposts: rename run to up, add down method for deleting

This commit is contained in:
Jens Langhammer 2020-10-16 22:22:15 +02:00
parent b2c571bf1b
commit 5135d828b4
6 changed files with 61 additions and 16 deletions

View File

@ -26,16 +26,21 @@ class BaseController:
) )
self.deployment_ports = {} self.deployment_ports = {}
def run(self): # pylint: disable=invalid-name
def up(self):
"""Called by scheduled task to reconcile deployment/service/etc""" """Called by scheduled task to reconcile deployment/service/etc"""
raise NotImplementedError raise NotImplementedError
def run_with_logs(self) -> List[str]: def up_with_logs(self) -> List[str]:
"""Call .run() but capture all log output and return it.""" """Call .up() but capture all log output and return it."""
with capture_logs() as logs: with capture_logs() as logs:
self.run() self.up()
return [f"{x['controller']}: {x['event']}" for x in logs] return [f"{x['controller']}: {x['event']}" for x in logs]
def down(self):
"""Handler to delete everything we've created"""
raise NotImplementedError
def get_static_deployment(self) -> str: def get_static_deployment(self) -> str:
"""Return a static deployment configuration""" """Return a static deployment configuration"""
raise NotImplementedError raise NotImplementedError

View File

@ -62,7 +62,7 @@ class DockerController(BaseController):
True, True,
) )
def run(self): def up(self):
try: try:
container, has_been_created = self._get_container() container, has_been_created = self._get_container()
if has_been_created: if has_been_created:
@ -79,13 +79,13 @@ class DockerController(BaseController):
) )
container.kill() container.kill()
container.remove(force=True) container.remove(force=True)
return self.run() return self.up()
# Check that container values match our values # Check that container values match our values
if self._comp_env(container): if self._comp_env(container):
self.logger.info("Container has outdated config, re-creating...") self.logger.info("Container has outdated config, re-creating...")
container.kill() container.kill()
container.remove(force=True) container.remove(force=True)
return self.run() return self.up()
# Check that container is healthy # Check that container is healthy
if ( if (
container.status == "running" container.status == "running"
@ -104,6 +104,13 @@ class DockerController(BaseController):
except DockerException as exc: except DockerException as exc:
raise ControllerException from exc raise ControllerException from exc
def down(self):
try:
container, _ = self._get_container()
container.kill()
except DockerException as exc:
raise ControllerException from exc
def get_static_deployment(self) -> str: def get_static_deployment(self) -> str:
"""Generate docker-compose yaml for proxy, version 3.5""" """Generate docker-compose yaml for proxy, version 3.5"""
ports = [f"{x}:{x}" for _, x in self.deployment_ports.items()] ports = [f"{x}:{x}" for _, x in self.deployment_ports.items()]

View File

@ -33,7 +33,7 @@ class KubernetesObjectReconciler(Generic[T]):
self.namespace = "" self.namespace = ""
self.logger = get_logger(controller=self.__class__.__name__, outpost=outpost) self.logger = get_logger(controller=self.__class__.__name__, outpost=outpost)
def run(self): def up(self):
"""Create object if it doesn't exist, update if needed or recreate if needed.""" """Create object if it doesn't exist, update if needed or recreate if needed."""
current = None current = None
reference = self.get_reference_object() reference = self.get_reference_object()
@ -45,6 +45,7 @@ class KubernetesObjectReconciler(Generic[T]):
self.logger.debug("Failed to get current, triggering recreate") self.logger.debug("Failed to get current, triggering recreate")
raise NeedsRecreate from exc raise NeedsRecreate from exc
self.logger.debug("Other unhandled error", exc=exc) self.logger.debug("Other unhandled error", exc=exc)
raise exc
else: else:
self.logger.debug("Got current, running reconcile") self.logger.debug("Got current, running reconcile")
self.reconcile(current, reference) self.reconcile(current, reference)
@ -63,6 +64,19 @@ class KubernetesObjectReconciler(Generic[T]):
else: else:
self.logger.debug("Nothing to do...") self.logger.debug("Nothing to do...")
def down(self):
"""Delete object if found"""
try:
current = self.retrieve()
self.delete(current)
self.logger.debug("Removing")
except ApiException as exc:
if exc.status == 404:
self.logger.debug("Failed to get current, assuming non-existant")
return
self.logger.debug("Other unhandled error", exc=exc)
raise exc
def get_reference_object(self) -> T: def get_reference_object(self) -> T:
"""Return object as it should be""" """Return object as it should be"""
raise NotImplementedError raise NotImplementedError

View File

@ -23,24 +23,43 @@ class KubernetesController(BaseController):
except ConfigException: except ConfigException:
load_kube_config() load_kube_config()
def run(self): def up(self):
"""Called by scheduled task to reconcile deployment/service/etc"""
try: try:
namespace = self.outpost.config.kubernetes_namespace namespace = self.outpost.config.kubernetes_namespace
secret_reconciler = SecretReconciler(self.outpost) secret_reconciler = SecretReconciler(self.outpost)
secret_reconciler.namespace = namespace secret_reconciler.namespace = namespace
secret_reconciler.run() secret_reconciler.up()
deployment_reconciler = DeploymentReconciler(self.outpost) deployment_reconciler = DeploymentReconciler(self.outpost)
deployment_reconciler.namespace = namespace deployment_reconciler.namespace = namespace
deployment_reconciler.deployment_ports = self.deployment_ports deployment_reconciler.deployment_ports = self.deployment_ports
deployment_reconciler.run() deployment_reconciler.up()
service_reconciler = ServiceReconciler(self.outpost) service_reconciler = ServiceReconciler(self.outpost)
service_reconciler.namespace = namespace service_reconciler.namespace = namespace
service_reconciler.deployment_ports = self.deployment_ports service_reconciler.deployment_ports = self.deployment_ports
service_reconciler.run() service_reconciler.up()
except OpenApiException as exc:
raise ControllerException from exc
def down(self):
try:
namespace = self.outpost.config.kubernetes_namespace
secret_reconciler = SecretReconciler(self.outpost)
secret_reconciler.namespace = namespace
secret_reconciler.down()
deployment_reconciler = DeploymentReconciler(self.outpost)
deployment_reconciler.namespace = namespace
deployment_reconciler.deployment_ports = self.deployment_ports
deployment_reconciler.down()
service_reconciler = ServiceReconciler(self.outpost)
service_reconciler.namespace = namespace
service_reconciler.deployment_ports = self.deployment_ports
service_reconciler.down()
except OpenApiException as exc: except OpenApiException as exc:
raise ControllerException from exc raise ControllerException from exc

View File

@ -41,9 +41,9 @@ def outpost_controller(self: MonitoredTask, outpost_pk: str):
try: try:
if outpost.type == OutpostType.PROXY: if outpost.type == OutpostType.PROXY:
if outpost.deployment_type == OutpostDeploymentType.KUBERNETES: if outpost.deployment_type == OutpostDeploymentType.KUBERNETES:
logs = ProxyKubernetesController(outpost).run_with_logs() logs = ProxyKubernetesController(outpost).up_with_logs()
if outpost.deployment_type == OutpostDeploymentType.DOCKER: if outpost.deployment_type == OutpostDeploymentType.DOCKER:
logs = ProxyDockerController(outpost).run_with_logs() logs = ProxyDockerController(outpost).up_with_logs()
except ControllerException as exc: except ControllerException as exc:
self.set_status( self.set_status(
TaskResult(TaskResultStatus.ERROR, uid=slugify(outpost.name)).with_error( TaskResult(TaskResultStatus.ERROR, uid=slugify(outpost.name)).with_error(

View File

@ -52,4 +52,4 @@ class TestControllers(TestCase):
outpost.save() outpost.save()
controller = ProxyKubernetesController(outpost.pk) controller = ProxyKubernetesController(outpost.pk)
controller.run() controller.up()