13558: Merge branch 'master' into wtsi-hgi-13558-debug-log-tag-req-id
[arvados.git] / doc / user / cwl / cwl-style.html.textile.liquid
index a99c7bc86db8252d0c3c61157b82817806d78323..07cb4aa9095fad72e9854997427b5f171a941307 100644 (file)
@@ -3,12 +3,19 @@ layout: default
 navsection: userguide
 title: Best Practices for writing CWL
 ...
+{% comment %}
+Copyright (C) The Arvados Authors. All rights reserved.
 
-* Build a reusable library of components.  Share tool wrappers and subworkflows between projects.  Make use of and contribute to community resources such as https://github.com/common-workflow-language/workflows and http://dockstore.org
+SPDX-License-Identifier: CC-BY-SA-3.0
+{% endcomment %}
+
+* To run on Arvados, a workflow should provide a @DockerRequirement@ in the @hints@ section.
+
+* Build a reusable library of components.  Share tool wrappers and subworkflows between projects.  Make use of and contribute to "community maintained workflows and tools":https://github.com/common-workflow-language/workflows and tool registries such as "Dockstore":http://dockstore.org .
 
 * When combining a parameter value with a string, such as adding a filename extension, write @$(inputs.file.basename).ext@ instead of @$(inputs.file.basename + 'ext')@.  The first form is evaluated as a simple text substitution, the second form (using the @+@ operator) is evaluated as an arbitrary Javascript expression and requires that you declare @InlineJavascriptRequirement@.
 
-* Avoid including @InlineJavascriptRequirement@ or @ShellCommandRequirement@ unless you specifically need them.  Don't include them "just in case" because they change the default behavior and may imply extra overhead.
+* Avoid declaring @InlineJavascriptRequirement@ or @ShellCommandRequirement@ unless you specifically need them.  Don't include them "just in case" because they change the default behavior and may imply extra overhead.
 
 * Don't write CWL scripts that access the Arvados SDK.  This is non-portable; a script that access Arvados directly won't work with @cwltool@ or crunch v2.
 
@@ -42,6 +49,8 @@ outputs:
 
 * You can get the designated temporary directory using @$(runtime.tmpdir)@ in your CWL file, or from the @$TMPDIR@ environment variable in your script.
 
+* Similarly, you can get the designated output directory using $(runtime.outdir), or from the @HOME@ environment variable in your script.
+
 * Use @ExpressionTool@ to efficiently rearrange input files between steps of a Workflow.  For example, the following expression accepts a directory containing files paired by @_R1_@ and @_R2_@ and produces an array of Directories containing each pair.
 
 <pre>
@@ -76,7 +85,7 @@ expression: |
   }
 </pre>
 
-* Don't specifying resource requirements in CommandLineTool.  Prefer to specify them in the workflow.  You can provide a default resource requirement in the top level @hints@ section, and individual steps can override it with their own resource requirement.
+* Avoid specifying resource requirements in CommandLineTool.  Prefer to specify them in the workflow.  You can provide a default resource requirement in the top level @hints@ section, and individual steps can override it with their own resource requirement.
 
 <pre>
 cwlVersion: v1.0
@@ -104,9 +113,11 @@ steps:
         tmpdirMin: 90000
 </pre>
 
+* Available compute nodes types vary over time and across different cloud providers, so try to limit the RAM requirement to what the program actually needs.  However, if you need to target a specific compute node type, see this discussion on "calculating RAM request and choosing instance type for containers.":{{site.baseurl}}/api/execution.html#RAM
+
 * Instead of scattering separate steps, prefer to scatter over a subworkflow.
 
-With the following pattern, @step1@ has to complete for all samples to complete before @step2@ can start on any samples.  This means a single long-running sample can prevent the rest of the workflow from moving on:
+With the following pattern, @step1@ has to wait for all samples to complete before @step2@ can start computing on any samples.  This means a single long-running sample can prevent the rest of the workflow from moving on:
 
 <pre>
 cwlVersion: v1.0
@@ -131,7 +142,7 @@ steps:
     run: tool3.cwl
 </pre>
 
-Instead, scatter over a subworkflow.  In this pattern, a sample can proceed from to @step2@ as soon as @step1@ is done, independently of any other samples.
+Instead, scatter over a subworkflow.  In this pattern, a sample can proceed to @step2@ as soon as @step1@ is done, independently of any other samples.
 Example: (note, the subworkflow can also be put in a separate file)
 
 <pre>
@@ -164,3 +175,10 @@ steps:
           out: [out]
           run: tool3.cwl
 </pre>
+
+h2(#migrate). Migrating running CWL on jobs API to containers API
+
+* When migrating from jobs API (--api=jobs) (sometimes referred to as "crunch v1") to the containers API (--api=containers) ("crunch v2") there are a few differences in behavior:
+** The tool is limited to accessing only collections which are explicitly listed in the input, and further limited to only the subdirectories of collections listed in input.  For example, given an explicit file input @/dir/subdir/file1.txt@, a tool will not be able to implicitly access the file @/dir/file2.txt@.  Use @secondaryFiles@ or a @Directory@ input to describe trees of files.
+** Files listed in @InitialWorkDirRequirement@ appear in the output directory as normal files (not symlinks) but cannot be moved, renamed or deleted.  These files will be added to the output collection but without any additional copies of the underlying data.
+** Tools are disallowed network access by default.  Tools which require network access must include @arv:APIRequirement: {}@ in their @requirements@ section.