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()