$base: http://commonwl.org/cwltool#
$namespaces:
  cwl: "https://w3id.org/cwl/cwl#"
$graph:
- $import: https://w3id.org/cwl/CommonWorkflowLanguage.yml

- name: LoadListingRequirement
  type: record
  extends: cwl:ProcessRequirement
  inVocab: false
  fields:
    class:
      type: string
      doc: "Always 'LoadListingRequirement'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    loadListing:
      type:
        - type: enum
          name: LoadListingEnum
          symbols: [no_listing, shallow_listing, deep_listing]

- name: InplaceUpdateRequirement
  type: record
  inVocab: false
  extends: cwl:ProcessRequirement
  fields:
    class:
      type: string
      doc: "Always 'InplaceUpdateRequirement'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    inplaceUpdate:
      type: boolean

- name: Secrets
  type: record
  inVocab: false
  extends: cwl:ProcessRequirement
  fields:
    class:
      type: string
      doc: "Always 'Secrets'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    secrets:
      type: string[]
      doc: |
        List one or more input parameters that are sensitive (such as passwords)
        which will be deliberately obscured from logging.
      jsonldPredicate:
        "_type": "@id"
        refScope: 0


- name: TimeLimit
  type: record
  inVocab: false
  extends: cwl:ProcessRequirement
  doc: |
    Set an upper limit on the execution time of a CommandLineTool or
    ExpressionTool.  A tool execution which exceeds the time limit may
    be preemptively terminated and considered failed.  May also be
    used by batch systems to make scheduling decisions.
  fields:
    - name: class
      type: string
      doc: "Always 'TimeLimit'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    - name: timelimit
      type: [long, string]
      doc: |
        The time limit, in seconds.  A time limit of zero means no
        time limit.  Negative time limits are an error.


- name: WorkReuse
  type: record
  inVocab: false
  extends: cwl:ProcessRequirement
  doc: |
    For implementations that support reusing output from past work (on
    the assumption that same code and same input produce same
    results), control whether to enable or disable the reuse behavior
    for a particular tool or step (to accomodate situations where that
    assumption is incorrect).  A reused step is not executed but
    instead returns the same output as the original execution.

    If `enableReuse` is not specified, correct tools should assume it
    is enabled by default.
  fields:
    - name: class
      type: string
      doc: "Always 'WorkReuse'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    - name: enableReuse
      type: [boolean, string]
      #default: true


- name: NetworkAccess
  type: record
  inVocab: false
  extends: cwl:ProcessRequirement
  doc: |
    Indicate whether a process requires outgoing IPv4/IPv6 network
    access.  Choice of IPv4 or IPv6 is implementation and site
    specific, correct tools must support both.

    If `networkAccess` is false or not specified, tools must not
    assume network access, except for localhost (the loopback device).

    If `networkAccess` is true, the tool must be able to make outgoing
    connections to network resources.  Resources may be on a private
    subnet or the public Internet.  However, implementations and sites
    may apply their own security policies to restrict what is
    accessible by the tool.

    Enabling network access does not imply a publically routable IP
    address or the ability to accept inbound connections.

  fields:
    - name: class
      type: string
      doc: "Always 'NetworkAccess'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    - name: networkAccess
      type: [boolean, string]

- name: ProcessGenerator
  type: record
  inVocab: true
  extends: cwl:Process
  documentRoot: true
  fields:
    - name: class
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
      type: string
    - name: run
      type: [string, cwl:Process]
      jsonldPredicate:
        _id: "cwl:run"
        _type: "@id"
      doc: |
        Specifies the process to run.

- name: MPIRequirement
  type: record
  inVocab: false
  extends: cwl:ProcessRequirement
  doc: |
    Indicates that a process requires an MPI runtime.
  fields:
    - name: class
      type: string
      doc: "Always 'MPIRequirement'"
      jsonldPredicate:
        "_id": "@type"
        "_type": "@vocab"
    - name: processes
      type: [int, string]
      doc: |
        The number of MPI processes to start. If you give a string,
        this will be evaluated as a CWL Expression and it must
        evaluate to an integer.
