15531: Federation migrate script wip
[arvados.git] / sdk / cwl / arvados_cwl / fsaccess.py
index d5866e72853181a0fda8412cfd24f6687c27417a..c1ea586b0475db4c5b1a780fea5eab11bb02d11f 100644 (file)
@@ -70,9 +70,12 @@ class CollectionCache(object):
                 if m:
                     self.cap_cache(int(m.group(2)) * 128)
                 logger.debug("Creating collection reader for %s", locator)
-                cr = arvados.collection.CollectionReader(locator, api_client=self.api_client,
-                                                         keep_client=self.keep_client,
-                                                         num_retries=self.num_retries)
+                try:
+                    cr = arvados.collection.CollectionReader(locator, api_client=self.api_client,
+                                                             keep_client=self.keep_client,
+                                                             num_retries=self.num_retries)
+                except arvados.errors.ApiError as ap:
+                    raise IOError(errno.ENOENT, "Could not access collection '%s': %s" % (locator, str(ap._get_reason())))
                 sz = len(cr.manifest_text()) * 128
                 self.collections[locator] = (cr, sz)
                 self.total += sz
@@ -130,10 +133,10 @@ class CollectionFsAccess(cwltool.stdfsaccess.StdFsAccess):
         patternsegments = rest.split("/")
         return sorted(self._match(collection, patternsegments, "keep:" + collection.manifest_locator()))
 
-    def open(self, fn, mode):
+    def open(self, fn, mode, encoding=None):
         collection, rest = self.get_collection(fn)
         if collection is not None:
-            return collection.open(rest, mode)
+            return collection.open(rest, mode, encoding=encoding)
         else:
             return super(CollectionFsAccess, self).open(self._abs(fn), mode)
 
@@ -222,7 +225,7 @@ class CollectionFetcher(DefaultFetcher):
 
     def fetch_text(self, url):
         if url.startswith("keep:"):
-            with self.fsaccess.open(url, "r") as f:
+            with self.fsaccess.open(url, "r", encoding="utf-8") as f:
                 return f.read()
         if url.startswith("arvwf:"):
             record = self.api_client.workflows().get(uuid=url[6:]).execute(num_retries=self.num_retries)
@@ -265,8 +268,8 @@ class CollectionFetcher(DefaultFetcher):
             locator = baseparts.pop(0)
 
             if (basesp.scheme == "keep" and
-                (not arvados.util.keep_locator_pattern.match(pdh)) and
-                (not arvados.util.collection_uuid_pattern.match(pdh))):
+                (not arvados.util.keep_locator_pattern.match(locator)) and
+                (not arvados.util.collection_uuid_pattern.match(locator))):
                 raise IOError(errno.EINVAL, "Invalid Keep locator", base_url)
 
             if urlsp.path.startswith("/"):