X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6c0fcdd735e85a69d4a7719446f8bf56bd6b4795..571e3176596b852c2f1385487e459126c3d3fd04:/sdk/python/arvados/commands/arv_copy.py diff --git a/sdk/python/arvados/commands/arv_copy.py b/sdk/python/arvados/commands/arv_copy.py index 79dabd38b2..7951842acc 100755 --- a/sdk/python/arvados/commands/arv_copy.py +++ b/sdk/python/arvados/commands/arv_copy.py @@ -89,10 +89,10 @@ def main(): help='Perform copy even if the object appears to exist at the remote destination.') copy_opts.add_argument( '--src', dest='source_arvados', - help='The name of the source Arvados instance (required) - points at an Arvados config file. May be either a pathname to a config file, or (for example) "foo" as shorthand for $HOME/.config/arvados/foo.conf.') + help='The cluster id of the source Arvados instance. May be either a pathname to a config file, or (for example) "foo" as shorthand for $HOME/.config/arvados/foo.conf. If not provided, will be inferred from the UUID of the object being copied.') copy_opts.add_argument( '--dst', dest='destination_arvados', - help='The name of the destination Arvados instance (required) - points at an Arvados config file. May be either a pathname to a config file, or (for example) "foo" as shorthand for $HOME/.config/arvados/foo.conf.') + help='The name of the destination Arvados instance (required). May be either a pathname to a config file, or (for example) "foo" as shorthand for $HOME/.config/arvados/foo.conf. If not provided, will use ARVADOS_API_HOST from environment.') copy_opts.add_argument( '--recursive', dest='recursive', action='store_true', help='Recursively copy any dependencies for this object, and subprojects. (default)') @@ -113,7 +113,7 @@ def main(): copy_opts.set_defaults(recursive=True) parser = argparse.ArgumentParser( - description='Copy a workflow or collection from one Arvados instance to another.', + description='Copy a workflow, collection or project from one Arvados instance to another. On success, the uuid of the copied object is printed to stdout.', parents=[copy_opts, arv_cmd.retry_opt]) args = parser.parse_args() @@ -161,7 +161,12 @@ def main(): logger.error("API server returned an error result: {}".format(result)) exit(1) - logger.info("") + print(result['uuid']) + + if result.get('partial_error'): + logger.warning("Warning: created copy with uuid {} but failed to copy some items: {}".format(result['uuid'], result['partial_error'])) + exit(1) + logger.info("Success: created copy with uuid {}".format(result['uuid'])) exit(0) @@ -292,8 +297,11 @@ def copy_workflow(wf_uuid, src, dst, args): # fetch the workflow from the source instance wf = src.workflows().get(uuid=wf_uuid).execute(num_retries=args.retries) + if not wf["definition"]: + logger.warning("Workflow object {} has an empty or null definition, it won't do anything.".format(wf_uuid)) + # copy collections and docker images - if args.recursive: + if args.recursive and wf["definition"]: wf_def = yaml.safe_load(wf["definition"]) if wf_def is not None: locations = [] @@ -683,17 +691,31 @@ def copy_project(obj_uuid, src, dst, owner_uuid, args): logger.debug('Copying %s to %s', obj_uuid, project_record["uuid"]) + + partial_error = "" + # Copy collections - copy_collections([col["uuid"] for col in arvados.util.list_all(src.collections().list, filters=[["owner_uuid", "=", obj_uuid]])], - src, dst, args) + try: + copy_collections([col["uuid"] for col in arvados.util.list_all(src.collections().list, filters=[["owner_uuid", "=", obj_uuid]])], + src, dst, args) + except Exception as e: + partial_error += "\n" + str(e) # Copy workflows for w in arvados.util.list_all(src.workflows().list, filters=[["owner_uuid", "=", obj_uuid]]): - copy_workflow(w["uuid"], src, dst, args) + try: + copy_workflow(w["uuid"], src, dst, args) + except Exception as e: + partial_error += "\n" + "Error while copying %s: %s" % (w["uuid"], e) if args.recursive: for g in arvados.util.list_all(src.groups().list, filters=[["owner_uuid", "=", obj_uuid]]): - copy_project(g["uuid"], src, dst, project_record["uuid"], args) + try: + copy_project(g["uuid"], src, dst, project_record["uuid"], args) + except Exception as e: + partial_error += "\n" + "Error while copying %s: %s" % (g["uuid"], e) + + project_record["partial_error"] = partial_error return project_record