manager.py

4.3 kB · python · 155 lines

1import json2import sys3from automator.core.api import delete_product, mint_token4from automator.core.errors import NoTaskError5from automator.core.models import Task6from automator.core.s3 import (7    AUTOMATOR_KEY,8    BUCKET,9    CDN_PREFIX,10    PATHS_KEY,11    SITE_PREFIX,12    abort_task,13    cdn_prefix,14    delete_folder,15    get_json,16    load_paths,17    load_task,18    put_json,19    save_paths,20    save_task,21    task_key,22    task_prefix,23)24from automator.core.steps import Step25from catalog.helpers import all_ids26from env import gate, say, verb2728VERBS = ["init", "show", "paths", "reset", "abort", "reap", "wipe"]29COUNTERS = [30    "failed_at",31    "failed_error",32    "failed_count",33    "files_retried",34    "mockup_pending_count",35    "ping_count",36    "render_count",37    "status_count",38]39DATA_PREFIX = "data/"4041# OLD ART4243OLD_PREFIX = f"{SITE_PREFIX}art/"4445def argument(index: int, name: str) -> str:46    if len(sys.argv) <= index or sys.argv[index].startswith("--"):47        raise SystemExit(f"refuse: {name} is required")48    return sys.argv[index]4950# INIT5152def init():53    ids = all_ids()54    steps = [55        f"put {BUCKET}/{AUTOMATOR_KEY} = {{}}",56        f"put {BUCKET}/{PATHS_KEY} = {len(ids)} ids, all open",57    ]58    if not gate("manager init", steps): return59    put_json(AUTOMATOR_KEY, {})60    save_paths({str(id): True for id in ids})61    say(f"init wrote {AUTOMATOR_KEY} and {PATHS_KEY} with {len(ids)} ids")6263# READ6465def show():66    try:67        task = load_task()68    except NoTaskError:69        say("no task in flight")70        return71    say(json.dumps(task.to_dict(), indent=2))7273def paths():74    data = load_paths()75    open_ids = [id for id, state in data.items() if state is True]76    used = [id for id, state in data.items() if state is False]77    dead = [id for id, state in data.items() if state is None]78    say(f"open {len(open_ids)}, used {len(used)}, quarantined {len(dead)}, total {len(data)}")79    if not dead: return80    say("quarantined: " + " ".join(sorted(dead)))81    if not gate("manager paths", [f"reopen {len(dead)} quarantined ids in {PATHS_KEY}"]): return82    for id in dead: data[id] = True83    save_paths(data)84    say(f"reopened {len(dead)} ids")8586# WRITE8788def reset():89    name = argument(2, "step").upper()90    if name not in [step.name for step in Step]:91        raise SystemExit(f"refuse: {name} is not a step")92    task = load_task()93    steps = [94        f"{task.key} {task.step} -> {name.lower()}",95        f"clear {len(COUNTERS)} metadata counters",96    ]97    if not gate("manager reset", steps): return98    task.place(Step[name])99    for counter in COUNTERS: task.metadata.pop(counter, None)100    save_task(task)101    say(f"reset {task.key} to {name.lower()}")102103def abort():104    task = load_task()105    steps = [106        f"delete shopify product {task.product.shopify_id}",107        f"delete {BUCKET}/{task_prefix(task.key)}",108        f"delete {BUCKET}/{cdn_prefix(task.key)}",109        f"quarantine {task.product.id} in {PATHS_KEY}",110    ]111    if not gate("manager abort", steps): return112    mint_token()113    abort_task(task)114    say(f"aborted {task.key}")115116def reap():117    key = argument(2, "key")118    task = Task.from_dict(get_json(task_key(key)))119    steps = [120        f"delete shopify product {task.product.shopify_id}",121        f"delete {BUCKET}/{cdn_prefix(key)}",122        f"delete {BUCKET}/{OLD_PREFIX}{key}/",123        f"delete {BUCKET}/{task_prefix(key)}",124    ]125    if not gate("manager reap", steps): return126    if task.product.shopify_id:127        mint_token()128        delete_product(task)129    files = delete_folder(cdn_prefix(key)) + delete_folder(f"{OLD_PREFIX}{key}/")130    say(f"deleted {files} product files")131    say(f"deleted {delete_folder(task_prefix(key))} task objects")132133def wipe():134    steps = [135        f"delete every object under {BUCKET}/{DATA_PREFIX}",136        f"delete every object under {BUCKET}/{CDN_PREFIX}",137        f"delete every object under {BUCKET}/{OLD_PREFIX}",138    ]139    if not gate("manager wipe", steps): return140    say(f"deleted {delete_folder(DATA_PREFIX)} objects under {DATA_PREFIX}")141    say(f"deleted {delete_folder(CDN_PREFIX)} objects under {CDN_PREFIX}")142    say(f"deleted {delete_folder(OLD_PREFIX)} objects under {OLD_PREFIX}")143144ACTIONS = {145    "init": init,146    "show": show,147    "paths": paths,148    "reset": reset,149    "abort": abort,150    "reap": reap,151    "wipe": wipe,152}153154if __name__ == "__main__":155    ACTIONS[verb(VERBS)]()