CWL の requirements 一巡り: InplaceUpdateRequirement
この記事は CWL Advent Calendar 2020 の16日目の記事です。
Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]。
今回は CWL v1.2 で定義されている InplaceUpdateRequirement
について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。
対象読者
- CWL をかじったことがあるけど
requirements
はよくわからない人- つまり中級者以上が対象です。
- 初心者は CWL Advent Calendar 2020 の初日の記事へ Go!
例
Conformance test #235 内の step2
: tests/updateval_inplace.cwl:
#!/usr/bin/env cwl-runner
class: CommandLineTool
cwlVersion: v1.2
requirements:
InitialWorkDirRequirement:
listing:
- entry: $(inputs.r)
writable: true
InplaceUpdateRequirement:
inplaceUpdate: true
hints:
DockerRequirement:
dockerPull: "python:2.7.15-alpine3.7"
inputs:
r: File
script:
type: File
default:
class: File
location: updateval.py
outputs:
out:
type: File
outputBinding:
glob: $(inputs.r.basename)
arguments: [python, $(inputs.script), $(inputs.r.basename)]
import sys
f = open(sys.argv[1], "r+")
val = int(f.read())
f.seek(0)
f.write(str(val+1))
f.close()
11日目に紹介した InitialWorkDirRequirement
は、ファイルの内容を変更するために writable: true
を指定した場合、$(runtime.outdir)
にオリジナルのファイルのコピーを行います。InplaceUpdateRequirement.inplaceUpdate
に true
を指定することで、ファイルのコピーを行わずに、直接ファイル内容を更新することが可能になります(デフォルトは inplaceUpdate: false
)。上のツール定義では、$(inputs.r)
の内容を updateval.py
で変更し、変更したファイルを $(outputs.out)
として返しています。
InplaceUpdateRequirement
の節で以下のように説明されている通り、この Process requirement を使用すると再現性に悪影響が出る可能性があります。そのため「ストレージへの書き込み時間がシャレにならないくらい長い」などの強い理由が無い限りは利用しないほうが良いでしょう。
Users and implementers should be aware that workflows that destructively modify inputs may not be repeatable or reproducible. In particular, enabling this feature implies that WorkReuse should not be enabled.
Discussion