#!/usr/bin/env python
+#
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+#
+
from __future__ import print_function, absolute_import
import argparse
import arvados
import arvados.util
+import csv
+import sys
"""
Given a list of collections missing blocks (as produced by
if cr["requesting_container_uuid"]:
rerun_request(arv, container_requests_to_rerun, arv.containers().get(uuid=cr["requesting_container_uuid"]).execute())
else:
- container_requests_to_rerun.append(cr)
+ container_requests_to_rerun[cr["uuid"]] = cr
+def get_owner(arv, owners, uuid):
+ if uuid not in owners:
+ if uuid[6:11] == "tpzed":
+ owners[uuid] = arv.users().get(uuid=uuid).execute()["full_name"]
+ else:
+ owners[uuid] = arv.groups().get(uuid=uuid).execute()["name"]
+ return owners[uuid]
def main():
parser = argparse.ArgumentParser(description='Re-run containers associated with missing blocks')
- parser.add_argument('--dry-run', action='store_true', default=False)
parser.add_argument('inp')
args = parser.parse_args()
for c in collections:
busted_collections.add(c)
+ out = csv.writer(sys.stdout)
+
+ out.writerow(("collection uuid", "container request uuid", "record name", "modified at", "owner uuid", "owner name", "notes"))
+
+ owners = {}
collections_to_delete = {}
- container_requests_to_rerun = []
+ container_requests_to_rerun = {}
# Get containers that produced these collections
+ i = 0
for b in busted_collections:
+ i += 1
collections_to_delete = arvados.util.list_all(arv.collections().list, filters=[["portable_data_hash", "=", b]])
for d in collections_to_delete:
- print("Will delete %s" % d["uuid"])
- if not args.dry_run:
- arv.collections().delete(uuid=d["uuid"]).execute()
+ t = ""
+ if d["properties"].get("type") not in ("output", "log"):
+ t = "\"type\" was '%s', expected one of 'output' or 'log'" % d["properties"].get("type")
+ out.writerow((d["uuid"], "", d["name"], d["modified_at"], d["owner_uuid"], get_owner(arv, owners, d["owner_uuid"]), t))
+
maybe_containers_to_rerun = arvados.util.list_all(arv.containers().list, filters=[["output", "=", b]])
for ct in maybe_containers_to_rerun:
rerun_request(arv, container_requests_to_rerun, ct)
- for cr in container_requests_to_rerun:
- new_cr = {}
- for f in ("command",
- "cwd",
- "environment",
- "output_path",
- "container_image",
- "mounts",
- "runtime_constraints",
- "scheduling_parameters",
- "owner_uuid"):
- new_cr[f] = cr[f]
- new_cr["name"] = cr["name"] + " rerun"
- new_cr["state"] = "Committed"
- new_cr["priority"] = 500
- print("Will re-run %s" % cr["uuid"])
- if not args.dry_run:
- new_cr = arv.container_requests().create(body=new_cr).execute()
- print("Submitted %s" % new_cr["uuid"])
+ i = 0
+ for _, cr in container_requests_to_rerun.items():
+ i += 1
+ out.writerow(("", cr["uuid"], cr["name"], cr["modified_at"], cr["owner_uuid"], get_owner(arv, owners, cr["owner_uuid"]), ""))
+
if __name__ == "__main__":
main()