8460: Merge branch 'master' into 8460-websocket-go
[arvados.git] / sdk / cwl / arvados_cwl / fsaccess.py
index 9201ab60076add6142d90d1afd7196c88426e162..500ea0f4203793fac7fdf418f79b0ae562f64334 100644 (file)
@@ -4,6 +4,8 @@ import errno
 import urlparse
 import re
 
+import ruamel.yaml as yaml
+
 import cwltool.stdfsaccess
 from cwltool.pathmapper import abspath
 import cwltool.resolver
@@ -134,16 +136,16 @@ class CollectionFetcher(DefaultFetcher):
 
     def fetch_text(self, url):
         if url.startswith("keep:"):
-            with self.fsaccess.open(url) as f:
+            with self.fsaccess.open(url, "r") as f:
                 return f.read()
-        if url.startswith("arv:"):
-            return self.api_client.workflows().get(uuid=url[4:]).execute()["definition"]
+        if url.startswith("arvwf:"):
+            return self.api_client.workflows().get(uuid=url[6:]).execute()["definition"]
         return super(CollectionFetcher, self).fetch_text(url)
 
     def check_exists(self, url):
         if url.startswith("keep:"):
             return self.fsaccess.exists(url)
-        if url.startswith("arv:"):
+        if url.startswith("arvwf:"):
             if self.fetch_text(url):
                 return True
         return super(CollectionFetcher, self).check_exists(url)
@@ -157,7 +159,7 @@ class CollectionFetcher(DefaultFetcher):
             return url
 
         basesp = urlparse.urlsplit(base_url)
-        if basesp.scheme == "keep":
+        if basesp.scheme in ("keep", "arvwf"):
             if not basesp.path:
                 raise IOError(errno.EINVAL, "Invalid Keep locator", base_url)
 
@@ -166,7 +168,7 @@ class CollectionFetcher(DefaultFetcher):
 
             pdh = baseparts.pop(0)
 
-            if not arvados.util.keep_locator_pattern.match(pdh):
+            if basesp.scheme == "keep" and not arvados.util.keep_locator_pattern.match(pdh):
                 raise IOError(errno.EINVAL, "Invalid Keep locator", base_url)
 
             if urlsp.path.startswith("/"):
@@ -177,23 +179,28 @@ class CollectionFetcher(DefaultFetcher):
                 baseparts.pop()
 
             path = "/".join([pdh] + baseparts + urlparts)
-            return urlparse.urlunsplit(("keep", "", path, "", urlsp.fragment))
+            return urlparse.urlunsplit((basesp.scheme, "", path, "", urlsp.fragment))
 
         return super(CollectionFetcher, self).urljoin(base_url, url)
 
 workflow_uuid_pattern = re.compile(r'[a-z0-9]{5}-7fd4e-[a-z0-9]{15}')
+pipeline_template_uuid_pattern = re.compile(r'[a-z0-9]{5}-p5p6p-[a-z0-9]{15}')
 
 def collectionResolver(api_client, document_loader, uri):
     if workflow_uuid_pattern.match(uri):
-        return "arv:%s" % uri
+        return "arvwf:%s#main" % (uri)
+
+    if pipeline_template_uuid_pattern.match(uri):
+        pt = api_client.pipeline_templates().get(uuid=uri).execute()
+        return "keep:" + pt["components"].values()[0]["script_parameters"]["cwl:tool"]
 
     p = uri.split("/")
     if arvados.util.keep_locator_pattern.match(p[0]):
-        return "keep:" + uri
+        return "keep:%s" % (uri)
 
     if arvados.util.collection_uuid_pattern.match(p[0]):
-        return "keep:%s%s" % (self.api_client.collections().
-                              get(uuid=uri).execute()["portable_data_hash"],
+        return "keep:%s%s" % (api_client.collections().
+                              get(uuid=p[0]).execute()["portable_data_hash"],
                               uri[len(p[0]):])
 
     return cwltool.resolver.tool_resolver(document_loader, uri)