diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 48a1ae6d5119f1..d1651b415f2074 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -180,6 +180,18 @@ repos: entry: koalaman/shellcheck:stable -x -a files: ^breeze$|^breeze-complete$|\.sh$|^hooks/build$|^hooks/push$|\.bash$|\.bats$ exclude: ^airflow/_vendor/.*$ + - id: lint-openapi + name: Lint OpenAPI using speccy + language: docker_image + entry: wework/speccy lint + files: ^openapi.yaml$ + - id: lint-openapi + name: Litn OpenAPI using openapi-spec-validator + entry: openapi-spec-validator --schema 3.0.0 openapi.yaml + language: python + additional_dependencies: ['openapi-spec-validator'] + pass_filenames: false + files: ^openapi.yaml$ - id: lint-dockerfile name: Lint dockerfile language: system diff --git a/openapi.yaml b/openapi.yaml new file mode 100644 index 00000000000000..b025b461594ddb --- /dev/null +++ b/openapi.yaml @@ -0,0 +1,2069 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +--- +openapi: 3.0.3 + +info: + title: "Airflow API (Stable)" + description: Apache Airflow management API. + version: '1.0.0' + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + contact: + name: Apache Foundation + url: http://www.airflow.apache.org + email: dev@airflow.apache.org + +servers: + - url: /api/v1 + description: Airfow Stable API. + +paths: + # Database entities + /connections: + get: + summary: Get all connection entries + operationId: getConnections + tags: [Connection] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of connection entry. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/ConnectionCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + post: + summary: Create connection entry + operationId: createConnection + tags: [Connection] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Connection' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Connection' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /connections/{connection_id}: + parameters: + - $ref: '#/components/parameters/ConnectionID' + + get: + summary: Get a connection entry + operationId: getConnection + tags: [Connection] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Connection' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update a connection entry + operationId: patchConnection + tags: [Connection] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Connection' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Connection' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete a connection entry + operationId: deleteConnection + tags: [Connection] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /dags: + get: + summary: Get all DAGs + operationId: getDags + tags: [DAG] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of DAGs. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/DAGCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + + /dags/{dag_id}: + parameters: + - $ref: '#/components/parameters/DAGID' + + get: + summary: Get basic information about a DAG + description: Presents only information available at database (DAGModel). + operationId: getDag + tags: [DAG] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/DAG' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update the specific DAG + operationId: updateDag + tags: [DAG] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/DAG' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dags/{dag_id}/dagRuns: + parameters: + - $ref: '#/components/parameters/DAGID' + + get: + summary: Get all DAG Runs + description: > + This endpoint support reading resources across multiple DAGs by specifying a "-" as a dag_id. + operationId: getDagRuns + tags: [DAGRun] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of DAG Runs. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/DAGRunCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + + /dags/{dag_id}/dagRuns/{dag_run_id}: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/DAGRunID' + + get: + summary: Get a DAG Run + operationId: getDagRun + tags: [DAGRun] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/DAGRun' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update a DAG Run + operationId: updateDagRun + tags: [DAGRun] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/DAGRun' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/DAGRun' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete a DAG Run + operationId: deleteDagRun + tags: [DAGRun] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /eventLogs: + get: + summary: Get all log entries from event log + operationId: getEventLog + tags: [EventLog] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of log entries. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/EventLogCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + post: + summary: Create event log + operationId: createEventLog + tags: [EventLog] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/EventLog' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/EventLog' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /eventLogs/{event_log_id}: + parameters: + - $ref: '#/components/parameters/EventLogID' + + get: + summary: Get a log entry + operationId: getEventLogEntry + tags: [EventLog] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/EventLog' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update a log entry + operationId: updateEventLogEntry + tags: [EventLog] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/EventLog' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/EventLog' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete a log entry + operationId: deleteEventLogEntry + tags: [EventLog] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /importErrors: + get: + summary: Get all import errors + operationId: getImportErrors + tags: [ImportError] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of import errors. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/ImportErrorCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /importErrors/{import_error_id}: + parameters: + - $ref: '#/components/parameters/ImportErrorID' + + get: + summary: Get an import errors + operationId: getImportError + tags: [ImportError] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/ImportError' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete an import error + operationId: deleteImportError + tags: [ImportError] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /pools: + get: + summary: Get all pools + operationId: getPools + tags: [Pool] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of pools. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/PoolCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + post: + summary: Create aa pool + operationId: createPool + tags: [Pool] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Pool' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Pool' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /pools/{pool_id}: + parameters: + - $ref: '#/components/parameters/PoolID' + + get: + summary: Get a pool + operationId: getPool + tags: [Pool] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Pool' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update a pool + operationId: upadtePool + tags: [Pool] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Pool' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Connection' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete a pool + operationId: deletePool + tags: [Pool] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /dags/{dag_id}/taskInstances: + parameters: + - $ref: '#/components/parameters/DAGID' + + get: + summary: Get list of task instance of DAG. + description: > + This endpoint support reading resources across multiple DAGs by specifying a "-" as a dag_id. + operationId: getTaskInstances + tags: [Pool] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of task instances. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/TaskInstanceCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /dags/{dag_id}/taskInstances/{task_id}/{execution_date}: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/TaskID' + - $ref: '#/components/parameters/ExecutionDate' + + get: + summary: Get a task instance + operationId: getTaskInstance + tags: [TaskInstance] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/TaskInstance' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update a task instance + operationId: updateTaskInstance + tags: [TaskInstance] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + + content: + application/json: + schema: + $ref: '#/components/schemas/TaskInstance' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/TaskInstance' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete DAG Run + operationId: deleteTaskInstance + tags: [TaskInstance] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /variables: + get: + summary: Get all variables + operationId: getVariables + tags: [Variable] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of variables. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/VariableCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + post: + summary: Create a variables + operationId: createVariable + tags: [Variable] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Variable' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Variable' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /variables/{variable_id}: + parameters: + - $ref: '#/components/parameters/VariableID' + + get: + summary: Get a variables by id + operationId: getVariable + description: The collection does not contain data. To get data, you must get a single entity. + tags: [Variable] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Variable' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update a variable by id + operationId: updateVariable + tags: [Variable] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Variable' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Variable' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete variable + operationId: deleteVariable + tags: [Variable] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /variables/lookup: + parameters: + - $ref: '#/components/parameters/VariableKey' + + get: + summary: Get variable using its key. + description: The response contains all fields, including data. + operationId: lookupVariable + tags: [Variable] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Variable' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dags/{dag_id}/taskInstances/{task_id}/{execution_date}/xcomValues: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/TaskID' + - $ref: '#/components/parameters/ExecutionDate' + + get: + summary: Get all XCom values + description: + This endpoint support reading resources across multiple Task Instances by specifying a + "-" as a `dag_id`, `task_id` and `execution_date`. + operationId: getXComValues + tags: [XCom] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: List of XCom values. + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/XComCollection' + - $ref: '#/components/schemas/CollectionInfo' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + post: + summary: Create an XCom entry + operationId: updateXComValues + tags: [XCom] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/XCom' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/XCom' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + /dags/{dag_id}/taskInstances/{task_id}/{execution_date}/xcomValues/{key}: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/TaskID' + - $ref: '#/components/parameters/ExecutionDate' + - $ref: '#/components/parameters/XComKey' + + get: + summary: Get an XCom entry + operationId: getXComValue + tags: [XCom] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/XCom' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + patch: + summary: Update an XCom entry + operationId: updateXComValue + tags: [XCom] + parameters: + - $ref: '#/components/parameters/UpdateMask' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/XCom' + + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/XCom' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + delete: + summary: Delete an XCom entry + operationId: deleteXComValue + tags: [XCom] + responses: + '204': + description: No content. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + + # Non-database resources + /dags/{dag_id}/taskInstances/{task_id}/{execution_date}/links: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/TaskID' + - $ref: '#/components/parameters/ExecutionDate' + + get: + summary: Get extra links for task instance + operationId: getExtraLinks + tags: [TaskInstance] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/ExtraLinkCollection' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dags/{dag_id}/taskInstances/{task_id}/{execution_date}/logs/{task_try_number}: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/TaskID' + - $ref: '#/components/parameters/ExecutionDate' + - $ref: '#/components/parameters/TaskTryNumber' + - $ref: '#/components/parameters/NoChunking' + - $ref: '#/components/parameters/ContinuationToken' + + get: + summary: Get logs for specific task instance + operationId: getLogs + tags: [TaskInstance] + responses: + '200': + description: Content of logs. + content: + application/json: + schema: + type: object + properties: + continuation_token: + type: string + content: + type: string + text/plain: + schema: + type: string + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dags/{dag_id}/structure: + parameters: + - $ref: '#/components/parameters/DAGID' + + get: + summary: Get simplified representation of DAG. + operationId: getDagStructure + tags: [DAG] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/DagStructure' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dags/{dag_id}/tasks: + parameters: + - $ref: '#/components/parameters/DAGID' + + get: + summary: Get tasks for DAG + operationId: getTasks + tags: [DAG] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/TaskCollection' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dags/{dag_id}/tasks/{task_id}: + parameters: + - $ref: '#/components/parameters/DAGID' + - $ref: '#/components/parameters/TaskID' + + get: + summary: Get simplified representation of a task. + operationId: getTask + tags: [DAG] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Task' + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /dagSources/{file_token}: + parameters: + - $ref: '#/components/parameters/FileToken' + + get: + summary: Get source code using file token + operationId: getDagSource + tags: [DAG] + responses: + '200': + description: Successful response. + content: + application/json: + schema: + type: object + properties: + content: + type: string + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + '404': + $ref: '#/components/responses/NotFound' + + /config: + get: + summary: Get current configuration + operationId: getConfig + tags: [Config] + parameters: + - $ref: '#/components/parameters/PageLimit' + - $ref: '#/components/parameters/PageOffset' + responses: + '200': + description: Return current configuration. + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + text/plain: + schema: + type: string + '401': + $ref: '#/components/responses/Unauthenticated' + '403': + $ref: '#/components/responses/PermissionDenied' + +components: + # Reusable schemas (data models) + schemas: + # Database entities + ConnectionCollectionItem: + type: object + properties: + id: + type: integer + readOnly: true + conn_id: + type: string + conn_type: + type: string + host: + type: string + login: + type: string + schema: + type: string + port: + type: integer + + ConnectionCollection: + type: object + properties: + connections: + type: array + items: + $ref: '#/components/schemas/ConnectionCollectionItem' + + Connection: + allOf: + - $ref: '#/components/schemas/ConnectionCollectionItem' + - type: object + properties: + password: + type: string + format: password + extra: + type: string + + DAG: + type: object + properties: + dag_id: + type: string + readOnly: true + root_dag_id: + type: string + readOnly: true + is_paused: + type: string + is_subdag: + type: string + readOnly: true + is_active: + type: string + readOnly: true + fileloc: + type: string + readOnly: true + owners: + type: string + readOnly: true + description: + type: string + readOnly: true + schedule_interval: + oneOf: + - $ref: '#/components/schemas/ScheduleInterval' + readOnly: true + tags: + type: array + items: + $ref: '#/components/schemas/Tag' + readOnly: true + + DAGCollection: + type: object + properties: + dag_model: + type: array + items: + $ref: '#/components/schemas/DAG' + + DAGRun: + type: object + properties: + dag_id: + type: string + readOnly: true + execution_date: + type: string + format: date-time + readOnly: true + start_date: + type: string + format: date-time + end_date: + type: string + format: date-time + state: + $ref: '#/components/schemas/TaskState' + run_id: + type: string + external_trigger: + type: boolean + default: true + + DAGRunCollection: + type: object + properties: + dag_runs: + type: array + items: + $ref: '#/components/schemas/DAGRun' + + EventLog: + type: object + properties: + id: + type: integer + readOnly: true + dttm: + type: string + readOnly: true + dag_id: + type: string + readOnly: true + task_id: + type: string + readOnly: true + event: + type: string + readOnly: true + execution_date: + type: string + readOnly: true + owner: + type: string + readOnly: true + extra: + type: string + readOnly: true + + EventLogCollection: + type: object + properties: + event_logs: + type: array + items: + $ref: '#/components/schemas/EventLogCollection' + + ImportError: + type: object + properties: + id: + type: integer + readOnly: true + timestamp: + type: string + format: datetime + readOnly: true + filename: + type: string + readOnly: true + stack_trace: + type: string + readOnly: true + + ImportErrorCollection: + type: object + properties: + import_errors: + type: array + items: + $ref: '#/components/schemas/ImportError' + + Pool: + type: object + properties: + id: + type: integer + readOnly: true + name: + type: string + slots: + type: integer + occupied_slots: + type: integer + readOnly: true + used_slots: + type: integer + readOnly: true + queued_slots: + type: integer + readOnly: true + open_slots: + type: integer + readOnly: true + + PoolCollection: + type: object + properties: + pools: + type: array + items: + $ref: '#/components/schemas/Pool' + + SLAMiss: + type: object + properties: + task_id: + type: string + readOnly: true + dag_id: + type: string + execution_date: + type: string + format: datetime + email_sent: + type: boolean + timestamp: + type: string + format: datetime + description: + type: string + notification_sent: + type: boolean + + SLAMissCollection: + type: object + properties: + sla_misses: + type: array + items: + $ref: '#/components/schemas/SLAMiss' + + TaskFail: + type: object + properties: + task_id: + type: string + dag_id: + type: string + execution_date: + type: string + format: datetime + start_date: + type: string + format: datetime + end_date: + type: string + format: datetime + duration: + type: integer + + TaskInstance: + type: object + properties: + task_id: + type: string + dag_id: + type: string + execution_date: + type: string + format: datetime + start_date: + type: string + format: datetime + end_date: + type: string + format: datetime + duration: + type: number + state: + $ref: '#/components/schemas/TaskState' + try_number: + type: integer + max_tries: + type: integer + hostname: + type: string + unixname: + type: string + job_id: + type: integer + pool: + type: string + pool_slots: + type: integer + queue: + type: string + priority_weight: + type: integer + operator: + type: string + queued_dttm: + type: string + pid: + type: integer + executor_config: + type: string + sla_miss: + $ref: '#/components/schemas/SLAMiss' + + TaskInstanceCollection: + type: object + properties: + task_instances: + type: array + items: + $ref: '#/components/schemas/TaskInstance' + + VariableCollectionItem: + # Divided into two schemas for sensitive data protection + type: object + properties: + id: + type: string + key: + type: string + + VariableCollection: + type: object + properties: + task_instances: + type: array + items: + $ref: '#/components/schemas/VariableCollectionItem' + + Variable: + allOf: + - $ref: '#/components/schemas/VariableCollectionItem' + - type: object + properties: + value: + type: string + + XComCollectionItem: + # Divided into two schemas for sensitive data protection + type: object + properties: + key: + type: string + timestamp: + type: string + format: datetime + execution_date: + type: string + format: datetime + task_id: + type: string + dag_id: + type: string + + XComCollection: + type: object + properties: + xcom: + type: array + items: + $ref: '#/components/schemas/XComCollectionItem' + + XCom: + allOf: + - $ref: '#/components/schemas/XComCollectionItem' + - type: object + properties: + value: + type: string + + # Python objects + # Based on + # airflow/serialization/schema.json + # but simplified to make the easier to use and to make backward compatibility easier. + DagStructure: + type: object + properties: + dag_id: + type: string + readOnly: true + timezone: + $ref: '#/components/schemas/Timezone' + schedule_interval: + $ref: '#/components/schemas/ScheduleInterval' + catchup: + type: boolean + readOnly: true + is_subdag: + type: boolean + readOnly: true + fileloc: + type: string + readOnly: true + orientation: + type: string + readOnly: true + description: + type: string + readOnly: true + concurrency: + type: number + readOnly: true + start_date: + type: string + format: 'date-time' + readOnly: true + dag_run_timeout: + $ref: '#/components/schemas/TimeDelta' + doc_md: + type: string + readOnly: true + default_view: + type: string + readOnly: true + tags: + type: array + readOnly: true + items: + $ref: '#/components/schemas/Tag' + + DagStructureCollection: + type: object + properties: + dag_structures: + type: array + items: + $ref: '#/components/schemas/DagStructure' + + ExtraLink: + type: object + properties: + class_ref: + $ref: '#/components/schemas/ClassReference' + name: + type: string + readOnly: true + href: + type: string + readOnly: true + + ExtraLinkCollection: + type: object + properties: + extra_links: + type: array + items: + $ref: '#/components/schemas/ExtraLink' + + Task: + type: object + properties: + class_ref: + $ref: '#/components/schemas/ClassReference' + task_id: + type: string + readOnly: true + owner: + type: string + readOnly: true + start_date: + type: string + format: 'date-time' + readOnly: true + end_date: + type: string + format: 'date-time' + readOnly: true + trigger_rule: + $ref: '#/components/schemas/TriggerRule' + extra_links: + type: array + readOnly: true + items: + type: object + properties: + class_ref: + $ref: '#/components/schemas/ClassReference' + depends_on_past: + type: boolean + readOnly: true + wait_for_downstream: + type: boolean + readOnly: true + retries: + type: number + readOnly: true + queue: + type: string + readOnly: true + pool: + type: string + readOnly: true + pool_slots: + type: number + readOnly: true + execution_timeout: + $ref: '#/components/schemas/TimeDelta' + retry_delay: + $ref: '#/components/schemas/TimeDelta' + retry_exponential_backoff: + type: boolean + readOnly: true + priority_weight: + type: number + readOnly: true + weight_rule: + $ref: '#/components/schemas/WeightRule' + ui_color: + $ref: '#/components/schemas/Color' + ui_fgcolor: + $ref: '#/components/schemas/Color' + template_fields: + type: array + readOnly: true + items: + type: string + sub_dag_id: + type: string + readOnly: true + downstream_task_ids: + type: array + readOnly: true + items: + type: string + + TaskCollection: + type: object + properties: + task: + type: array + items: + $ref: '#/components/schemas/Task' + + # Configuration + ConfigOption: + type: object + properties: + key: + type: string + readOnly: true + value: + type: string + readOnly: true + + ConfigSection: + type: object + properties: + name: + type: string + readOnly: true + options: + type: array + items: + $ref: '#/components/schemas/ConfigOption' + + Config: + type: object + properties: + sections: + type: array + items: + $ref: '#/components/schemas/ConfigSection' + + # Common data type + ScheduleInterval: + oneOf: + - $ref: '#/components/schemas/TimeDelta' + - $ref: '#/components/schemas/RelativeDelta' + - $ref: '#/components/schemas/CronExpression' + discriminator: + propertyName: objectType + + TimeDelta: + type: object + properties: + objectType: {type: string} + days: {type: integer} + seconds: {type: integer} + microsecond: {type: integer} + + RelativeDelta: + # TODO: Why we need these fields? + type: object + properties: + objectType: {type: string} + years: {type: integer} + months: {type: integer} + days: {type: integer} + leapdays: {type: integer} + hours: {type: integer} + minutes: {type: integer} + seconds: {type: integer} + microseconds: {type: integer} + year: {type: integer} + month: {type: integer} + day: {type: integer} + hour: {type: integer} + minute: {type: integer} + second: {type: integer} + microsecond: {type: integer} + + CronExpression: + type: object + properties: + objectType: {type: string} + value: {type: string} + + Timezone: + type: string + + Tag: + # Object to maintain extensibility + type: object + properties: + name: + type: string + + Color: + type: string + pattern: ^#[a-fA-F0-9]{3,6}$ + + ClassReference: + type: object + properties: + module_path: + type: string + readOnly: true + class_name: + type: string + readOnly: true + + # Generic + Error: + description: > + [RFC7807](https://tools.ietf.org/html/rfc7807) compliant response + type: object + properties: + type: + type: string + description: > + A URI reference [RFC3986] that identifies the problem type. This specification + encourages that, when dereferenced, it provide human-readable documentation for + the problem type. + title: + type: string + description: A short, human-readable summary of the problem type. + status: + type: number + description: The HTTP status code generated by the API server for this occurrence of the problem. + details: + type: string + description: A human-readable explanation specific to this occurrence of the problem. + instance: + type: string + description: > + A URI reference that identifies the specific occurrence of the problem. It may or may + not yield further information if dereferenced. + required: + - type + - title + - status + + CollectionInfo: + type: object + properties: + total_entries: + type: integer + + # Enums + TaskState: + type: string + enum: + - success + - running + - failed + - upstream_failed + - skipped + - up_for_retry + - up_for_reschedule + - queued + - none + - scheduled + + DagState: + type: string + enum: + - sucess + - running + - failed + + TriggerRule: + type: string + enum: + - all_success + - all_failed + - all_done + - one_success + - one_failed + - none_failed + - none_skipped + - dummy + + WeightRule: + type: string + enum: + - downstream + - upstream + - absolute + + # Reusable path, query, header and cookie parameters + parameters: + # Pagination parameters + PageOffset: + in: query + name: offset + required: false + schema: + type: integer + minimum: 0 + description: The number of items to skip before starting to collect the result set. + + PageLimit: + in: query + name: limit + required: false + schema: + type: integer + minimum: 1 + default: 100 + description: The numbers of items to return. + + # Database entity fields + ConnectionID: + in: path + name: connection_id + schema: + type: integer + required: true + description: The Connection ID. + + DAGID: + in: path + name: dag_id + schema: + type: integer + required: true + description: The DAG ID. + + DAGRunID: + in: path + name: dag_run_id + schema: + type: integer + required: true + description: The DAG Run ID. + + TaskID: + in: path + name: task_id + schema: + type: integer + required: true + description: The Task ID. + + TaskTryNumber: + in: path + name: task_try_number + schema: + type: integer + required: true + description: The Task Try Number. + + EventLogID: + in: path + name: event_log_id + schema: + type: integer + required: true + description: The Import Error ID. + + ImportErrorID: + in: path + name: import_error_id + schema: + type: integer + required: true + description: The Import Error ID. + + PoolID: + in: path + name: pool_id + schema: + type: integer + required: true + description: The Pool ID. + + VariableID: + in: path + name: variable_id + schema: + type: string + required: true + description: The Variable ID. + + VariableKey: + in: query + name: variable_key + schema: + type: string + required: true + description: The Variable Key. + + ExecutionDate: + in: path + name: execution_date + schema: + type: string + format: 'date-time' + required: true + description: > + The date-time notation as defined by + [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339#section-5.6), + E.G. `2017-07-21T17:32:28Z` + + # Logs + NoChunking: + in: query + name: full_content + schema: + type: boolean + required: false + description: > + A full reply will be returned. + By default, only the first fragment will be returned. + + ContinuationToken: + in: query + name: token + schema: + type: boolean + required: false + description: > + A token that allows you to continue fetching logs. + If passed, it will specify the location from which the download should be continued. + + XComKey: + in: path + name: key + schema: + type: string + required: true + description: The XCom Key. + + # Other parameters + FileToken: + in: path + name: file_token + schema: + type: string + required: true + description: > + The key containing the encrypted path to the file. Encryption and encryption takes place + only on the server side. This prevents the client from reading an non-DAG file. This also ensures API + extensibility, because the format of encrypted data may change. + + UpdateMask: + in: query + name: update_mask + schema: + type: array + items: + type: string + description: > + The fields to update on the connection (connection, pool etc). If absent or empty, all + modifiable fields are updated. A comma-separated list of fully qualified names of fields. + style: form + explode: false + + # Reusable request bodies + requestBodies: {} + + # Reusable responses, such as 401 Unauthenticated or 400 Bad Request + responses: + # 400 + 'BadRequest': + description: Client specified an invalid argument. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + # 401 + 'Unauthenticated': + description: Request not authenticated due to missing, invalid, authentication info. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + # 403 + 'PermissionDenied': + description: Client does not have sufficient permission. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + # 404 + 'NotFound': + description: A specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + # 409 + 'AlreadyExists': + description: The resource that a client tried to create already exists. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + # 500 + 'Unknown': + description: Unknown server error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + # Reusable response headers + headers: {} + + # Reusable examples + examples: {} + + # Reusable links + links: {} + + # Reusable callbacks + callbacks: {} + +# The API will provide support for plugins to support various authorization mechanisms. +# Detailed information will be available in the plugin specification. +security: [] + +tags: + - name: Config + - name: Connection + - name: DAG + - name: DAGRun + - name: EventLog + - name: ImportError + - name: Pool + - name: TaskInstance + - name: Variable + - name: XCom + + +externalDocs: + url: http://airflow.apache.org/docs/stable/