Workflow Configuration
The flow.cylc
File
Cylc workflows are defined in flow.cylc
files that specify the
tasks to be managed by the Cylc scheduler, the dependencies between them,
and the schedules to run them to.
The .cylc
file syntax is described in the File Format Reference.
The configurations you can use are documented in Workflow Configuration.
Cylc also supports two template processors for use in the flow.cylc
file:
Workflow Configuration Directories
A Cylc source directory contains:
flow.cylc
The file which configures the workflow.
bin/
(optional)A directory for scripts and executables used by workflow tasks. It is added to
$PATH
in job environments.Jobs can also run scripting defined in the
flow.cylc
file, executables installed to user-defined locations of the workflow run directory, and external executables.lib/python/
(optional)A directory for Python modules. It is added to
$PYTHONPATH
in the scheduler and job execution environments. It can be used by:Tasks
Custom job runners
Custom Jinja2 Filters
Other files and folders may be placed in the source directory too: documentation, configuration files, etc. When the workflow is installed these will be copied over to the run directory.
Note
If your workflow needs to create or install scripts or executables at runtime and you don’t want Cylc to delete them on re-installation, you can use equivalent directories in the Workflow Share Directories.
Understanding Code in Workflow Configurations
A workflow configuration is not executable code. It configures the scheduler
program to run your workflow. A flow.cylc
file may contain:
Embedded Python-like Jinja2 or EmPy templating code, such as
{% set PLANET = "earth" %}
Bash shell variable assignments and scripting, such as
script = "run-model.exe /path/to/data"
Jinja2 (or EmPy) templating code gets executed as a preprocessing step, to programmatically generate the workflow configuration for the scheduler. To see the result after template processing:
# print the workflow configuration, processed but not parsed:
$ cylc view --process <workflow-id>
# print the workflow configuration, processed and parsed:
$ cylc config <workflow-id>
The scheduler does not interpret shell syntax, but certain string-valued config items may contain shell code that gets written verbatim to job scripts, to be executed by the running job.
Some things to be aware of:
Jinja2 code is evaluated once when the workflow is started.
Jinja2 code can only reference Jinja2 variables, not Cylc config items.
Jinja2 (like Python) has its own syntax for reading environment variables.
Jinja2 code that reads the environment or the filesystem will do so during config file parsing on the scheduler run host, not on job hosts. Beware of doing this in task definitions - do you want the scheduler environment to affect shell code that runs in the job environment?
Shell code destined for the job script can read the environment or access the filesystem as the job runs on the job host, not on the scheduler host.
Syntax Highlighting For Workflow Configuration
Cylc provides syntax plugins for the following editors:
- Atom
install the language-cylc extension.
- Emacs
The syntax file can be obtained from the Cylc library by running the following command
cylc get-resources syntax/cylc-mode.el .
installation instructions are at the top of the file.- Gedit
The syntax file can be obtained from the Cylc library by running the following command
cylc get-resources syntax/cylc.lang .
installation instructions are at the top of the file.- Kate
The syntax file can be obtained from the Cylc library by running the following command
cylc get-resources syntax/cylc.xml .
installation instructions are at the top of the file.- PyCharm
Install the Cylc.tmbundle.
- Vim
The syntax file can be obtained from the Cylc library by running the following command
cylc get-resources syntax/cylc.vim .
installation instructions are at the top of the file.- Visual Studio Code
Install the vscode-cylc extension.
- Sublime Text 3
Install the Cylc.tmbundle.
- TextMate
Install the Cylc.tmbundle.
- WebStorm
Install the Cylc.tmbundle.
- Nano
The syntax file can be obtained from the Cylc library by running the following command
cylc get-resources syntax/cylc.nanorc ~/.config/nano
installation instructions are at the top of the file.
Gross File Structure
Cylc flow.cylc
files consist of configuration items grouped under
several top level section headings:
[meta]
Information about the workflow e.g. title and description.
[scheduler]
Non task-specific workflow configuration.
[task parameters]
Parameters for use when defining graphs and tasks. See Task Parameters.
[scheduling]
Determines when tasks are ready to run.
special scheduling constraints e.g. external triggers.
the dependency graph, which defines the relationships between tasks
[runtime]
Determines how, where, and what to execute when tasks are ready
script, environment, job submission, remote hosting, etc.
workflow-wide defaults in the root family
a nested family hierarchy with common properties inherited by related tasks
Validation
The cylc validate
command evaluates the flow.cylc
file
against a specification that defines all legal entries, values and options.
It also performs some integrity checks designed to catch certain configuration
issues and impossible scheduling constraints.
These checks are also performed by cylc play
before starting a workflow.
All legal entries are documented in the flow.cylc
reference.
If a flow.cylc
file uses include-files cylc view
will
show an inlined copy of the workflow with correct line numbers.
Linting
The cylc lint
command checks code style, deprecated syntax and other
issues in Cylc configuration files.
See also
How to configure Cylc lint at project level
using a pyproject.toml
.
cylc lint
Cylc configuration linter.
Checks code style, deprecated syntax and other issues.
Individual errors can be ignored using the # noqa
line comment.
It is good practice to specify specific errors you wish to ignore using
# noqa: S002 S007 U999
Style
S001
Use multiple spaces, not tabs
S002
Item not indented.
S003
Top level sections should not be indented.
S004
Second level sections should be indented exactly 4 spaces.
S005
Third level sections should be indented exactly 8 spaces.
S006
trailing whitespace.
S007
Family name contains lowercase characters.
S008
jinja2 found: no shebang (#!jinja2)
S009
Host Selection Script may be redundant with platform
S010
Using backticks to invoke subshell is deprecated
S011
Cylc will process commented Jinja2!
S012
line > <max_line_len>
characters. Max line length set in pyproject.toml (default 130)
S013
Items should be indented in 4 space blocks.
7 to 8 upgrades
U001
[scheduling][dependencies][<recurrence>]graph =
-> [scheduling][graph]<recurrence> =
([dependencies]
detected)
U002
[scheduling][dependencies][<recurrence>]graph =
-> [scheduling][graph]<recurrence> =
(graph =
detected)
U003
settings in [runtime][<namespace>][remote]
have been moved to [runtime][<namespace>]
and global.cylc[platforms][<platforms name>]
U004
settings in [runtime][<namespace>][job]
have been moved to [runtime][<namespace>]
and global.cylc[platforms][<platforms name>]
U005
flow.cylc[runtime][<namespace>][job]batch system
-> global.cylc[platforms][<platform name>]job runner
U006
Using backticks to invoke subshell will fail at Cylc 8.
U007
Use built in platform selection instead of rose host-select.
U008
Suicide triggers are not required at Cylc 8.
U009
This line contains an obsolete Cylc CLI command.
U010
rose suite-hook is deprecated at Rose 2,
U011
Leading zeros are no longer valid for Jinja2 integers.
U012
The following environment variables are deprecated:
Deprecated Variable |
New Variable |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
U013
The following environment variables are obsolete:
CYLC_SUITE_DEF_PATH
CYLC_SUITE_DEF_PATH_ON_SUITE_HOST
U014
For datetime operations in task scripts:
Use
isodatetime
instead ofrose date
Use
isodatetime ref
instead ofrose date -c
for the current cycle point
U015
- The following template variables, mostly used in event handlers,are deprecated, and should be replaced:
suite
⇒ workflowsuite_uuid
⇒ uuidbatch_sys_name
⇒ job_runner_namebatch_sys_job_id
⇒ job_iduser@host
⇒ platform_nametask_url
⇒URL
(if set in[meta]URL
)workflow_url
⇒workflow_URL
(if set in[runtime][<namespace>][meta]URL
)
U016
It is no longer necessary to configure the environment variables CYLC_VERSION
, ROSE_VERSION
or FCM_VERSION
.
Auto Generated 7 to 8 upgrades
U998 and U999 represent automatically generated sets of deprecations and upgrades.
[runtime][__MANY__][workflow state polling]run-dir
is now[runtime][__MANY__][workflow state polling]alt-cylc-run-dir
[cylc][authentication]
is not available at Cylc 8[cylc]include at start-up
is not available at Cylc 8[cylc]exclude at start-up
is not available at Cylc 8[cylc]log resolved dependencies
is not available at Cylc 8[cylc]required run mode
is not available at Cylc 8[cylc]health check interval
is not available at Cylc 8[runtime][__MANY__][events]mail retry delays
is not available at Cylc 8[runtime][__MANY__]extra log files
is not available at Cylc 8[runtime][__MANY__][job]shell
is not available at Cylc 8[runtime][__MANY__][remote]suite definition directory
is not available at Cylc 8[cylc]abort if any task fails
is not available at Cylc 8[cylc]disable automatic shutdown
is not available at Cylc 8[cylc][environment]
is not available at Cylc 8[cylc][reference test]
is not available at Cylc 8[cylc][simulation]disable suite event handlers
is not available at Cylc 8[cylc][simulation]
is not available at Cylc 8[visualization]
is not available at Cylc 8[scheduling]spawn to max active cycle points
is not available at Cylc 8[cylc]task event mail interval
is now[cylc][mail]task event batch interval
[runtime][__MANY__][suite state polling]
is now[runtime][__MANY__][workflow state polling]
[runtime][__MANY__][workflow state polling]host
is not available at Cylc 8[runtime][__MANY__][workflow state polling]user
is not available at Cylc 8[cylc][parameters]
is now[task parameters]
[cylc][parameter templates]
is now[task parameters][templates]
[cylc][events]mail to
is now[cylc][mail]to
[cylc][events]mail from
is now[cylc][mail]from
[cylc][events]mail footer
is now[cylc][mail]footer
[runtime][__MANY__][events]mail to
is now[runtime][__MANY__][mail]to
[runtime][__MANY__][events]mail from
is now[runtime][__MANY__][mail]from
[cylc][events]mail smtp
is not available at Cylc 8[runtime][__MANY__][events]mail smtp
is not available at Cylc 8[scheduling]max active cycle points
is now[scheduling]runahead limit
[scheduling]hold after point
is now[scheduling]hold after cycle point
[cylc][events]timeout
is now[cylc][events]stall timeout
[cylc][events]abort on timeout
is now[cylc][events]abort on stall timeout
[cylc][events]inactivity
is now[cylc][events]inactivity timeout
[cylc][events]abort on inactivity
is now[cylc][events]abort on inactivity timeout
[cylc][events]startup handler
is now[cylc][events]startup handlers
[cylc][events]shutdown handler
is now[cylc][events]shutdown handlers
[cylc][events]timeout handler
is now[cylc][events]stall timeout handlers
[cylc][events]stalled handler
is now[cylc][events]stall handlers
[cylc][events]aborted handler
is now[cylc][events]abort handlers
[cylc][events]inactivity handler
is now[cylc][events]inactivity timeout handlers
[runtime][__MANY__][events]expired handler
is now[runtime][__MANY__][events]expired handlers
[runtime][__MANY__][events]late handler
is now[runtime][__MANY__][events]late handlers
[runtime][__MANY__][events]submitted handler
is now[runtime][__MANY__][events]submitted handlers
[runtime][__MANY__][events]started handler
is now[runtime][__MANY__][events]started handlers
[runtime][__MANY__][events]succeeded handler
is now[runtime][__MANY__][events]succeeded handlers
[runtime][__MANY__][events]failed handler
is now[runtime][__MANY__][events]failed handlers
[runtime][__MANY__][events]submission failed handler
is now[runtime][__MANY__][events]submission failed handlers
[runtime][__MANY__][events]warning handler
is now[runtime][__MANY__][events]warning handlers
[runtime][__MANY__][events]critical handler
is now[runtime][__MANY__][events]critical handlers
[runtime][__MANY__][events]retry handler
is now[runtime][__MANY__][events]retry handlers
[runtime][__MANY__][events]submission retry handler
is now[runtime][__MANY__][events]submission retry handlers
[runtime][__MANY__][events]execution timeout handler
is now[runtime][__MANY__][events]execution timeout handlers
[runtime][__MANY__][events]submission timeout handler
is now[runtime][__MANY__][events]submission timeout handlers
[runtime][__MANY__][events]custom handler
is now[runtime][__MANY__][events]custom handlers
[cylc][events]abort on stalled
is not available at Cylc 8[cylc][events]abort if startup handler fails
is not available at Cylc 8[cylc][events]abort if shutdown handler fails
is not available at Cylc 8[cylc][events]abort if timeout handler fails
is not available at Cylc 8[cylc][events]abort if inactivity handler fails
is not available at Cylc 8[cylc][events]abort if stalled handler fails
is not available at Cylc 8[cylc]
is now[scheduler]
Configure cylc lint
at project level
You can configure cylc lint
for each workflow using a
pyproject.toml
file.
To define settings for cylc lint
use a [tool.cylc.lint]
section.
Within the [tool.cylc.lint]
section you may define the following:
rulesets
A list of rulesets to use.
Allowed values:
'728'
,'style'
,'all'
.(You can override this on the command line.)
ignore
Individual rules to ignore: A list of rule codes, such as
S007
.exclude
A list of files or glob patterns for files which will not be checked.
max-line-length
Set longest line length to permit in Cylc configs for this project.
Default:
130
.
Note
Changed in version 8.3.0: The [cylc-lint]
section has been deprecated in favour of
[tool.cylc.lint]
.
An example pyproject.toml
might look like this:
[tool.cylc.lint]
# Enforce a line limit of 99 chars
max-line-length = 99
# Ignore style [S] rule 007 (It's good practice comment with a reason)
ignore = ['S007'] # Family names start with lowercase in this workflow
# Don't check files matching these globs
exclude = ['history/*.old.cylc', 'someother.cylc']
# By default check for style
rulesets = ['style']
[some-other-section]
# Cylc lint won't pay any attention to this.