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