run.py

2.9 kB · python · 94 lines

1from automator import complete2from automator import create3from automator import files4from automator import generate5from automator import mockup6from automator import ping7from automator import process8from automator import product9from automator import publish10from automator import status11from automator import sync12from automator.core.api import logger, mint_token13from automator.core.errors import NoTaskError, Retry, TaskAborted14from automator.core.models import Task15from automator.core.s3 import abort_task, load_task, save_task16from automator.core.steps import Step1718MAX_FAILURES = 31920STEPS = {21    Step.GENERATE: generate.mrly_generate,22    Step.MOCKUP: mockup.mrly_mockup,23    Step.PROCESS: process.mrly_process,24    Step.FILES: files.mrly_files,25    Step.STATUS: status.mrly_status,26    Step.PRODUCT: product.mrly_product,27    Step.PING: ping.mrly_ping,28    Step.SYNC: sync.mrly_sync,29    Step.PUBLISH: publish.mrly_publish,30    Step.COMPLETE: complete.mrly_complete,31}3233def start() -> Task:34    try:35        task = load_task()36        logger.info(f"{task.desc} loaded task at Step.{task.step.upper()}")37        return task38    except NoTaskError:39        pass40    task = create.mrly_create()41    logger.info(f"{task.desc} created task on product {task.product.id}")42    return task4344def recover(task: Task) -> Task:45    count = task.metadata.get("failed_count", 0) + 146    task.metadata["failed_count"] = count47    if count >= MAX_FAILURES:48        logger.info(f"{task.desc} failed_count {count}, aborting")49        abort_task(task)50        return None51    step = task.metadata.get("failed_at") or Step.GENERATE.value52    task.place(Step(step))53    save_task(task)54    logger.info(f"{task.desc} FAILED recovery {count}/{MAX_FAILURES}, back to Step.{step.upper()}")55    return None5657def run() -> None:58    try:59        task = start()60    except NoTaskError as error:61        logger.info(f"nothing to do: {error}")62        return63    while True:64        step = Step(task.step)65        if step == Step.FAILED:66            recover(task)67            break68        try:69            logger.info(f"{task.desc} executing Step.{task.step.upper()}")70            task = STEPS[step](task)71            save_task(task)72            continue73        except Retry as error:74            logger.info(f"{task.desc} retry: {error}")75            save_task(task)76            break77        except TaskAborted as error:78            logger.info(f"{task.desc} aborted: {error}")79            abort_task(task)80            break81        except NoTaskError:82            logger.info(f"{task.desc} completed")83            break84        except Exception as error:85            logger.info(f"{task.desc} error at Step.{task.step.upper()}: {error}")86            task.metadata["failed_at"] = task.step87            task.metadata["failed_error"] = str(error)88            task.place(Step.FAILED)89            save_task(task)90            raise9192def handler(event, context):93    mint_token()94    run()