Merge branch 'main' into 18842-arv-mount-disk-config
[arvados.git] / sdk / cwl / arvados_cwl / arvworkflow.py
index c0b479c37f8991d073bc093a23c67cfc52369378..56226388d7ab36618d1ff354c70d6bf512c18cea 100644 (file)
@@ -39,7 +39,7 @@ metrics = logging.getLogger('arvados.cwl-runner.metrics')
 max_res_pars = ("coresMin", "coresMax", "ramMin", "ramMax", "tmpdirMin", "tmpdirMax")
 sum_res_pars = ("outdirMin", "outdirMax")
 
-def make_wrapper_workflow(arvRunner, main, packed, project_uuid, name):
+def make_wrapper_workflow(arvRunner, main, packed, project_uuid, name, git_info, tool):
     col = arvados.collection.Collection(api_client=arvRunner.api,
                                         keep_client=arvRunner.keep_client)
 
@@ -48,23 +48,44 @@ def make_wrapper_workflow(arvRunner, main, packed, project_uuid, name):
 
     pdh = col.portable_data_hash()
 
+    toolname = tool.tool.get("label") or tool.metadata.get("label") or os.path.basename(tool.tool["id"])
+    if git_info and git_info.get("http://arvados.org/cwl#gitDescribe"):
+        toolname = "%s (%s)" % (toolname, git_info.get("http://arvados.org/cwl#gitDescribe"))
+
     existing = arvRunner.api.collections().list(filters=[["portable_data_hash", "=", pdh], ["owner_uuid", "=", project_uuid]]).execute(num_retries=arvRunner.num_retries)
     if len(existing["items"]) == 0:
-        col.save_new(name=name, owner_uuid=project_uuid, ensure_unique_name=True)
+        col.save_new(name=toolname, owner_uuid=project_uuid, ensure_unique_name=True)
 
     # now construct the wrapper
 
     step = {
-        "id": "#main/step",
+        "id": "#main/" + toolname,
         "in": [],
         "out": [],
-        "run": "keep:%s/workflow.json#main" % pdh
+        "run": "keep:%s/workflow.json#main" % pdh,
+        "label": name
     }
 
+    newinputs = []
+    for i in main["inputs"]:
+        inp = {}
+        # Make sure to only copy known fields that are meaningful at
+        # the workflow level. In practice this ensures that if we're
+        # wrapping a CommandLineTool we don't grab inputBinding.
+        # Right now also excludes extension fields, which is fine,
+        # Arvados doesn't currently look for any extension fields on
+        # input parameters.
+        for f in ("type", "label", "secondaryFiles", "streamable",
+                  "doc", "id", "format", "loadContents",
+                  "loadListing", "default"):
+            if f in i:
+                inp[f] = i[f]
+        newinputs.append(inp)
+
     wrapper = {
         "class": "Workflow",
         "id": "#main",
-        "inputs": main["inputs"],
+        "inputs": newinputs,
         "outputs": [],
         "steps": [step]
     }
@@ -88,7 +109,13 @@ def make_wrapper_workflow(arvRunner, main, packed, project_uuid, name):
     if main.get("hints"):
         wrapper["hints"] = main["hints"]
 
-    return json.dumps({"cwlVersion": "v1.2", "$graph": [wrapper]}, sort_keys=True, indent=4, separators=(',',': '))
+    doc = {"cwlVersion": "v1.2", "$graph": [wrapper]}
+
+    if git_info:
+        for g in git_info:
+            doc[g] = git_info[g]
+
+    return json.dumps(doc, sort_keys=True, indent=4, separators=(',',': '))
 
 def upload_workflow(arvRunner, tool, job_order, project_uuid,
                     runtimeContext, uuid=None,
@@ -137,7 +164,7 @@ def upload_workflow(arvRunner, tool, job_order, project_uuid,
 
     main["hints"] = hints
 
-    wrapper = make_wrapper_workflow(arvRunner, main, packed, project_uuid, name)
+    wrapper = make_wrapper_workflow(arvRunner, main, packed, project_uuid, name, git_info, tool)
 
     body = {
         "workflow": {