outposts: implement .run_wuth_logs() which returns logs, add task monitoring

This commit is contained in:
Jens Langhammer 2020-10-16 11:38:49 +02:00
parent f6b8171624
commit 86cfb10b9b
3 changed files with 28 additions and 13 deletions

View File

@ -1,7 +1,8 @@
"""Base Controller""" """Base Controller"""
from typing import Dict from typing import Dict, List
from structlog import get_logger from structlog import get_logger
from structlog.testing import capture_logs
from passbook.lib.sentry import SentryIgnoredException from passbook.lib.sentry import SentryIgnoredException
from passbook.outposts.models import Outpost from passbook.outposts.models import Outpost
@ -29,6 +30,12 @@ class BaseController:
"""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]:
"""Call .run() but capture all log output and return it."""
with capture_logs() as logs:
self.run()
return logs
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

@ -3,7 +3,7 @@ from celery.schedules import crontab
CELERY_BEAT_SCHEDULE = { CELERY_BEAT_SCHEDULE = {
"outposts_controller": { "outposts_controller": {
"task": "passbook.outposts.tasks.outpost_controller", "task": "passbook.outposts.tasks.outpost_controller_all",
"schedule": crontab(minute="*/5"), "schedule": crontab(minute="*/5"),
"options": {"queue": "passbook_scheduled"}, "options": {"queue": "passbook_scheduled"},
}, },

View File

@ -6,7 +6,9 @@ from channels.layers import get_channel_layer
from django.db.models.base import Model from django.db.models.base import Model
from structlog import get_logger from structlog import get_logger
from passbook.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus
from passbook.lib.utils.reflection import path_to_class from passbook.lib.utils.reflection import path_to_class
from passbook.outposts.controllers.base import ControllerException
from passbook.outposts.models import ( from passbook.outposts.models import (
Outpost, Outpost,
OutpostDeploymentType, OutpostDeploymentType,
@ -22,24 +24,30 @@ LOGGER = get_logger()
@CELERY_APP.task() @CELERY_APP.task()
def outpost_controller(): def outpost_controller_all():
"""Launch Controller for all Outposts which support it""" """Launch Controller for all Outposts which support it"""
for outpost in Outpost.objects.exclude( for outpost in Outpost.objects.exclude(
deployment_type=OutpostDeploymentType.CUSTOM deployment_type=OutpostDeploymentType.CUSTOM
): ):
outpost_controller_single.delay( outpost_controller.delay(outpost.pk.hex, outpost.deployment_type, outpost.type)
outpost.pk.hex, outpost.deployment_type, outpost.type
)
@CELERY_APP.task() @CELERY_APP.task(bind=True, base=MonitoredTask)
def outpost_controller_single(outpost_pk: str, deployment_type: str, outpost_type: str): def outpost_controller(
self: MonitoredTask, outpost_pk: str, deployment_type: str, outpost_type: str
):
"""Launch controller and reconcile deployment/service/etc""" """Launch controller and reconcile deployment/service/etc"""
logs = []
try:
if outpost_type == OutpostType.PROXY: if outpost_type == OutpostType.PROXY:
if deployment_type == OutpostDeploymentType.KUBERNETES: if deployment_type == OutpostDeploymentType.KUBERNETES:
ProxyKubernetesController(outpost_pk).run() logs = ProxyKubernetesController(outpost_pk).run_with_logs()
if deployment_type == OutpostDeploymentType.DOCKER: if deployment_type == OutpostDeploymentType.DOCKER:
ProxyDockerController(outpost_pk).run() logs = ProxyDockerController(outpost_pk).run_with_logs()
except ControllerException as exc:
self.set_status(TaskResult(TaskResultStatus.ERROR, [str(exc)], exc))
else:
self.set_status(TaskResult(TaskResultStatus.SUCCESSFUL, logs))
@CELERY_APP.task() @CELERY_APP.task()