[ARVADOS] updated: d0b0a2baec96a678284e3004b13dce85f36ba190

git at public.curoverse.com git at public.curoverse.com
Wed Oct 8 17:47:55 EDT 2014


Summary of changes:
 sdk/python/arvados/commands/copy.py | 46 +++++++++++++++++++++++--------------
 sdk/python/arvados/keep.py          |  5 +++-
 2 files changed, 33 insertions(+), 18 deletions(-)

       via  d0b0a2baec96a678284e3004b13dce85f36ba190 (commit)
      from  edf8405b6a3bbce4a7e11118bb9c706d36856460 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit d0b0a2baec96a678284e3004b13dce85f36ba190
Author: Tim Pierce <twp at curoverse.com>
Date:   Wed Oct 8 17:45:24 2014 -0400

    3699: bug fix: use destination permission hints
    
    Fix copy_collection permission bug: when copying collections, the
    manifest in the collection created at the destination must have
    permission hints returned by the destination Keep server.
    
    Also fixed bug in arvados.keep.KeepClient (use the api_client's API
    token when one is specified)

diff --git a/sdk/python/arvados/commands/copy.py b/sdk/python/arvados/commands/copy.py
index df3d299..c8d3818 100755
--- a/sdk/python/arvados/commands/copy.py
+++ b/sdk/python/arvados/commands/copy.py
@@ -363,33 +363,45 @@ def copy_collection(obj_uuid, src, dst, force=False):
     # Fetch the collection's manifest.
     manifest = c['manifest_text']
 
-    # Enumerate the block locators found in the manifest.
-    collection_blocks = set()
-    src_keep = arvados.keep.KeepClient(api_client=src, num_retries=2)
-    for line in manifest.splitlines():
-        for block_hash in line.split()[1:]:
-            if arvados.util.portable_data_hash_pattern.match(block_hash):
-                collection_blocks.add(block_hash)
-            else:
-                break
-
     # Copy each block from src_keep to dst_keep.
+    # Use the newly signed locators returned from dst_keep to build
+    # a new manifest as we go.
+    src_keep = arvados.keep.KeepClient(api_client=src, num_retries=2)
     dst_keep = arvados.keep.KeepClient(api_client=dst, num_retries=2)
-    for locator in collection_blocks:
-        parts = locator.split('+')
-        logger.info("Copying block %s (%s bytes)", locator, parts[1])
-        data = src_keep.get(locator)
-        dst_keep.put(data)
+
+    dst_manifest = ""
+    dst_locators = {}
+    for line in manifest.splitlines():
+        words = line.split()
+        dst_manifest_line = words[0]
+        for word in words[1:]:
+            try:
+                loc = arvados.KeepLocator(word)
+                blockhash = loc.md5sum
+                # copy this block if we haven't seen it before
+                # (otherwise, just reuse the existing dst_locator)
+                if blockhash not in dst_locators:
+                    logger.info("Copying block %s (%s bytes)", blockhash, loc.size)
+                    data = src_keep.get(word)
+                    dst_locator = dst_keep.put(data)
+                    dst_locators[blockhash] = dst_locator
+                dst_manifest_line += ' ' + dst_locators[blockhash]
+            except ValueError:
+                # If 'word' can't be parsed as a locator,
+                # presume it's a filename.
+                dst_manifest_line += ' ' + word
+        dst_manifest += dst_manifest_line + "\n"
 
     # Copy the manifest and save the collection.
-    logger.debug('saving {} manifest: {}'.format(obj_uuid, manifest))
-    dst_keep.put(manifest)
+    logger.debug('saving {} manifest: {}'.format(obj_uuid, dst_manifest))
+    dst_keep.put(dst_manifest)
 
     if 'uuid' in c:
         del c['uuid']
     if 'owner_uuid' in c:
         del c['owner_uuid']
     c['ensure_unique_name'] = True
+    c['manifest_text'] = dst_manifest
     return dst.collections().create(body=c).execute()
 
 # copy_git_repo(src_git_repo, src, dst, dst_git_repo)
diff --git a/sdk/python/arvados/keep.py b/sdk/python/arvados/keep.py
index 37b1c17..0144a10 100644
--- a/sdk/python/arvados/keep.py
+++ b/sdk/python/arvados/keep.py
@@ -425,7 +425,10 @@ class KeepClient(object):
         if proxy is None:
             proxy = config.get('ARVADOS_KEEP_PROXY')
         if api_token is None:
-            api_token = config.get('ARVADOS_API_TOKEN')
+            if api_client is None:
+                api_token = config.get('ARVADOS_API_TOKEN')
+            else:
+                api_token = api_client.api_token
         elif api_client is not None:
             raise ValueError(
                 "can't build KeepClient with both API client and token")

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list