import fnmatch
import os
+import errno
-import cwltool.process
+import cwltool.stdfsaccess
from cwltool.pathmapper import abspath
import arvados.util
import arvados.collection
import arvados.arvfile
-class CollectionFsAccess(cwltool.process.StdFsAccess):
+class CollectionFsAccess(cwltool.stdfsaccess.StdFsAccess):
"""Implement the cwltool FsAccess interface for Arvados Collections."""
def __init__(self, basedir, api_client=None):
self.collections = {}
def get_collection(self, path):
- print "PPP", path
p = path.split("/")
if p[0].startswith("keep:") and arvados.util.keep_locator_pattern.match(p[0][5:]):
pdh = p[0][5:]
collection, rest = self.get_collection(fn)
if collection:
if rest:
- return isinstance(collection.find(rest), arvados.collection.Collection)
+ return isinstance(collection.find(rest), arvados.collection.RichCollectionBase)
else:
return True
else:
def listdir(self, fn): # type: (unicode) -> List[unicode]
collection, rest = self.get_collection(fn)
- if rest:
- dir = collection.find(rest)
- else:
- dir = collection
if collection:
+ if rest:
+ dir = collection.find(rest)
+ else:
+ dir = collection
+ if dir is None:
+ raise IOError(errno.ENOENT, "Directory '%s' in '%s' not found" % (rest, collection.portable_data_hash()))
+ if not isinstance(dir, arvados.collection.RichCollectionBase):
+ raise IOError(errno.ENOENT, "Path '%s' in '%s' is not a Directory" % (rest, collection.portable_data_hash()))
return [abspath(l, fn) for l in dir.keys()]
else:
return super(CollectionFsAccess, self).listdir(fn)
if paths and paths[-1].startswith("keep:") and arvados.util.keep_locator_pattern.match(paths[-1][5:]):
return paths[-1]
return os.path.join(path, *paths)
+
+ def realpath(self, path):
+ if path.startswith("$(task.tmpdir)") or path.startswith("$(task.outdir)"):
+ return path
+ collection, rest = self.get_collection(path)
+ if collection:
+ return path
+ else:
+ return os.path.realpath(path)