"""Delete all REJECTED/FAILED/DISMISSED ECDS jobs for this account (keep SUCCESSFUL and any active), to get under the per-user retained-request cap. User-authorized. Paginates the full history; prints progress.""" import os import datapi ECDS_URL = "https://ecds.ecmwf.int/api" DELETE_STATES = {"rejected", "failed", "dismissed"} KEEP_STATES = {"successful", "accepted", "running", "queued"} def _key(): for l in open(os.path.expanduser("~/.cdsapirc")): if l.strip().startswith("key"): return l.split(":", 1)[1].strip() c = datapi.ApiClient(url=ECDS_URL, key=_key()) # collect (jobID, status) from every page BEFORE deleting (deletion shifts pages) targets, kept = [], [] page = c.get_jobs() while page is not None: for j in page.json.get("jobs", []): jid, st = j.get("jobID"), j.get("status") (targets if st in DELETE_STATES else kept).append((jid, st)) page = page.next print(f"to delete: {len(targets)} | keeping: {len(kept)} ({[s for _,s in kept]})", flush=True) ok = err = 0 for n, (jid, st) in enumerate(targets, 1): try: c.get_remote(jid).delete() ok += 1 except Exception as e: err += 1 if err <= 5: print(f" delete error {jid}: {e}", flush=True) if n % 20 == 0: print(f" deleted {ok}/{len(targets)} ...", flush=True) print(f"DONE deleted={ok} errors={err} kept={len(kept)}", flush=True)