outposts: implement .run_wuth_logs() which returns logs, add task monitoring
This commit is contained in:
parent
f6b8171624
commit
86cfb10b9b
|
@ -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
|
||||||
|
|
|
@ -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"},
|
||||||
},
|
},
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Reference in New Issue