diff --git a/backend/builder/tasks/tasks_build_image.py b/backend/builder/tasks/tasks_build_image.py index 2d08760c5..edcda6da4 100644 --- a/backend/builder/tasks/tasks_build_image.py +++ b/backend/builder/tasks/tasks_build_image.py @@ -1,8 +1,13 @@ +import structlog + import orchestrator from backend.celery import app +from builder.exceptions import CeleryRetryError from builder.image_builder.image_builder import build_image_if_missing from builder.tasks.task import BuildTask +logger = structlog.get_logger(__name__) + @app.task( bind=True, @@ -15,6 +20,10 @@ # see http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-reject-on-worker-lost # and https://github.com/celery/celery/issues/5106 def build_image(task: BuildTask, function_serialized: str, channel: str, compute_task_key: str) -> None: - function = orchestrator.Function.parse_raw(function_serialized) + try: + function = orchestrator.Function.parse_raw(function_serialized) - build_image_if_missing(channel, function) + build_image_if_missing(channel, function) + except Exception as exception: + logger.exception(exception) + raise CeleryRetryError() from exception diff --git a/backend/substrapp/compute_tasks/execute.py b/backend/substrapp/compute_tasks/execute.py index 7f82cd2dc..d652dab41 100644 --- a/backend/substrapp/compute_tasks/execute.py +++ b/backend/substrapp/compute_tasks/execute.py @@ -26,12 +26,14 @@ from substrapp.compute_tasks.volumes import get_volumes from substrapp.compute_tasks.volumes import get_worker_subtuple_pvc_name from substrapp.docker_registry import get_container_image_name +from substrapp.docker_registry import get_entrypoint from substrapp.exceptions import PodReadinessTimeoutError from substrapp.kubernetes_utils import delete_pod from substrapp.kubernetes_utils import execute from substrapp.kubernetes_utils import get_volume from substrapp.kubernetes_utils import pod_exists_by_label_selector from substrapp.kubernetes_utils import wait_for_pod_readiness +from substrapp.models import ImageEntrypoint from substrapp.orchestrator import get_orchestrator_client from substrapp.utils import timeit @@ -49,6 +51,12 @@ def execute_compute_task(ctx: Context) -> None: env = get_environment(ctx) image = get_container_image_name(container_image_tag) + # save entrypoint to DB + entrypoint = get_entrypoint(container_image_tag) + ImageEntrypoint.objects.get_or_create( + function_checksum=ctx.function.function_address.checksum, entrypoint_json=entrypoint + ) + k8s_client = _get_k8s_client() should_create_pod = not pod_exists_by_label_selector(k8s_client, compute_pod.label_selector) diff --git a/backend/substrapp/docker_registry.py b/backend/substrapp/docker_registry.py index 84697ea7d..cebc0307e 100644 --- a/backend/substrapp/docker_registry.py +++ b/backend/substrapp/docker_registry.py @@ -44,6 +44,11 @@ def get_container_image_name(image_name: str) -> str: return f"{pull_domain}/{USER_IMAGE_REPOSITORY}:{image_name}" +def get_entrypoint(image_tag: str) -> str: + d = get_container_image(image_tag) + return json.loads(d["history"][0]["v1Compatibility"])["config"]["Entrypoint"] + + def delete_container_image_safe(image_tag: str) -> None: """deletes a container image from the docker registry but will fail silently""" try: