🐓

CWL の requirements 一巡り: InplaceUpdateRequirement

2020/12/15に公開

この記事は CWL Advent Calendar 2020 の16日目の記事です。

Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]

今回は CWL v1.2 で定義されている InplaceUpdateRequirement について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。

対象読者

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)]

updateval.py

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.inplaceUpdatetrue を指定することで、ファイルのコピーを行わずに、直接ファイル内容を更新することが可能になります(デフォルトは 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.

脚注
  1. つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎

Discussion