Files
st-flow-tests/specs/schema.md
2026-03-04 10:14:40 +00:00

4.7 KiB

Flow Spec Schema

The YAML spec format for declarative ST AR flow definitions.

Top-Level Structure

version: "1.0"          # Spec format version
meta:                   # Human-readable metadata
  name: <string>
  description: <string>
application: ...        # AR Application definition
subscription: ...       # Subscription definition
routes: ...             # Route definitions (simple, template, composite)
prerequisites: ...      # Resources that must exist before deploy

application

application:
  name: <string>        # AR application name (must be unique in ST)
  type: AdvancedRouting # Always AdvancedRouting for AR flows

subscription

subscription:
  account: <string>         # ST account name that owns the subscription
  folder: /<path>           # Upload folder that triggers routing (absolute path)
  application: <string>     # AR application name (must match application.name)
  post_transmission_actions:
    ptaOnSuccessDoInAdvancedRoutingWildcardPull: true
    submitFilenamePatternExpression: "*"   # "*" = trigger on any file
    submitFilterType: FILENAME_PATTERN
    triggerFileOption: fail
    triggerOnSuccessfulWildcardPull: true

Note: submitFilenamePatternExpression here only affects server-initiated pulls. For client-uploaded files, use route-level condition to filter by file type.

routes.simple — Steps

Steps are applied in array order. Each step sees all files in the route payload unless usePrecedingStepFiles: true is set.

Compress step

- type: Compress
  conditionType: ALWAYS           # Required. ALWAYS or EL.
  actionOnStepFailure: PROCEED    # PROCEED = non-matching files continue
  fileFilterExpression: "*.txt"   # GLOB or REGEX
  fileFilterExpressionType: GLOB
  usePrecedingStepFiles: false    # false = see all route files
  singleArchiveEnabled: false     # false = one ZIP per file; true = bundle all
  compressionMode: ZIP            # ZIP (default) or GZIP

Output filename: <original>.zip

PgpEncryption step

- type: PgpEncryption
  conditionType: ALWAYS
  actionOnStepFailure: PROCEED
  fileFilterExpression: "*.md"
  fileFilterExpressionType: GLOB
  usePrecedingStepFiles: false
  encryptKeyExpression: <cert-alias>          # The cert name in ST cert store
  encryptKeyExpressionType: ALIAS             # ALIAS or EXPRESSION_WILDCARD only
  encryptKeyOwnerExpression: <account-name>   # Account that owns the cert
  encryptKeyOwnerExpressionType: NAME
  compressionType: "0"                        # "0" = no PGP compression
  useAsciiArmour: false                       # false = binary; true = ASCII armored
  signKeyExpression: null                     # Optional: signing key alias
  signKeyExpressionType: null
  signKeyOwnerExpression: null
  signKeyOwnerExpressionType: null

Output filename: <original>.pgp

Cert requirements: accessLevel: PUBLIC, account: <owner-account> (not null). encryptKeyExpressionType only accepts ALIAS or EXPRESSION_WILDCARD — not NAME.

SendToPartner step

- type: SendToPartner
  conditionType: ALWAYS
  actionOnStepFailure: FAIL
  fileFilterExpression: "*"
  fileFilterExpressionType: GLOB
  usePrecedingStepFiles: false
  partnerName: <partner-account>              # ST partner account name
  partnerSite: <partner-site-name>            # ST partner site name

ExternalScript step

- type: ExternalScript
  conditionType: ALWAYS
  actionOnStepFailure: PROCEED
  fileFilterExpression: "*"
  fileFilterExpressionType: GLOB
  usePrecedingStepFiles: false
  scriptPath: /path/to/script.sh
  outputFileExpression: "${basename}.out"

routes.template

template:
  name: <string>
  conditionType: MATCH_ALL    # Always MATCH_ALL for templates

routes.composite

composite:
  name: <string>
  conditionType: MATCH_ALL    # Always MATCH_ALL for composites

prerequisites

Resources validated by st_env_snapshot.py before any deploy:

prerequisites:
  accounts:
    - name: <account-name>
      type: individual | partner
  partner_accounts:
    - name: <account-name>
  partner_sites:
    - name: <site-name>
      partner: <partner-account-name>
  certificates:
    - name: <cert-alias>
      type: pgp | ssh | x509
      usage: partner | local | private
      account: <owner-account>
      accessLevel: PUBLIC | PRIVATE

If any prerequisite is missing, st_deploy.py exits with code 2 before making any changes.

EL Conditions (route-level filtering)

To filter which files enter a route by extension:

routes:
  simple:
    conditionType: EL
    condition: "${transfer.target.matches('.*\\.txt')}"
  • transfer.target = full file path
  • Use Java regex with double-escaped dot (\\. not \.)
  • Single-escape throws AR0045 at runtime