From: radhika Date: Wed, 4 Jan 2017 12:50:20 +0000 (-0500) Subject: 10110: also copy any docker images during arv-copy of a workflow and update documenta... X-Git-Tag: 1.1.0~469^2~1 X-Git-Url: https://git.arvados.org/arvados.git/commitdiff_plain/b8b7bec03f7e13f5703d37560d1019fbd3112bac 10110: also copy any docker images during arv-copy of a workflow and update documentation. --- diff --git a/doc/user/topics/arv-copy.html.textile.liquid b/doc/user/topics/arv-copy.html.textile.liquid index 223f2fe311..76ff1c1f11 100644 --- a/doc/user/topics/arv-copy.html.textile.liquid +++ b/doc/user/topics/arv-copy.html.textile.liquid @@ -81,3 +81,26 @@ For example, we can copy the same object using this tag.
~$ arv-copy --src qr1hi --dst dst_cluster --dst-git-repo $USER/tutorial --no-recursive qr1hi-p5p6p-9pkaxt6qjnkxhhu
 
+ +h3. How to copy a workflow + +We will use the uuid @zzzzz-7fd4e-sampleworkflow1@ as an example workflow. + + +
~$ arv-copy --src zzzzz --dst dst_cluster --dst-git-repo $USER/tutorial zzzzz-7fd4e-sampleworkflow1
+zzzzz-4zz18-jidprdejysravcr: 1143M / 1143M 100.0% 
+2017-01-04 04:11:58 arvados.arv-copy[5906] INFO:
+2017-01-04 04:11:58 arvados.arv-copy[5906] INFO: Success: created copy with uuid dst_cluster-7fd4e-ojtgpne594ubkt7
+
+
+ +The name, description, and workflow definition from the original workflow will be used for the destination copy. In addition, any *locations* and *docker images* found in the src workflow definition will also be copied to the destination recursively. + +If you would like to copy the object without dependencies, you can use the @--no-recursive@ flag. + +For example, we can copy the same object non-recursively using the following: + + +
~$ arv-copy --src zzzzz --dst dst_cluster --dst-git-repo $USER/tutorial --no-recursive zzzzz-7fd4e-sampleworkflow1
+
+
diff --git a/sdk/python/arvados/commands/arv_copy.py b/sdk/python/arvados/commands/arv_copy.py index 71820b3d2e..1af6aa701b 100755 --- a/sdk/python/arvados/commands/arv_copy.py +++ b/sdk/python/arvados/commands/arv_copy.py @@ -425,33 +425,50 @@ 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) + # copy collections and docker images if args.recursive: wf_def = yaml.safe_load(wf["definition"]) if wf_def is not None: - colls = [] + locations = [] + docker_images = {} graph = wf_def.get('$graph', None) if graph is not None: - workflow_collections(graph, colls) + workflow_collections(graph, locations, docker_images) else: - workflow_collections(wf_def, colls) - copy_collections(colls, src, dst, args) + workflow_collections(graph, locations, docker_images) + if locations: + copy_collections(locations, src, dst, args) + + for image in docker_images: + copy_docker_image(image, docker_images[image], src, dst, args) + + # copy the workflow itself del wf['uuid'] wf['owner_uuid'] = args.project_uuid - return dst.workflows().create(body=wf).execute(num_retries=args.retries) -def workflow_collections(obj, colls): +def workflow_collections(obj, locations, docker_images): if isinstance(obj, dict): loc = obj.get('location', None) if loc is not None: if loc.startswith("keep:"): - colls.append(loc[5:]) + locations.append(loc[5:]) + + docker_image = obj.get('dockerImageId', None) + if docker_image is None: + docker_image = obj.get('dockerPull', None) + if docker_image is not None: + ds = docker_image.split(":", 1) + tag = ds[1] if len(ds)==2 else 'latest' + docker_images[ds[0]] = tag + for x in obj: - workflow_collections(obj[x], colls) + workflow_collections(obj[x], locations, docker_images) + if isinstance(obj, list): for x in obj: - workflow_collections(x, colls) + workflow_collections(x, locations, docker_images) # copy_collections(obj, src, dst, args) #