Skip to content

EO application API Workflow

EOAP API Workflow - Orchestrating CWL CommandLineTools

The EOAP API Workflow chains together three main steps — discovery, prepare-execute-request, and processes — to query a STAC API, prepare an OGC API Processes execution request, and finally run the requested process.

It takes the following input parameters:

  • a STAC API endpoint
  • a STAC search request (query parameters)
  • a Processes API endpoint
  • an execution request template for OGC API Processes

And produces as outputs:

  • the results of the STAC search (search results as a JSON file)
  • the process execution result (OGC API Process output as a JSON file)
graph TB A[STAC API Endpoint] --> B(("Discovery Step")) P[Search Request] --> B B --> C1[Search Results] C1 --> C2["<font size=2% color='blue'>discovery-output.json</font>"] C2 --> D(("Prepare Execute Request")) D --> D2["<pre style='text-align:left; color:black;'> execute_request.json: { inputs: - stac_items - aoi - bands - epsg } </pre>"] D --> D3[process_id.json] D2 --> E(("Processes Step")) D3 --> E R[Processes API Endpoint] --> E E --> F[Workflow Output] C2 -->F F --> I["<font size=2% color='green'>feature-collection.json</font>"] F --> G["<font size=2% color='gray'>discovery-output.json</font>"] subgraph EOAP Workflow B C1 C2 D D2 D3 E end

Workflow Steps

  1. Discovery Step Uses the provided stac_api_endpoint and search_request to query a STAC API. The result is saved as search_output.

    • Output: discovery-output.json — This JSON file contains the results from discovering the STAC endpoint. It is generated using stac-api-client.0.1.0.cwl.
  2. Prepare Execute Request Step Combines the initial execute_request template with the search_output from the discovery step.

  3. Extracts STAC item URLs from the search results.

  4. Inserts them into the .inputs.stac_items field of the execution request.
  5. Removes the process_id from the request and stores it separately.
  6. Outputs:

    • execute_request.json — the updated request ready to be sent.
    • process_id.json — the process identifier.
  7. Processes Step Executes the OGC API Process using the processes_api_endpoint, the prepared execute_request.json, and the process_id. The result is stored in feature-collection.json.

The CWL Workflow is shown below and the lines highlighted chain the steps:

eoap-api-cli.cwl
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/usr/bin/env cwl-runner

$graph:
- class: Workflow
  id: eoap-api
  label: EOAP API Workflow
  requirements:
  - class: InlineJavascriptRequirement
  - class: SchemaDefRequirement
    types:
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml
    - $import: |-
        https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml
  - class: NetworkAccess
    networkAccess: true
  inputs:
  - id: stac_api_endpoint
    type: |-
      https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
  - id: search_request
    type: |-
      https://raw.githubusercontent.com/eoap/schemas/main/experimental/discovery.yaml#STACSearchSettings
  - id: processes_api_endpoint
    type: |-
      https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
  - id: execute_request
    type: |-
      https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml#OGCExecuteProcessSettings

  outputs:
  - id: search_output
    outputSource:
      - discovery/search_output
    type: File
  - id: process_output
    outputSource:
      - processes/process_output
    type: File

  steps:
    discovery:
      label: Discovery Step
      in:
        api_endpoint: stac_api_endpoint
        search_request: search_request
      run: https://github.com/eoap/schemas/releases/download/0.1.0/stac-api-client.0.1.0.cwl
      out:
      - search_output

    prepare-execute-request:
      label: Prepare Execute Request
      in:
        in_execute_request: execute_request
        search_results:
          source: discovery/search_output
      run: '#prepare-execute-request'
      out:
      - execute_request
      - process_id

    processes:
      label: Processes Step
      in:
        api_endpoint: processes_api_endpoint
        execute_request: 
          source: prepare-execute-request/execute_request
        process_id:
          source: prepare-execute-request/process_id
      run: '#ogc-api-processes-client'
      out: 
      - process_output



- class: CommandLineTool
  id: prepare-execute-request
  label: Prepare Execute Request
  doc: Prepare the execute request for OGC API Processes based on search results 

  baseCommand: ["/bin/bash", "run.sh"]
  arguments: []

  requirements:
  - class: InlineJavascriptRequirement
  - class: SchemaDefRequirement
    types:
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml
    - $import: |-
        https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml
  - class: NetworkAccess
    networkAccess: true
  - class: InitialWorkDirRequirement
    listing:
    - entryname: input_execute_request.json
      entry: |-
        ${ return JSON.stringify(inputs.in_execute_request, null, 2); }
    - entryname: process_id.json
      entry: |-
        ${ return JSON.stringify(inputs.in_execute_request.process_id, null, 2); }
    - entryname: run.sh
      entry: |-
        #!/usr/bin/env bash
        set -x
        set -euo pipefail


        jq '[.features[].links[] | select(.rel=="self") | .href]' "$(inputs.search_results.path)" > stac_items.json

        jq --argjson stac_items "`cat stac_items.json`" \
          'del(.process_id) | .inputs.stac_items = $stac_items' \
          input_execute_request.json > execute_request.json

        cat execute_request.json | jq .

  inputs:
    in_execute_request:
      label: OGC API Processes settings
      doc: OGC API Processes settings for Landsat-9 data
      type: |-
        https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml#OGCExecuteProcessSettings

    search_results:
      label: Search Results
      doc: Search results from the discovery step
      type: File

  outputs:
    execute_request:
      type: File
      outputBinding:
        glob: execute_request.json
    process_id:
      type: Any
      outputBinding:
        glob: process_id.json
        loadContents: true
        outputEval: ${ return JSON.parse(self[0].contents); }



- class: CommandLineTool
  id: ogc-api-processes-client
  label: geo API - Processes

  requirements:
  - class: InlineJavascriptRequirement
  - class: DockerRequirement
    dockerPull:  localhost/ogc 
  - class: SchemaDefRequirement
    types:
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/string_format.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/geojson.yaml
    - $import: |-
        https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml
    - $import: https://raw.githubusercontent.com/eoap/schemas/main/experimental/process.yaml
  inputs:
    api_endpoint:
      label: OGC API endpoint
      doc: OGC API endpoint for Landsat-9 data
      type: |-
        https://raw.githubusercontent.com/eoap/schemas/main/experimental/api-endpoint.yaml#APIEndpoint
    execute_request:
      label: OGC API Processes settings
      doc: OGC API Processes settings for Landsat-9 data
      type: File
    process_id:
      label: Process ID
      doc: Process ID for the OGC API Processes
      type: Any

  outputs:
    process_output:
      type: File
      outputBinding:
        glob: feature-collection.json
  baseCommand: ["ogc-api-processes-client"]
  arguments:
    - --api-endpoint
    - $(inputs.api_endpoint.url.value)
    - --process-id
    - $(inputs.process_id)
    - --execute-request 
    - $(inputs.execute_request.path)
    - --output
    - feature-collection.json


cwlVersion: v1.2