X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/4d59e4f59204ff6e278ad7f37b55ead3911412e1..3af6db5dc4e2f08b2ebb49a82109c4325ad7fcc4:/sdk/cwl/arvados_cwl/__init__.py diff --git a/sdk/cwl/arvados_cwl/__init__.py b/sdk/cwl/arvados_cwl/__init__.py index 936f445c50..92be92d6e0 100644 --- a/sdk/cwl/arvados_cwl/__init__.py +++ b/sdk/cwl/arvados_cwl/__init__.py @@ -30,6 +30,7 @@ from .arvworkflow import ArvadosWorkflow, upload_workflow from .fsaccess import CollectionFsAccess from .perf import Perf from .pathmapper import FinalOutputPathMapper +from ._version import __version__ from cwltool.pack import pack from cwltool.process import shortname, UnsupportedRequirement, getListing @@ -200,14 +201,28 @@ class ArvCwlRunner(object): srccollections = {} for k,v in generatemapper.items(): + if k.startswith("_:"): + if v.type == "Directory": + continue + if v.type == "CreateFile": + with final.open(v.target, "wb") as f: + f.write(v.resolved.encode("utf-8")) + continue + + if not k.startswith("keep:"): + raise Exception("Output source is not in keep or a literal") sp = k.split("/") srccollection = sp[0][5:] if srccollection not in srccollections: - srccollections[srccollection] = arvados.collection.CollectionReader( - srccollection, - api_client=self.api, - keep_client=self.keep_client, - num_retries=self.num_retries) + try: + srccollections[srccollection] = arvados.collection.CollectionReader( + srccollection, + api_client=self.api, + keep_client=self.keep_client, + num_retries=self.num_retries) + except arvados.errors.ArgumentError as e: + logger.error("Creating CollectionReader for '%s' '%s': %s", k, v, e) + raise reader = srccollections[srccollection] try: srcpath = "/".join(sp[1:]) if len(sp) > 1 else "." @@ -217,7 +232,7 @@ class ArvCwlRunner(object): def rewrite(fileobj): fileobj["location"] = generatemapper.mapper(fileobj["location"]).target - for k in ("basename", "size", "listing"): + for k in ("basename", "listing", "contents"): if k in fileobj: del fileobj[k] @@ -233,7 +248,13 @@ class ArvCwlRunner(object): final.api_response()["name"], final.manifest_locator()) - self.final_output_collection = final + def finalcollection(fileobj): + fileobj["location"] = "keep:%s/%s" % (final.portable_data_hash(), fileobj["location"]) + + adjustDirObjs(outputObj, finalcollection) + adjustFileObjs(outputObj, finalcollection) + + return (outputObj, final) def set_crunch_output(self): if self.work_api == "containers": @@ -389,7 +410,7 @@ class ArvCwlRunner(object): else: if self.output_name is None: self.output_name = "Output of %s" % (shortname(tool.tool["id"])) - self.make_output_collection(self.output_name, self.final_output) + self.final_output, self.final_output_collection = self.make_output_collection(self.output_name, self.final_output) self.set_crunch_output() if self.final_status != "success": @@ -409,7 +430,7 @@ def versionstring(): arvpkg = pkg_resources.require("arvados-python-client") cwlpkg = pkg_resources.require("cwltool") - return "%s %s, %s %s, %s %s" % (sys.argv[0], arvcwlpkg[0].version, + return "%s %s %s, %s %s, %s %s" % (sys.argv[0], __version__, arvcwlpkg[0].version, "arvados-python-client", arvpkg[0].version, "cwltool", cwlpkg[0].version) @@ -468,7 +489,7 @@ def arg_parser(): # type: () -> argparse.ArgumentParser parser.add_argument("--api", type=str, default=None, dest="work_api", - help="Select work submission API, one of 'jobs' or 'containers'.") + help="Select work submission API, one of 'jobs' or 'containers'. Default is 'jobs' if that API is available, otherwise 'containers'.") parser.add_argument("--compute-checksum", action="store_true", default=False, help="Compute checksum of contents while collecting outputs",