12764: Support empty anonymous directories by creating a .keep placeholder.
authorPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 12 Jan 2018 19:06:06 +0000 (14:06 -0500)
committerPeter Amstutz <pamstutz@veritasgenetics.com>
Mon, 29 Jan 2018 19:49:56 +0000 (14:49 -0500)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz@veritasgenetics.com>

sdk/cwl/arvados_cwl/__init__.py
sdk/cwl/arvados_cwl/arvcontainer.py

index 892cb0a6309e048d5b970d5b39598eb331740f43..af6ab33f1f574a4eea2408521ff5aa1227b02b59 100644 (file)
@@ -224,13 +224,12 @@ class ArvCwlRunner(object):
 
     def check_features(self, obj):
         if isinstance(obj, dict):
-            #if obj.get("writable"):
-            #    raise SourceLine(obj, "writable", UnsupportedRequirement).makeError("InitialWorkDir feature 'writable: true' not supported")
+            if obj.get("writable") and self.work_api != "containers":
+                raise SourceLine(obj, "writable", UnsupportedRequirement).makeError("InitialWorkDir feature 'writable: true' not supported with --api=jobs")
             if obj.get("class") == "DockerRequirement":
-                if obj.get("dockerOutputDirectory"):
-                    # TODO: can be supported by containers API, but not jobs API.
+                if obj.get("dockerOutputDirectory") and self.work_api != "containers":
                     raise SourceLine(obj, "dockerOutputDirectory", UnsupportedRequirement).makeError(
-                        "Option 'dockerOutputDirectory' of DockerRequirement not supported.")
+                        "Option 'dockerOutputDirectory' of DockerRequirement not supported with --api=jobs.")
             for v in obj.itervalues():
                 self.check_features(v)
         elif isinstance(obj, list):
index fba158bda6c80eec6f38ac00c79591c73a1205b1..abe67c8fb3c552c7e66925093ae1377b1e26b4e9 100644 (file)
@@ -105,17 +105,32 @@ class ArvadosContainer(object):
                 generatemapper = NoFollowPathMapper([self.generatefiles], "", "",
                                                     separateDirs=False)
 
+                logger.debug("generatemapper is %s", generatemapper._pathmap)
+
                 with Perf(metrics, "createfiles %s" % self.name):
                     for f, p in generatemapper.items():
                         if not p.target:
                             pass
                         elif p.type in ("File", "Directory", "WritableFile", "WritableDirectory"):
-                            source, path = self.arvrunner.fs_access.get_collection(p.resolved)
-                            vwd.copy(path, p.target, source_collection=source)
+                            if p.resolved.startswith("_:"):
+                                vwd.mkdirs(p.target)
+                            else:
+                                source, path = self.arvrunner.fs_access.get_collection(p.resolved)
+                                vwd.copy(path, p.target, source_collection=source)
                         elif p.type == "CreateFile":
                             with vwd.open(p.target, "w") as n:
                                 n.write(p.resolved.encode("utf-8"))
 
+                def keepemptydirs(p):
+                    if isinstance(p, arvados.collection.RichCollectionBase):
+                        if len(p) == 0:
+                            p.open(".keep", "w").close()
+                        else:
+                            for c in p:
+                                keepemptydirs(p[c])
+
+                keepemptydirs(vwd)
+
                 with Perf(metrics, "generatefiles.save_new %s" % self.name):
                     vwd.save_new()