14930: Adds expiration notice in local time at the end of the run.
[arvados.git] / sdk / python / arvados / commands / arv_copy.py
index 1af6aa701bf3b2ccda4ed5d9ec042484bae1c6e4..8850d0bfd5a82c10633a3b39d0d5958961ead940 100755 (executable)
@@ -1,4 +1,6 @@
-#! /usr/bin/env python
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
 
 # arv-copy [--recursive] [--no-recursive] object-uuid src dst
 #
 # instances src and dst.  If either of these files is not found,
 # arv-copy will issue an error.
 
+from __future__ import division
+from future import standard_library
+from future.utils import listvalues
+standard_library.install_aliases()
+from past.builtins import basestring
+from builtins import object
 import argparse
 import contextlib
 import getpass
@@ -25,7 +33,7 @@ import shutil
 import sys
 import logging
 import tempfile
-import urlparse
+import urllib.parse
 
 import arvados
 import arvados.config
@@ -113,7 +121,7 @@ def main():
     copy_opts.set_defaults(recursive=True)
 
     parser = argparse.ArgumentParser(
-        description='Copy a pipeline instance, template or collection from one Arvados instance to another.',
+        description='Copy a pipeline instance, template, workflow, or collection from one Arvados instance to another.',
         parents=[copy_opts, arv_cmd.retry_opt])
     args = parser.parse_args()
 
@@ -152,7 +160,7 @@ def main():
         abort("cannot copy object {} of type {}".format(args.object_uuid, t))
 
     # Clean up any outstanding temp git repositories.
-    for d in local_repo_dir.values():
+    for d in listvalues(local_repo_dir):
         shutil.rmtree(d, ignore_errors=True)
 
     # If no exception was thrown and the response does not have an
@@ -344,7 +352,7 @@ def migrate_components_filters(template_components, dst_git_repo):
     be None if that is not known.
     """
     errors = []
-    for cname, cspec in template_components.iteritems():
+    for cname, cspec in template_components.items():
         def add_error(errmsg):
             errors.append("{}: {}".format(cname, errmsg))
         if not isinstance(cspec, dict):
@@ -435,7 +443,7 @@ def copy_workflow(wf_uuid, src, dst, args):
             if graph is not None:
                 workflow_collections(graph, locations, docker_images)
             else:
-                workflow_collections(graph, locations, docker_images)
+                workflow_collections(wf_def, locations, docker_images)
 
             if locations:
                 copy_collections(locations, src, dst, args)
@@ -455,9 +463,7 @@ def workflow_collections(obj, locations, docker_images):
             if loc.startswith("keep:"):
                 locations.append(loc[5:])
 
-        docker_image = obj.get('dockerImageId', None)
-        if docker_image is None:
-            docker_image = obj.get('dockerPull', None)
+        docker_image = obj.get('dockerImageId', None) or obj.get('dockerPull', None)
         if docker_image is not None:
             ds = docker_image.split(":", 1)
             tag = ds[1] if len(ds)==2 else 'latest'
@@ -465,8 +471,7 @@ def workflow_collections(obj, locations, docker_images):
 
         for x in obj:
             workflow_collections(obj[x], locations, docker_images)
-
-    if isinstance(obj, list):
+    elif isinstance(obj, list):
         for x in obj:
             workflow_collections(x, locations, docker_images)
 
@@ -556,7 +561,7 @@ def migrate_jobspec(jobspec, src, dst, dst_repo, args):
 #    names.  The return value is undefined.
 #
 def copy_git_repos(p, src, dst, dst_repo, args):
-    for component in p['components'].itervalues():
+    for component in p['components'].values():
         migrate_jobspec(component, src, dst, dst_repo, args)
         if 'job' in component:
             migrate_jobspec(component['job'], src, dst, dst_repo, args)
@@ -777,8 +782,8 @@ def select_git_url(api, repo_name, retries, allow_insecure_http, allow_insecure_
     git_url = None
     for url in priority:
         if url.startswith("http"):
-            u = urlparse.urlsplit(url)
-            baseurl = urlparse.urlunsplit((u.scheme, u.netloc, "", "", ""))
+            u = urllib.parse.urlsplit(url)
+            baseurl = urllib.parse.urlunsplit((u.scheme, u.netloc, "", "", ""))
             git_config = ["-c", "credential.%s/.username=none" % baseurl,
                           "-c", "credential.%s/.helper=!cred(){ cat >/dev/null; if [ \"$1\" = get ]; then echo password=$ARVADOS_API_TOKEN; fi; };cred" % baseurl]
         else:
@@ -802,7 +807,7 @@ def select_git_url(api, repo_name, retries, allow_insecure_http, allow_insecure_
 
     if git_url.startswith("http:"):
         if allow_insecure_http:
-            logger.warn("Using insecure git url %s but will allow this because %s", git_url, allow_insecure_http_opt)
+            logger.warning("Using insecure git url %s but will allow this because %s", git_url, allow_insecure_http_opt)
         else:
             raise Exception("Refusing to use insecure git url %s, use %s if you really want this." % (git_url, allow_insecure_http_opt))
 
@@ -862,7 +867,7 @@ def copy_docker_images(pipeline, src, dst, args):
     runtime_constraints field from src to dst."""
 
     logger.debug('copy_docker_images: {}'.format(pipeline['uuid']))
-    for c_name, c_info in pipeline['components'].iteritems():
+    for c_name, c_info in pipeline['components'].items():
         if ('runtime_constraints' in c_info and
             'docker_image' in c_info['runtime_constraints']):
             copy_docker_image(