outposts: rename run to up, add down method for deleting
This commit is contained in:
parent
b2c571bf1b
commit
5135d828b4
|
@ -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
|
||||||
|
|
|
@ -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()]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -52,4 +52,4 @@ class TestControllers(TestCase):
|
||||||
outpost.save()
|
outpost.save()
|
||||||
|
|
||||||
controller = ProxyKubernetesController(outpost.pk)
|
controller = ProxyKubernetesController(outpost.pk)
|
||||||
controller.run()
|
controller.up()
|
||||||
|
|
Reference in New Issue