Modernize Python Client packaging (#104)
Accompanying https://github.com/apache/airflow/pull/36763 where we
fix and modernize the way how Python client gets generated, this
on is result of applying the modernisation:
* converting project configuration to pyproject.toml and removing
all setup.* and requirements files
* converting to modern packaging backend (hatchling) to build
wheel and sdist packages (with reproducibility)
* using hatch test environment definition and coverage to run tests
* we deleted release instructions and dev tools (the ones in Airflow
will be used to generate and sign the package)
* similarly .pre-comit-config.yml is not needed as the client
gets generated in the Apache Airflow project.
All those are going to be maintained in Apache Airflow project
as part of https://github.com/apache/airflow/pull/36763 as a single
source of truth - when new Python client gets released the project
files will be overwritten from those prepare from Airflow project,
this is just initial PR to seed the new
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 97f41ca..4a6430c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,36 +7,30 @@
branches: ['main']
jobs:
- lint:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@main
- - uses: actions/setup-python@v2
- with:
- python-version: '3.x'
- - name: Run precommit hooks
- run: |
- pip install pre-commit
- pre-commit run --all-files
build:
runs-on: ubuntu-latest
- strategy:
- matrix:
- python_version: ["3.7", "3.8", "3.9", "3.10"]
steps:
- name: Checkout
uses: actions/checkout@main
-
- name: Set up Python
- uses: actions/setup-python@v2
+ uses: actions/setup-python@v5
with:
- python-version: ${{ matrix.python_version }}
- id: python
-
- - name: Run pytest
+ python-version: 3.8
+ cache: 'pip'
+ - name: Install hatch
run: |
- pip install -r test-requirements.txt
- pytest test
+ python -m pip install --upgrade pipx
+ pipx install hatch
+ - name: Run tests
+ run: hatch run run-coverage
env:
- PYTEST_ADDOPTS: "--color=yes"
+ HATCH_ENV: "test"
+ - name: Build packages
+ run: hatch build -c -t sdist -t wheel
+ - name: "Upload packages"
+ uses: actions/upload-artifact@v3
+ with:
+ name: packages
+ path: ./dist/apache_airflow_client-*
+ retention-days: 7
+ if-no-files-found: error
diff --git a/.gitignore b/.gitignore
index 96e65cf..7bf956f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,67 +1,9 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-.idea/
-lib/
-lib64/
-parts/
-sdist/
-var/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# PyInstaller
-# Usually these files are written by a python script from a template
-# before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*,cover
-.hypothesis/
-venv/
-.venv/
-.python-version
-.pytest_cache
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-#Ipython Notebook
-.ipynb_checkpoints
+/airflow_client
+/docs
+/dist
+/test
+/tmp
+/v1.yaml
+/.coverage
+/apache_airflow_client.egg-info/
+/.idea
diff --git a/.openapi-generator-ignore b/.openapi-generator-ignore
new file mode 100644
index 0000000..36151b8
--- /dev/null
+++ b/.openapi-generator-ignore
@@ -0,0 +1,8 @@
+.travis.yml
+git_push.sh
+.gitlab-ci.yml
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+tox.ini
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
deleted file mode 100644
index 974b242..0000000
--- a/.pre-commit-config.yaml
+++ /dev/null
@@ -1,84 +0,0 @@
-# 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.
-
-default_stages: [commit, push]
-default_language_version:
- # force all unspecified python hooks to run python3
- python: python3
-minimum_pre_commit_version: "1.20.0"
-repos:
- - repo: meta
- hooks:
- - id: identity
- name: Print input to the static check hooks for troubleshooting
- - id: check-hooks-apply
- name: Check if all hooks apply to the repository
- - repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.5.1
- hooks:
- - id: insert-license
- name: Add license for all md files
- files: \.md$
- exclude: ^\.github/.*$|PROVIDERS_CHANGES.*\.md
- args:
- - --comment-style
- - "<!--|| -->"
- - --license-filepath
- - license-templates/LICENSE.txt
- - --fuzzy-match-generates-todo
- - id: insert-license
- name: Add license for all python files
- exclude: ^\.github/.*$
- language: python
- files: \.py$
- args:
- - --comment-style
- - "|#|"
- - --license-filepath
- - license-templates/LICENSE.txt
- - --fuzzy-match-generates-todo
- - id: insert-license
- name: Add license for all yaml files
- exclude: ^\.github/.*$
- types: [yaml]
- files: \.yml$|\.yaml$
- args:
- - --comment-style
- - "|#|"
- - --license-filepath
- - license-templates/LICENSE.txt
- - --fuzzy-match-generates-todo
- - id: insert-license
- name: Add license for all other files
- exclude: ^\.github/.*$|\.*LICENSE.txt$
- args:
- - --comment-style
- - "|#|"
- - --license-filepath
- - license-templates/LICENSE.txt
- - --fuzzy-match-generates-todo
- files: >
- \.properties$|\.cfg$|\.conf$|\.ini$|\.txt$$
- - repo: local
- hooks:
- - id: update-example-in-readme
- name: Update example python script in README.md
- entry: ./dev/insert_readme_example.py
- language: python
- files: ^dev/test_python_client.py$|^README.md$
- pass_filenames: false
- require_serial: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 746cbdd..259cc06 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,16 +17,18 @@
under the License.
-->
- # v2.8.0
+# v2.8.0
- ### Major changes:
+## Major changes:
+
- Allow filtering event logs by attributes ([#34417](https://github.com/apache/airflow/pull/34417))
- Add extra fields to plugins endpoint ([#34913](https://github.com/apache/airflow/pull/34913))
- Let auth managers provide their own API endpoints ([#34349](https://github.com/apache/airflow/pull/34349))
- Enable pools to consider deferred tasks ([#32709](https://github.com/apache/airflow/pull/32709))
- Add dag_run_ids and task_ids filter for the batch task instance API endpoint ([#32705](https://github.com/apache/airflow/pull/32705))
- ### Major Fixes
+## Major Fixes
+
- Add DagModel attributes before dumping DagDetailSchema for get_dag_details API endpoint ([#34947](https://github.com/apache/airflow/pull/34947))
- Add TriggerRule missing value in rest API ([#35194](https://github.com/apache/airflow/pull/35194))
- Fix wrong plugin schema ([#34858](https://github.com/apache/airflow/pull/34858))
@@ -34,36 +36,42 @@
- OpenAPI Spec fix nullable alongside $ref ([#32887](https://github.com/apache/airflow/pull/32887))
- Clarify new_state in OpenAPI spec ([#34056](https://github.com/apache/airflow/pull/34056))
- ### NEW API supported
+## NEW API supported
+
- NA
- # v2.7.3
+# v2.7.3
- ### Major changes:
+## Major changes:
+
- NA
- ### Major Fixes
+## Major Fixes
+
- Add TriggerRule missing value in rest API ([#35194](https://github.com/apache/airflow/pull/35194))
- Fix wrong plugin schema ([#34858](https://github.com/apache/airflow/pull/34858))
-
- # v2.7.2
+
+# v2.7.2
Apache Airflow API version: 2.7.2
- ### Major changes:
- - NA
+## Major changes:
- ### Major Fixes
- - Fix: make dry run optional for patch task instance ([#34568](https://github.com/apache/airflow/pull/34568))
+ - NA
- ### NEW API supported
- - NA
+## Major Fixes
+
+- Fix: make dry run optional for patch task instance ([#34568](https://github.com/apache/airflow/pull/34568))
+
+## NEW API supported
+
+ - NA
# v2.7.0
Apache Airflow API version: 2.7.0
-### Major changes:
+## Major changes:
- Enable pools to consider deferred tasks ([#32709](https://github.com/apache/airflow/pull/32709))
- add dag_run_ids and task_ids filter for the batch task instance API endpoint ([#32705](https://github.com/apache/airflow/pull/32705))
@@ -71,14 +79,14 @@
- Updates health check endpoint to include dag_processor status. ([#32382](https://github.com/apache/airflow/pull/32382))
- Add TriggererStatus to OpenAPI spec ([#31579](https://github.com/apache/airflow/pull/31579))
-### Major Fixes
+## Major Fixes
- OpenAPI Spec fix nullable alongside $ref ([#32887](https://github.com/apache/airflow/pull/32887))
- Fix incorrect default on readonly property in our API ([#32510](https://github.com/apache/airflow/pull/32510))
- Fix broken links in openapi/v1.yaml ([#31619](https://github.com/apache/airflow/pull/31619))
- Update Dag trigger API and command docs ([#32696](https://github.com/apache/airflow/pull/32696))
-### NEW API supported
+## NEW API supported
- NA
@@ -86,15 +94,15 @@
Apache Airflow API version: 2.6.2
-### Major changes:
+## Major changes:
- Add TriggererStatus to OpenAPI spec ([#31579](https://github.com/apache/airflow/pull/31579))
-### Major Fixes
+## Major Fixes
- Fixing broken links in openapi/v1.yaml ([#31619](https://github.com/apache/airflow/pull/31619))
-### NEW API supported
+## NEW API supported
- NA
@@ -102,14 +110,15 @@
Apache Airflow API version: 2.6.1
-### Major changes:
+## Major changes:
+
- NA
-### Major Fixes
+## Major Fixes
- Fix Pool schema OpenAPI spec ([#30973](https://github.com/apache/airflow/pull/30973))
-### NEW API supported
+## NEW API supported
- NA
@@ -117,13 +126,13 @@
Apache Airflow API version: 2.6.0
-### Major changes:
+## Major changes:
- Minimum Python version is 3.7
- DAGRun dag_id parameter is properly validated as read-only and setting it might result in an error:
- "`dag_id` is a read-only attribute" This might break some workflows that used examples from the documentation.
+ "`dag_id` is a read-only attribute" This might break some workflows that used examples from the documentation.
-### Major Fixes
+## Major Fixes
- Move read only property in order to fix Dagrun API docs ([#30149](https://github.com/apache/airflow/pull/30149))
- Fix clear dag run openapi spec responses by adding additional return type ([#29600](https://github.com/apache/airflow/pull/29600))
@@ -132,7 +141,7 @@
([#28713](https://github.com/apache/airflow/pull/28713))
- Expose updated_at filter for dag run and task instance endpoints ([#28636](https://github.com/apache/airflow/pull/28636))
-### NEW API supported
+## NEW API supported
- NA
@@ -140,15 +149,15 @@
Apache Airflow API version: 2.5.1
-### Major changes:
+## Major changes:
- NA
-### Major fixes:
+## Major fixes:
- Fix authentication issues by regenerating the client with proper security schemas
-### New API supported:
+## New API supported:
- NA
@@ -156,15 +165,15 @@
Apache Airflow API version: 2.5.x
-### Major changes:
+## Major changes:
- NA
-### Major fixes:
+## Major fixes:
- NA
-### New API supported:
+## New API supported:
- GET /datasets/events | Get dataset events
- GET /datasets | Get datasets
@@ -176,15 +185,15 @@
Apache Airflow API version: 2.3.x
-### Major changes:
+## Major changes:
- NA
-### Major fixes:
+## Major fixes:
- NA
-### New API supported:
+## New API supported:
- PATCH /dags | Update DAGs
- GET /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Get a mapped task instance
@@ -194,15 +203,15 @@
Apache Airflow API version: 2.2.x
-### Major changes:
+## Major changes:
- Client code is generated using OpenApi's 5.3.0 generator CLI
-### Major fixes:
+## Major fixes:
- NA
-### New API supported:
+## New API supported:
- POST /connections/test | Test a connection
- DELETE /dags/{dag_id} | Delete a DAG
@@ -215,15 +224,16 @@
Apache Airflow API version: 2.1.x
-### Major changes:
+## Major changes:
- Client code is generated using OpenApi's 5.1.1 generator CLI
-### Major fixes:
+## Major fixes:
- - Fixed the iteration issue on array items caused by unsupported class 'object' (issue #15)
+ - Fixed the iteration issue on array items caused by unsupported class 'object'.
+ Issue [#15](https://github.com/apache/airflow-client-python/issues/15)
-### New API supported:
+## New API supported:
- Permissions
- Plugins
@@ -236,4 +246,3 @@
Apache Airflow API version: 2.0.x
Initial version of the Python client.
-
diff --git a/INSTALL b/INSTALL
index 1ef702d..edf1a74 100644
--- a/INSTALL
+++ b/INSTALL
@@ -16,9 +16,11 @@
python3 -m venv PATH_TO_YOUR_VENV
source PATH_TO_YOUR_VENV/bin/activate
-# [required] building and installing by pip (preferred)
+# [required] building and installing by pip (the package can also be built with any other modern tools
+# that can build Python packages, e.g. setuptools, but pip is the recommended way)
+
pip install .
-# or directly
-python setup.py install
+# We also recommend hatch to convert the client to packages
+hatch build -c -t wheel -t sdist
diff --git a/LICENSE b/LICENSE
index 11069ed..b83a80d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -199,3 +199,55 @@
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.
+
+============================================================================
+ APACHE AIRFLOW SUBCOMPONENTS:
+
+ The Apache Airflow project contains subcomponents with separate copyright
+ notices and license terms. Your use of the source code for the these
+ subcomponents is subject to the terms and conditions of the following
+ licenses.
+
+
+========================================================================
+Third party Apache 2.0 licenses
+========================================================================
+
+The following components are provided under the Apache 2.0 License.
+See project link for details. The text of each license is also included
+at licenses/LICENSE-[project].txt.
+
+ (ALv2 License) hue v4.3.0 (https://github.com/cloudera/hue/)
+ (ALv2 License) jqclock v2.3.0 (https://github.com/JohnRDOrazio/jQuery-Clock-Plugin)
+ (ALv2 License) bootstrap3-typeahead v4.0.2 (https://github.com/bassjobsen/Bootstrap-3-Typeahead)
+ (ALv2 License) connexion v2.7.0 (https://github.com/zalando/connexion)
+
+========================================================================
+MIT licenses
+========================================================================
+
+The following components are provided under the MIT License. See project link for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+ (MIT License) jquery v3.5.1 (https://jquery.org/license/)
+ (MIT License) dagre-d3 v0.6.4 (https://github.com/cpettitt/dagre-d3)
+ (MIT License) bootstrap v3.4.1 (https://github.com/twbs/bootstrap/)
+ (MIT License) d3-tip v0.9.1 (https://github.com/Caged/d3-tip)
+ (MIT License) dataTables v1.10.25 (https://datatables.net)
+ (MIT License) normalize.css v3.0.2 (http://necolas.github.io/normalize.css/)
+ (MIT License) ElasticMock v1.3.2 (https://github.com/vrcmarcos/elasticmock)
+ (MIT License) MomentJS v2.24.0 (http://momentjs.com/)
+ (MIT License) eonasdan-bootstrap-datetimepicker v4.17.49 (https://github.com/eonasdan/bootstrap-datetimepicker/)
+
+========================================================================
+BSD 3-Clause licenses
+========================================================================
+The following components are provided under the BSD 3-Clause license. See project links for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+ (BSD 3 License) d3 v5.16.0 (https://d3js.org)
+ (BSD 3 License) d3-shape v2.1.0 (https://github.com/d3/d3-shape)
+ (BSD 3 License) cgroupspy 0.2.1 (https://github.com/cloudsigma/cgroupspy)
+
+========================================================================
+See licenses/LICENSES-ui.txt for packages used in `/airflow/www`
diff --git a/NOTICE b/NOTICE
index 0ae7e64..e69de29 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,6 +0,0 @@
-Apache Airflow
-Copyright 2016-2021 The Apache Software Foundation
-
-This product includes software developed at The Apache Software
-Foundation (http://www.apache.org/).
-=======================================================================
diff --git a/README.md b/README.md
index 7cd3ea3..6ac3d23 100644
--- a/README.md
+++ b/README.md
@@ -19,146 +19,584 @@
# Apache Airflow Python Client
+# Overview
+
+To facilitate management, Apache Airflow supports a range of REST API endpoints across its
+objects.
+This section provides an overview of the API design, methods, and supported use cases.
+
+Most of the endpoints accept `JSON` as input and return `JSON` responses.
+This means that you must usually add the following headers to your request:
+
+```
+Content-type: application/json
+Accept: application/json
+```
+
+## Resources
+
+The term `resource` refers to a single type of object in the Airflow metadata. An API is broken up by its
+endpoint's corresponding resource.
+The name of a resource is typically plural and expressed in camelCase. Example: `dagRuns`.
+
+Resource names are used as part of endpoint URLs, as well as in API parameters and responses.
+
+## CRUD Operations
+
+The platform supports **Create**, **Read**, **Update**, and **Delete** operations on most resources.
+You can review the standards for these operations and their standard parameters below.
+
+Some endpoints have special behavior as exceptions.
+
+### Create
+
+To create a resource, you typically submit an HTTP `POST` request with the resource's required metadata
+in the request body.
+The response returns a `201 Created` response code upon success with the resource's metadata, including
+its internal `id`, in the response body.
+
+### Read
+
+The HTTP `GET` request can be used to read a resource or to list a number of resources.
+
+A resource's `id` can be submitted in the request parameters to read a specific resource.
+The response usually returns a `200 OK` response code upon success, with the resource's metadata in
+the response body.
+
+If a `GET` request does not include a specific resource `id`, it is treated as a list request.
+The response usually returns a `200 OK` response code upon success, with an object containing a list
+of resources' metadata in the response body.
+
+When reading resources, some common query parameters are usually available. e.g.:
+
+```
+v1/connections?limit=25&offset=25
+```
+
+|Query Parameter|Type|Description|
+|---------------|----|-----------|
+|limit|integer|Maximum number of objects to fetch. Usually 25 by default|
+|offset|integer|Offset after which to start returning objects. For use with limit query parameter.|
+
+### Update
+
+Updating a resource requires the resource `id`, and is typically done using an HTTP `PATCH` request,
+with the fields to modify in the request body.
+The response usually returns a `200 OK` response code upon success, with information about the modified
+resource in the response body.
+
+### Delete
+
+Deleting a resource requires the resource `id` and is typically executing via an HTTP `DELETE` request.
+The response usually returns a `204 No Content` response code upon success.
+
+## Conventions
+
+- Resource names are plural and expressed in camelCase.
+- Names are consistent between URL parameter name and field name.
+
+- Field names are in snake_case.
+
+```json
+{
+ \"name\": \"string\",
+ \"slots\": 0,
+ \"occupied_slots\": 0,
+ \"used_slots\": 0,
+ \"queued_slots\": 0,
+ \"open_slots\": 0
+}
+```
+
+### Update Mask
+
+Update mask is available as a query parameter in patch endpoints. It is used to notify the
+API which fields you want to update. Using `update_mask` makes it easier to update objects
+by helping the server know which fields to update in an object instead of updating all fields.
+The update request ignores any fields that aren't specified in the field mask, leaving them with
+their current values.
+
+Example:
+
+```python
+import requests
+
+resource = requests.get("/resource/my-id").json()
+resource["my_field"] = "new-value"
+requests.patch("/resource/my-id?update_mask=my_field", data=json.dumps(resource))
+```
+
+## Versioning and Endpoint Lifecycle
+
+- API versioning is not synchronized to specific releases of the Apache Airflow.
+- APIs are designed to be backward compatible.
+- Any changes to the API will first go through a deprecation phase.
+
+# Trying the API
+
+You can use a third party client, such as [curl](https://curl.haxx.se/), [HTTPie](https://httpie.org/),
+[Postman](https://www.postman.com/) or [the Insomnia rest client](https://insomnia.rest/) to test
+the Apache Airflow API.
+
+Note that you will need to pass credentials data.
+
+For e.g., here is how to pause a DAG with [curl](https://curl.haxx.se/), when basic authorization is used:
+
+```bash
+curl -X PATCH 'https://example.com/api/v1/dags/{dag_id}?update_mask=is_paused' \\
+-H 'Content-Type: application/json' \\
+--user \"username:password\" \\
+-d '{
+ \"is_paused\": true
+}'
+```
+
+Using a graphical tool such as [Postman](https://www.postman.com/) or [Insomnia](https://insomnia.rest/),
+it is possible to import the API specifications directly:
+
+1. Download the API specification by clicking the **Download** button at top of this document.
+2. Import the JSON specification in the graphical tool of your choice.
+
+ - In *Postman*, you can click the **import** button at the top
+ - With *Insomnia*, you can just drag-and-drop the file on the UI
+
+Note that with *Postman*, you can also generate code snippets by selecting a request and clicking on
+the **Code** button.
+
+## Enabling CORS
+
+[Cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
+is a browser security feature that restricts HTTP requests that are
+initiated from scripts running in the browser.
+
+For details on enabling/configuring CORS, see
+[Enabling CORS](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).
+
+# Authentication
+
+To be able to meet the requirements of many organizations, Airflow supports many authentication methods,
+and it is even possible to add your own method.
+
+If you want to check which auth backend is currently set, you can use
+`airflow config get-value api auth_backends` command as in the example below.
+
+```bash
+$ airflow config get-value api auth_backends
+airflow.api.auth.backend.basic_auth
+```
+
+The default is to deny all requests.
+
+For details on configuring the authentication, see
+[API Authorization](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).
+
+# Errors
+
+We follow the error response format proposed in [RFC 7807](https://tools.ietf.org/html/rfc7807)
+also known as Problem Details for HTTP APIs. As with our normal API responses,
+your client must be prepared to gracefully handle additional members of the response.
+
+## Unauthenticated
+
+This indicates that the request has not been applied because it lacks valid authentication
+credentials for the target resource. Please check that you have valid credentials.
+
+## PermissionDenied
+
+This response means that the server understood the request but refuses to authorize
+it because it lacks sufficient rights to the resource. It happens when you do not have the
+necessary permission to execute the action you performed. You need to get the appropriate
+permissions in other to resolve this error.
+
+## BadRequest
+
+This response means that the server cannot or will not process the request due to something
+that is perceived to be a client error (e.g., malformed request syntax, invalid request message
+framing, or deceptive request routing). To resolve this, please ensure that your syntax is correct.
+
+## NotFound
+
+This client error response indicates that the server cannot find the requested resource.
+
+## MethodNotAllowed
+
+Indicates that the request method is known by the server but is not supported by the target resource.
+
+## NotAcceptable
+
+The target resource does not have a current representation that would be acceptable to the user
+agent, according to the proactive negotiation header fields received in the request, and the
+server is unwilling to supply a default representation.
+
+## AlreadyExists
+
+The request could not be completed due to a conflict with the current state of the target
+resource, e.g. the resource it tries to create already exists.
+
+## Unknown
+
+This means that the server encountered an unexpected condition that prevented it from
+fulfilling the request.
+
+This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: 2.8.0
+- Package version: 2.8.0
+- Build package: org.openapitools.codegen.languages.PythonClientCodegen
+For more information, please visit [https://airflow.apache.org](https://airflow.apache.org)
+
## Requirements.
-Python >= 3.7
+Python >=3.8
## Installation & Usage
### pip install
-You can install directly using pip:
+You can install the client using standard Python installation tools. It is hosted
+in PyPI with `apache-airflow-client` package id so the easiest way to get the latest
+version is to run:
-```sh
+```bash
pip install apache-airflow-client
-````
-
-### Setuptools
-
-Or install via [Setuptools](http://pypi.python.org/pypi/setuptools).
-
-```shell
-git clone git@github.com:apache/airflow-client-python.git
-cd airflow-client-python
-python setup.py install --user
```
-(or `sudo python setup.py install` to install the package for all users)
+
+If the python package is hosted on a repository, you can install directly using:
+
+```bash
+pip install git+https://github.com/apache/airflow-client-python.git
+```
+
+### Import check
Then import the package:
+
```python
import airflow_client.client
```
-## Changelog
-
-See [CHANGELOG.md](https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md) for keeping
-track on what has changed in the client.
-
-
## Getting Started
-Please follow the [installation procedure](#installation--usage) and then run the following
-example python script:
+Please follow the [installation procedure](#installation--usage) and then run the following:
```python
-import uuid
-
+import time
import airflow_client.client
-try:
- # If you have rich installed, you will have nice colored output of the API responses
- from rich import print
-except ImportError:
- print("Output will not be colored. Please install rich to get colored output: `pip install rich`")
- pass
-from airflow_client.client.api import config_api, dag_api, dag_run_api
-from airflow_client.client.model.dag_run import DAGRun
+from pprint import pprint
+from airflow_client.client.api import config_api
+from airflow_client.client.model.config import Config
+from airflow_client.client.model.error import Error
-# The client must use the authentication and authorization parameters
+# Defining the host is optional and defaults to /api/v1
+# See configuration.py for a list of all supported configuration parameters.
+configuration = client.Configuration(host="/api/v1")
+
+# The client must configure the authentication and authorization parameters
# in accordance with the API server security policy.
# Examples for each auth method are provided below, use the example that
# satisfies your auth use case.
-#
-# In case of the basic authentication below, make sure that Airflow is
-# configured also with the basic_auth as backend additionally to regular session backend needed
-# by the UI. In the `[api]` section of your `airflow.cfg` set:
-#
-# auth_backend = airflow.api.auth.backend.session,airflow.api.auth.backend.basic_auth
-#
-# Make sure that your user/name are configured properly - using the user/password that has admin
-# privileges in Airflow
+
+# Configure HTTP basic authorization: Basic
+configuration = client.Configuration(username="YOUR_USERNAME", password="YOUR_PASSWORD")
+
+
+# Enter a context with an instance of the API client
+with client.ApiClient(configuration) as api_client:
+ # Create an instance of the API class
+ api_instance = config_api.ConfigApi(api_client)
+
+ try:
+ # Get current configuration
+ api_response = api_instance.get_config()
+ pprint(api_response)
+ except client.ApiException as e:
+ print("Exception when calling ConfigApi->get_config: %s\n" % e)
+```
+
+## Documentation for API Endpoints
+
+All URIs are relative to */api/v1*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*ConfigApi* | [**get_config**](docs/ConfigApi.md#get_config) | **GET** /config | Get current configuration
+*ConnectionApi* | [**delete_connection**](docs/ConnectionApi.md#delete_connection) | **DELETE** /connections/{connection_id} | Delete a connection
+*ConnectionApi* | [**get_connection**](docs/ConnectionApi.md#get_connection) | **GET** /connections/{connection_id} | Get a connection
+*ConnectionApi* | [**get_connections**](docs/ConnectionApi.md#get_connections) | **GET** /connections | List connections
+*ConnectionApi* | [**patch_connection**](docs/ConnectionApi.md#patch_connection) | **PATCH** /connections/{connection_id} | Update a connection
+*ConnectionApi* | [**post_connection**](docs/ConnectionApi.md#post_connection) | **POST** /connections | Create a connection
+*ConnectionApi* | [**test_connection**](docs/ConnectionApi.md#test_connection) | **POST** /connections/test | Test a connection
+*DAGApi* | [**delete_dag**](docs/DAGApi.md#delete_dag) | **DELETE** /dags/{dag_id} | Delete a DAG
+*DAGApi* | [**get_dag**](docs/DAGApi.md#get_dag) | **GET** /dags/{dag_id} | Get basic information about a DAG
+*DAGApi* | [**get_dag_details**](docs/DAGApi.md#get_dag_details) | **GET** /dags/{dag_id}/details | Get a simplified representation of DAG
+*DAGApi* | [**get_dag_source**](docs/DAGApi.md#get_dag_source) | **GET** /dagSources/{file_token} | Get a source code
+*DAGApi* | [**get_dags**](docs/DAGApi.md#get_dags) | **GET** /dags | List DAGs
+*DAGApi* | [**get_task**](docs/DAGApi.md#get_task) | **GET** /dags/{dag_id}/tasks/{task_id} | Get simplified representation of a task
+*DAGApi* | [**get_tasks**](docs/DAGApi.md#get_tasks) | **GET** /dags/{dag_id}/tasks | Get tasks for DAG
+*DAGApi* | [**patch_dag**](docs/DAGApi.md#patch_dag) | **PATCH** /dags/{dag_id} | Update a DAG
+*DAGApi* | [**patch_dags**](docs/DAGApi.md#patch_dags) | **PATCH** /dags | Update DAGs
+*DAGApi* | [**post_clear_task_instances**](docs/DAGApi.md#post_clear_task_instances) | **POST** /dags/{dag_id}/clearTaskInstances | Clear a set of task instances
+*DAGApi* | [**post_set_task_instances_state**](docs/DAGApi.md#post_set_task_instances_state) | **POST** /dags/{dag_id}/updateTaskInstancesState | Set a state of task instances
+*DAGRunApi* | [**clear_dag_run**](docs/DAGRunApi.md#clear_dag_run) | **POST** /dags/{dag_id}/dagRuns/{dag_run_id}/clear | Clear a DAG run
+*DAGRunApi* | [**delete_dag_run**](docs/DAGRunApi.md#delete_dag_run) | **DELETE** /dags/{dag_id}/dagRuns/{dag_run_id} | Delete a DAG run
+*DAGRunApi* | [**get_dag_run**](docs/DAGRunApi.md#get_dag_run) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id} | Get a DAG run
+*DAGRunApi* | [**get_dag_runs**](docs/DAGRunApi.md#get_dag_runs) | **GET** /dags/{dag_id}/dagRuns | List DAG runs
+*DAGRunApi* | [**get_dag_runs_batch**](docs/DAGRunApi.md#get_dag_runs_batch) | **POST** /dags/~/dagRuns/list | List DAG runs (batch)
+*DAGRunApi* | [**get_upstream_dataset_events**](docs/DAGRunApi.md#get_upstream_dataset_events) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/upstreamDatasetEvents | Get dataset events for a DAG run
+*DAGRunApi* | [**post_dag_run**](docs/DAGRunApi.md#post_dag_run) | **POST** /dags/{dag_id}/dagRuns | Trigger a new DAG run
+*DAGRunApi* | [**set_dag_run_note**](docs/DAGRunApi.md#set_dag_run_note) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/setNote | Update the DagRun note.
+*DAGRunApi* | [**update_dag_run_state**](docs/DAGRunApi.md#update_dag_run_state) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id} | Modify a DAG run
+*DagWarningApi* | [**get_dag_warnings**](docs/DagWarningApi.md#get_dag_warnings) | **GET** /dagWarnings | List dag warnings
+*DatasetApi* | [**get_dataset**](docs/DatasetApi.md#get_dataset) | **GET** /datasets/{uri} | Get a dataset
+*DatasetApi* | [**get_dataset_events**](docs/DatasetApi.md#get_dataset_events) | **GET** /datasets/events | Get dataset events
+*DatasetApi* | [**get_datasets**](docs/DatasetApi.md#get_datasets) | **GET** /datasets | List datasets
+*DatasetApi* | [**get_upstream_dataset_events**](docs/DatasetApi.md#get_upstream_dataset_events) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/upstreamDatasetEvents | Get dataset events for a DAG run
+*EventLogApi* | [**get_event_log**](docs/EventLogApi.md#get_event_log) | **GET** /eventLogs/{event_log_id} | Get a log entry
+*EventLogApi* | [**get_event_logs**](docs/EventLogApi.md#get_event_logs) | **GET** /eventLogs | List log entries
+*ImportErrorApi* | [**get_import_error**](docs/ImportErrorApi.md#get_import_error) | **GET** /importErrors/{import_error_id} | Get an import error
+*ImportErrorApi* | [**get_import_errors**](docs/ImportErrorApi.md#get_import_errors) | **GET** /importErrors | List import errors
+*MonitoringApi* | [**get_health**](docs/MonitoringApi.md#get_health) | **GET** /health | Get instance status
+*MonitoringApi* | [**get_version**](docs/MonitoringApi.md#get_version) | **GET** /version | Get version information
+*PermissionApi* | [**get_permissions**](docs/PermissionApi.md#get_permissions) | **GET** /permissions | List permissions
+*PluginApi* | [**get_plugins**](docs/PluginApi.md#get_plugins) | **GET** /plugins | Get a list of loaded plugins
+*PoolApi* | [**delete_pool**](docs/PoolApi.md#delete_pool) | **DELETE** /pools/{pool_name} | Delete a pool
+*PoolApi* | [**get_pool**](docs/PoolApi.md#get_pool) | **GET** /pools/{pool_name} | Get a pool
+*PoolApi* | [**get_pools**](docs/PoolApi.md#get_pools) | **GET** /pools | List pools
+*PoolApi* | [**patch_pool**](docs/PoolApi.md#patch_pool) | **PATCH** /pools/{pool_name} | Update a pool
+*PoolApi* | [**post_pool**](docs/PoolApi.md#post_pool) | **POST** /pools | Create a pool
+*ProviderApi* | [**get_providers**](docs/ProviderApi.md#get_providers) | **GET** /providers | List providers
+*RoleApi* | [**delete_role**](docs/RoleApi.md#delete_role) | **DELETE** /roles/{role_name} | Delete a role
+*RoleApi* | [**get_role**](docs/RoleApi.md#get_role) | **GET** /roles/{role_name} | Get a role
+*RoleApi* | [**get_roles**](docs/RoleApi.md#get_roles) | **GET** /roles | List roles
+*RoleApi* | [**patch_role**](docs/RoleApi.md#patch_role) | **PATCH** /roles/{role_name} | Update a role
+*RoleApi* | [**post_role**](docs/RoleApi.md#post_role) | **POST** /roles | Create a role
+*TaskInstanceApi* | [**get_extra_links**](docs/TaskInstanceApi.md#get_extra_links) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links | List extra links
+*TaskInstanceApi* | [**get_log**](docs/TaskInstanceApi.md#get_log) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{task_try_number} | Get logs
+*TaskInstanceApi* | [**get_mapped_task_instance**](docs/TaskInstanceApi.md#get_mapped_task_instance) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Get a mapped task instance
+*TaskInstanceApi* | [**get_mapped_task_instances**](docs/TaskInstanceApi.md#get_mapped_task_instances) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/listMapped | List mapped task instances
+*TaskInstanceApi* | [**get_task_instance**](docs/TaskInstanceApi.md#get_task_instance) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id} | Get a task instance
+*TaskInstanceApi* | [**get_task_instances**](docs/TaskInstanceApi.md#get_task_instances) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances | List task instances
+*TaskInstanceApi* | [**get_task_instances_batch**](docs/TaskInstanceApi.md#get_task_instances_batch) | **POST** /dags/~/dagRuns/~/taskInstances/list | List task instances (batch)
+*TaskInstanceApi* | [**patch_mapped_task_instance**](docs/TaskInstanceApi.md#patch_mapped_task_instance) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Updates the state of a mapped task instance
+*TaskInstanceApi* | [**patch_task_instance**](docs/TaskInstanceApi.md#patch_task_instance) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id} | Updates the state of a task instance
+*TaskInstanceApi* | [**set_mapped_task_instance_note**](docs/TaskInstanceApi.md#set_mapped_task_instance_note) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/setNote | Update the TaskInstance note.
+*TaskInstanceApi* | [**set_task_instance_note**](docs/TaskInstanceApi.md#set_task_instance_note) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/setNote | Update the TaskInstance note.
+*UserApi* | [**delete_user**](docs/UserApi.md#delete_user) | **DELETE** /users/{username} | Delete a user
+*UserApi* | [**get_user**](docs/UserApi.md#get_user) | **GET** /users/{username} | Get a user
+*UserApi* | [**get_users**](docs/UserApi.md#get_users) | **GET** /users | List users
+*UserApi* | [**patch_user**](docs/UserApi.md#patch_user) | **PATCH** /users/{username} | Update a user
+*UserApi* | [**post_user**](docs/UserApi.md#post_user) | **POST** /users | Create a user
+*VariableApi* | [**delete_variable**](docs/VariableApi.md#delete_variable) | **DELETE** /variables/{variable_key} | Delete a variable
+*VariableApi* | [**get_variable**](docs/VariableApi.md#get_variable) | **GET** /variables/{variable_key} | Get a variable
+*VariableApi* | [**get_variables**](docs/VariableApi.md#get_variables) | **GET** /variables | List variables
+*VariableApi* | [**patch_variable**](docs/VariableApi.md#patch_variable) | **PATCH** /variables/{variable_key} | Update a variable
+*VariableApi* | [**post_variables**](docs/VariableApi.md#post_variables) | **POST** /variables | Create a variable
+*XComApi* | [**get_xcom_entries**](docs/XComApi.md#get_xcom_entries) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries | List XCom entries
+*XComApi* | [**get_xcom_entry**](docs/XComApi.md#get_xcom_entry) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key} | Get an XCom entry
+
+
+## Documentation For Models
+
+ - [Action](docs/Action.md)
+ - [ActionCollection](docs/ActionCollection.md)
+ - [ActionCollectionAllOf](docs/ActionCollectionAllOf.md)
+ - [ActionResource](docs/ActionResource.md)
+ - [BasicDAGRun](docs/BasicDAGRun.md)
+ - [ClassReference](docs/ClassReference.md)
+ - [ClearDagRun](docs/ClearDagRun.md)
+ - [ClearTaskInstances](docs/ClearTaskInstances.md)
+ - [CollectionInfo](docs/CollectionInfo.md)
+ - [Color](docs/Color.md)
+ - [Config](docs/Config.md)
+ - [ConfigOption](docs/ConfigOption.md)
+ - [ConfigSection](docs/ConfigSection.md)
+ - [Connection](docs/Connection.md)
+ - [ConnectionAllOf](docs/ConnectionAllOf.md)
+ - [ConnectionCollection](docs/ConnectionCollection.md)
+ - [ConnectionCollectionAllOf](docs/ConnectionCollectionAllOf.md)
+ - [ConnectionCollectionItem](docs/ConnectionCollectionItem.md)
+ - [ConnectionTest](docs/ConnectionTest.md)
+ - [CronExpression](docs/CronExpression.md)
+ - [DAG](docs/DAG.md)
+ - [DAGCollection](docs/DAGCollection.md)
+ - [DAGCollectionAllOf](docs/DAGCollectionAllOf.md)
+ - [DAGDetail](docs/DAGDetail.md)
+ - [DAGDetailAllOf](docs/DAGDetailAllOf.md)
+ - [DAGRun](docs/DAGRun.md)
+ - [DAGRunCollection](docs/DAGRunCollection.md)
+ - [DAGRunCollectionAllOf](docs/DAGRunCollectionAllOf.md)
+ - [DagScheduleDatasetReference](docs/DagScheduleDatasetReference.md)
+ - [DagState](docs/DagState.md)
+ - [DagWarning](docs/DagWarning.md)
+ - [DagWarningCollection](docs/DagWarningCollection.md)
+ - [DagWarningCollectionAllOf](docs/DagWarningCollectionAllOf.md)
+ - [Dataset](docs/Dataset.md)
+ - [DatasetCollection](docs/DatasetCollection.md)
+ - [DatasetCollectionAllOf](docs/DatasetCollectionAllOf.md)
+ - [DatasetEvent](docs/DatasetEvent.md)
+ - [DatasetEventCollection](docs/DatasetEventCollection.md)
+ - [DatasetEventCollectionAllOf](docs/DatasetEventCollectionAllOf.md)
+ - [Error](docs/Error.md)
+ - [EventLog](docs/EventLog.md)
+ - [EventLogCollection](docs/EventLogCollection.md)
+ - [EventLogCollectionAllOf](docs/EventLogCollectionAllOf.md)
+ - [ExtraLink](docs/ExtraLink.md)
+ - [ExtraLinkCollection](docs/ExtraLinkCollection.md)
+ - [HealthInfo](docs/HealthInfo.md)
+ - [HealthStatus](docs/HealthStatus.md)
+ - [ImportError](docs/ImportError.md)
+ - [ImportErrorCollection](docs/ImportErrorCollection.md)
+ - [ImportErrorCollectionAllOf](docs/ImportErrorCollectionAllOf.md)
+ - [InlineResponse200](docs/InlineResponse200.md)
+ - [InlineResponse2001](docs/InlineResponse2001.md)
+ - [Job](docs/Job.md)
+ - [ListDagRunsForm](docs/ListDagRunsForm.md)
+ - [ListTaskInstanceForm](docs/ListTaskInstanceForm.md)
+ - [MetadatabaseStatus](docs/MetadatabaseStatus.md)
+ - [PluginCollection](docs/PluginCollection.md)
+ - [PluginCollectionAllOf](docs/PluginCollectionAllOf.md)
+ - [PluginCollectionItem](docs/PluginCollectionItem.md)
+ - [Pool](docs/Pool.md)
+ - [PoolCollection](docs/PoolCollection.md)
+ - [PoolCollectionAllOf](docs/PoolCollectionAllOf.md)
+ - [Provider](docs/Provider.md)
+ - [ProviderCollection](docs/ProviderCollection.md)
+ - [RelativeDelta](docs/RelativeDelta.md)
+ - [Resource](docs/Resource.md)
+ - [Role](docs/Role.md)
+ - [RoleCollection](docs/RoleCollection.md)
+ - [RoleCollectionAllOf](docs/RoleCollectionAllOf.md)
+ - [SLAMiss](docs/SLAMiss.md)
+ - [ScheduleInterval](docs/ScheduleInterval.md)
+ - [SchedulerStatus](docs/SchedulerStatus.md)
+ - [SetDagRunNote](docs/SetDagRunNote.md)
+ - [SetTaskInstanceNote](docs/SetTaskInstanceNote.md)
+ - [Tag](docs/Tag.md)
+ - [Task](docs/Task.md)
+ - [TaskCollection](docs/TaskCollection.md)
+ - [TaskExtraLinks](docs/TaskExtraLinks.md)
+ - [TaskInstance](docs/TaskInstance.md)
+ - [TaskInstanceCollection](docs/TaskInstanceCollection.md)
+ - [TaskInstanceCollectionAllOf](docs/TaskInstanceCollectionAllOf.md)
+ - [TaskInstanceReference](docs/TaskInstanceReference.md)
+ - [TaskInstanceReferenceCollection](docs/TaskInstanceReferenceCollection.md)
+ - [TaskOutletDatasetReference](docs/TaskOutletDatasetReference.md)
+ - [TaskState](docs/TaskState.md)
+ - [TimeDelta](docs/TimeDelta.md)
+ - [Trigger](docs/Trigger.md)
+ - [TriggerRule](docs/TriggerRule.md)
+ - [UpdateDagRunState](docs/UpdateDagRunState.md)
+ - [UpdateTaskInstance](docs/UpdateTaskInstance.md)
+ - [UpdateTaskInstancesState](docs/UpdateTaskInstancesState.md)
+ - [User](docs/User.md)
+ - [UserAllOf](docs/UserAllOf.md)
+ - [UserCollection](docs/UserCollection.md)
+ - [UserCollectionAllOf](docs/UserCollectionAllOf.md)
+ - [UserCollectionItem](docs/UserCollectionItem.md)
+ - [UserCollectionItemRoles](docs/UserCollectionItemRoles.md)
+ - [Variable](docs/Variable.md)
+ - [VariableAllOf](docs/VariableAllOf.md)
+ - [VariableCollection](docs/VariableCollection.md)
+ - [VariableCollectionAllOf](docs/VariableCollectionAllOf.md)
+ - [VariableCollectionItem](docs/VariableCollectionItem.md)
+ - [VersionInfo](docs/VersionInfo.md)
+ - [WeightRule](docs/WeightRule.md)
+ - [XCom](docs/XCom.md)
+ - [XComAllOf](docs/XComAllOf.md)
+ - [XComCollection](docs/XComCollection.md)
+ - [XComCollectionAllOf](docs/XComCollectionAllOf.md)
+ - [XComCollectionItem](docs/XComCollectionItem.md)
+
+## Documentation For Authorization
+
+By default the generated client supports the three authentication schemes:
+
+* Basic
+* GoogleOpenID
+* Kerberos
+
+However, you can generate client and documentation with your own schemes by adding your own schemes in
+the security section of the OpenAPI specification. You can do it with Breeze CLI by adding the
+``--security-schemes`` option to the ``breeze release-management prepare-python-client`` command.
+
+## Basic "smoke" tests
+
+You can run basic smoke tests to check if the client is working properly - we have a simple test script
+that uses the API to run the tests. To do that, you need to:
+
+* install the `apache-airflow-client` package as described above
+* install ``rich`` Python package
+* download the [test_python_client.py](test_python_client.py) file
+* make sure you have test airflow installation running. Do not experiment with your production deployment
+* configure your airflow webserver to enable basic authentication
+ In the `[api]` section of your `airflow.cfg` set:
+
+```ini
+[api]
+auth_backend = airflow.api.auth.backend.session,airflow.api.auth.backend.basic_auth
+```
+
+You can also set it by env variable:
+`export AIRFLOW__API__AUTH_BACKENDS=airflow.api.auth.backend.session,airflow.api.auth.backend.basic_auth`
+
+* configure your airflow webserver to load example dags
+ In the `[core]` section of your `airflow.cfg` set:
+
+```ini
+[core]
+load_examples = True
+```
+
+You can also set it by env variable: `export AIRFLOW__CORE__LOAD_EXAMPLES=True`
+
+* optionally expose configuration (NOTE! that this is dangerous setting). The script will happily run with
+ the default setting, but if you want to see the configuration, you need to expose it.
+ In the `[webserver]` section of your `airflow.cfg` set:
+
+```ini
+[webserver]
+expose_config = True
+```
+
+You can also set it by env variable: `export AIRFLOW__WEBSERVER__EXPOSE_CONFIG=True`
+
+* Configure your host/ip/user/password in the `test_python_client.py` file
+
+```python
+import airflow_client
# Configure HTTP basic authorization: Basic
configuration = airflow_client.client.Configuration(
- host="http://localhost:8080/api/v1",
- username='admin',
- password='admin'
+ host="http://localhost:8080/api/v1", username="admin", password="admin"
)
-
-# Make sure in the [core] section, the `load_examples` config is set to True in your airflow.cfg
-# or AIRFLOW__CORE__LOAD_EXAMPLES environment variable set to True
-DAG_ID = "example_bash_operator"
-
-# Enter a context with an instance of the API client
-with airflow_client.client.ApiClient(configuration) as api_client:
-
- errors = False
-
- print('[blue]Getting DAG list')
- dag_api_instance = dag_api.DAGApi(api_client)
- try:
- api_response = dag_api_instance.get_dags()
- print(api_response)
- except airflow_client.client.OpenApiException as e:
- print("[red]Exception when calling DagAPI->get_dags: %s\n" % e)
- errors = True
- else:
- print('[green]Getting DAG list successful')
-
-
- print('[blue]Getting Tasks for a DAG')
- try:
- api_response = dag_api_instance.get_tasks(DAG_ID)
- print(api_response)
- except airflow_client.client.exceptions.OpenApiException as e:
- print("[red]Exception when calling DagAPI->get_tasks: %s\n" % e)
- errors = True
- else:
- print('[green]Getting Tasks successful')
-
-
- print('[blue]Triggering a DAG run')
- dag_run_api_instance = dag_run_api.DAGRunApi(api_client)
- try:
- # Create a DAGRun object (no dag_id should be specified because it is read-only property of DAGRun)
- # dag_run id is generated randomly to allow multiple executions of the script
- dag_run = DAGRun(
- dag_run_id='some_test_run_' + uuid.uuid4().hex,
- )
- api_response = dag_run_api_instance.post_dag_run(DAG_ID, dag_run)
- print(api_response)
- except airflow_client.client.exceptions.OpenApiException as e:
- print("[red]Exception when calling DAGRunAPI->post_dag_run: %s\n" % e)
- errors = True
- else:
- print('[green]Posting DAG Run successful')
-
- # Get current configuration. Note, this is disabled by default with most installation.
- # You need to set `expose_config = True` in Airflow configuration in order to retrieve configuration.
- conf_api_instance = config_api.ConfigApi(api_client)
- try:
- api_response = conf_api_instance.get_config()
- print(api_response)
- except airflow_client.client.OpenApiException as e:
- print("[red]Exception when calling ConfigApi->get_config: %s\n" % e)
- errors = True
- else:
- print('[green]Config retrieved successfully')
-
- if errors:
- print ('\n[red]There were errors while running the script - see above for details')
- else:
- print ('\n[green]Everything went well')
```
-See [README](https://github.com/apache/airflow-client-python/blob/main/airflow_client/README.md#documentation-for-api-endpoints)
-for full client API documentation.
\ No newline at end of file
+Run `python test_python_client.py` and you should see colored output showing attempts to connect and status.
+
+
+## Notes for Large OpenAPI documents
+
+If the OpenAPI document is large, imports in client.apis and client.models may fail with a
+RecursionError indicating the maximum recursion limit has been exceeded. In that case, there are a couple of solutions:
+
+Solution 1:
+Use specific imports for apis and models like:
+
+- `from airflow_client.client.api.default_api import DefaultApi`
+- `from airflow_client.client.model.pet import Pet`
+
+Solution 2:
+Before importing the package, adjust the maximum recursion limit as shown below:
+
+```python
+import sys
+
+sys.setrecursionlimit(1500)
+import airflow_client.client
+from airflow_client.client.apis import *
+from airflow_client.client.models import *
+```
+
+## Authors
+
+dev@airflow.apache.org
diff --git a/dev/README_RELEASE_CLIENT.md b/dev/README_RELEASE_CLIENT.md
deleted file mode 100644
index 9ad59fe..0000000
--- a/dev/README_RELEASE_CLIENT.md
+++ /dev/null
@@ -1,459 +0,0 @@
-<!--
- 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.
- -->
-
-# Release Process
-
-Typically, releases are done coinciding with major and minor releases to Airflow. Therefore, a release of (for example)
-2.3.0 of this client would correspond with 2.3.X of Airflow.
-
-The Python client is generated using Airflow's [openapi spec](https://github.com/apache/airflow/blob/master/clients/gen/python.sh).
-To update the client for new APIs do the following steps:
-
-```bash
-# set the version of the client
-export VERSION=2.0.0rc1
-# clone this repo
-git clone git@github.com:apache/airflow-client-python.git
-cd airflow-client-python
-export CLIENT_REPO_ROOT=$(pwd)
-cd ..
-
-# clone Airflow repo (if not already)
-git clone git@github.com:apache/airflow.git
-cd airflow
-export AIRFLOW_REPO_ROOT=$(pwd)
-```
-Edit the file `airflow/airflow/api_connexion/openapi/v1.yaml`
-Make sure it has the following `securitySchema`s listed under security `section`
-```yaml
-security:
- - Basic: []
- - GoogleOpenId: []
- - Kerberos: []
-```
-If your deployment of Airflow uses any different authentication mechanism than the three listed above, you might need to make further changes to the `v1.yaml` and generate your own client, see [OpenAPI Schema specification](https://swagger.io/docs/specification/authentication/) for details.
-(*These changes should not be commited to the upstream `v1.yaml` [as it will generate misleading openapi documentaion](https://github.com/apache/airflow/pull/17174)*)
-
-
-```bash
-
-# bump up the version in python.sh & run the following command
-${AIRFLOW_REPO_ROOT}/clients/gen/python.sh airflow/api_connexion/openapi/v1.yaml ${CLIENT_REPO_ROOT}/airflow_client
-
-cd ${CLIENT_REPO_ROOT}
-```
-
-- Set your version in `setup.py` (without the RC tag)
-
-- Get a diff between the last airflow version and the current airflow version
- which this release is based on:
-
- ```shell script
- # Run this command in Airflow Repo
- git log 2.3.0..2.5.0 --pretty=oneline -- airflow/api_connexion/openapi/v1.yaml
- ```
-
-- Update CHANGELOG.md with the details.
-- Commit the Changes with the message "Add Client Version ${VERSION}":
- ```shell script
- git add .
- git commit -m "Add Client Version ${VERSION}"
- ```
-- Raise a PR in airflow-client-python with the above changes
-- Merge the above PR when approved before proceeding
-
-# Prepare the Apache Airflow Python Client Package RC
-
-## Build RC artifacts
-
-The Release Candidate artifacts we vote upon should be the exact ones we vote against, without any modification than
-renaming – i.e. the contents of the files must be the same between voted release candidate and final release. Because
-of this the version in the built artifacts that will become the official Apache releases must not include the rcN suffix.
-
-- Set environment variables
-
- ```shell script
- # Set Version
- export VERSION=2.0.0rc1
- export VERSION_WITHOUT_RC=${VERSION%rc?}
- # Set the airflow version that this release is based
- export AIRFLOW_VERSION=2.1.4
-
-
- # Example after cloning
- git clone https://github.com/apache/airflow-client-python.git
- cd airflow-client-python
- export CLIENT_REPO_ROOT=$(pwd)
- ```
-
-- Tag your release
-
- ```shell script
- git tag -s ${VERSION} -m "Airflow Python Client {VERSION}"
- ```
-
-- Clean the checkout: the sdist step below will
-
- ```shell script
- git clean -fxd
- ```
-
-- Tarball the repo
-
- ```shell script
- mkdir dist
- git archive --format=tar.gz ${VERSION} --prefix=apache-airflow-client-${VERSION_WITHOUT_RC}/ -o dist/apache-airflow-client-${VERSION_WITHOUT_RC}-source.tar.gz
- ```
-
-- Generate sdist
-
- NOTE: Make sure your checkout is clean at this stage - any untracked or changed files will otherwise be included
- in the file produced.
-
- ```shell script
- pip install wheel
- python setup.py sdist bdist_wheel
- ```
-
-- Rename the sdist
-
- ```shell script
- mv dist/apache-airflow-client-${VERSION_WITHOUT_RC}.tar.gz dist/apache-airflow-client-${VERSION_WITHOUT_RC}-bin.tar.gz
- mv dist/apache_airflow_client-${VERSION_WITHOUT_RC}-py3-none-any.whl dist/apache_airflow_client-${VERSION_WITHOUT_RC}-py3-none-any.whl
- ```
-
-- Generate SHA512/ASC (If you have not generated a key yet, generate it by following instructions on
- http://www.apache.org/dev/openpgp.html#key-gen-generate-key)
-
- ```shell script
- pushd dist
- ${CLIENT_REPO_ROOT}/dev/sign.sh *
- popd
- ```
-
-- Push the artifacts to ASF dev dist repo
-
-```shell script
-# First clone the repo
-svn checkout https://dist.apache.org/repos/dist/dev/airflow airflow-dev
-
-# Create new folder for the release
-cd airflow-dev/clients/python
-svn mkdir ${VERSION}
-
-# Move the artifacts to svn folder & commit
-mv ${CLIENT_REPO_ROOT}/dist/apache{-,_}*client-${VERSION_WITHOUT_RC}* ${VERSION}/
-cd ${VERSION}
-svn add *
-svn commit -m "Add artifacts for Apache Airflow Python Client ${VERSION}"
-cd ${CLIENT_REPO_ROOT}
-rm -rf airflow-dev
-```
-
-## Prepare PyPI convenience "snapshot" packages
-
-At this point we have the artefact that we vote on, but as a convenience to developers we also want to
-publish "snapshots" of the RC builds to pypi for installing via pip.
-
-To do this we need to
-
-- Build the package:
-
- ```shell script
- cd ${CLIENT_REPO_ROOT}
- python setup.py egg_info --tag-build "$(sed -e "s/^[0-9.]*//" <<<"$VERSION")" sdist bdist_wheel
- ```
-
-- Verify the artifacts that would be uploaded:
-
- ```shell script
- twine check dist/*
- ```
-
-- Upload the package to PyPi's test environment:
-
- ```shell script
- twine upload --repository-url=https://test.pypi.org/legacy/ dist/*
- ```
-
-- Verify that the test package looks good by downloading it and installing it into a virtual environment. The package
- download link is available at:
- https://test.pypi.org/project/apache-airflow-client/#files
-
- Or via pypi
- pip install -i https://test.pypi.org/simple/ apache-airflow-client==${VERSION}
-
-- Upload the package to PyPi's production environment:
-
- ```shell script
- twine upload -r pypi dist/*
- ```
-
-- Again, confirm that the package is available here:
- https://pypi.python.org/pypi/apache-airflow-client
-
-It is important to stress that this snapshot should not be named "release", and it
-is not supposed to be used by and advertised to the end-users who do not read the devlist.
-
-- Push Tag for the release candidate
-
-```shell script
-git push origin ${VERSION}
-```
-
-## Prepare Vote email on the Airflow Client release candidate
-
-Subject:
-
-```shell script
-cat <<EOF
-[VOTE] Release Airflow Python Client ${VERSION_WITHOUT_RC} from ${VERSION}
-EOF
-```
-
-Body:
-
-```shell script
-cat <<EOF
-Hey fellow Airflowers,
-
-I have cut the release candidate for the Airflow Python Client ${VERSION}.
-The client consists of APIs corresponding to REST APIs available in
-*Apache Airflow ${AIRFLOW_VERSION}*. This email is calling for a vote on
-the release, which will last for 72 hours. Consider this my (binding) +1.
-
-Airflow Client ${VERSION} is available at:
-https://dist.apache.org/repos/dist/dev/airflow/clients/python/$VERSION/
-
-Or also available at PyPI:
-https://pypi.org/project/apache-airflow-client/$VERSION/
-
-*apache-airflow-client-${VERSION}-source.tar.gz* is a source release that comes with
-INSTALL instructions.
-*apache-airflow-client-${VERSION}-bin.tar.gz* is the binary Python "sdist" release.
-
-Public keys are available at:
-https://dist.apache.org/repos/dist/release/airflow/KEYS
-
-Only votes from PMC members are binding, but the release manager should
-encourage members of the community to test the release and vote with
-"(non-binding)".
-
-*Changelog:*
-
-*Major changes:*
-...
-
-*Major fixes:*
-...
-
-*New API supported:*
-...
-
-Cheers,
-<your name>
-EOF
-```
-
-# Verify the release candidate by PMCs
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#verify-the-release-candidate-by-pmcs).
-
-## SVN check
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#svn-check) (just replace Airflow with Airflow Client).
-
-## Licence check
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#licence-check).
-
-## Signature check
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#signature-check).
-
-## Sources check
-
-The code of the Python Client is generated using OpenAPI generator and the generated code is committed to
-the repository, therefore the Source code check should consist of two steps:
-
-1. Checkout the release tag of the "airflow-client-python"
-2. Follow the [Release process](#release-process) above and generate client's code above
-3. Run ``git diff`` to see the differences - review them. Generally, the code generated should only contain
- small differences regarding authentication.
-4. git reset --hard <RELEASE_TAG>
-
-Compare the sources with the packaged sources following the process described in Airflow:
-[here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#signature-check).
-
-# Verify release candidates by Contributors
-This can be done (and we encourage to) by any of the Contributors. In fact, it's best if the
-actual users of Airflow Client test it in their own staging/test installations. Each release candidate
-is available on PyPI apart from SVN packages, so everyone should be able to install
-the release candidate version of Airflow Client via simply (<VERSION> is 2.0.0 for example, and <X> is
-release candidate number 1,2,3,....).
-
-```shell script
-pip install apache-airflow-client==<VERSION>rc<X>
-```
-
-Once you install and run Airflow Client, you should perform any verification you see as necessary to check
-that the client works as you expected.
-
-# Publish the final Apache Airflow client release
-
-## Summarize the voting for the Apache Airflow client release
-
-```shell script
-Hello,
-
-Apache Airflow Python Client 2.5.0 (based on RC1) has been accepted.
-
-3 "+1" binding votes received:
-- Ephraim Anierobi
-- Jarek Potiuk
-- Jed Cunningham
-
-
-1 "+1" non-binding votes received:
-
-- Pierre Jeambrun
-
-Vote thread:
-https://lists.apache.org/thread/1qcj0r67dff3zg0w2vyfhr30fx9xtp3y
-
-I'll continue with the release process, and the release announcement will follow shortly.
-
-Cheers,
-<your name>
-```
-
-## Publish release to SVN
-
-```shell script
-# Go to Airflow python client sources first
-cd <YOUR_AIRFLOW_CLIENT_REPO_ROOT>
-export CLIENT_REPO_ROOT="$(pwd)"
-cd ..
-# Clone the AS
-[ -d asf-dist ] || svn checkout --depth=immediates https://dist.apache.org/repos/dist asf-dist
-svn update --set-depth=infinity asf-dist/{release,dev}/airflow
-CLIENT_DEV_SVN="${PWD}/asf-dist/dev/airflow/clients/python"
-CLIENT_RELEASE_SVN="${PWD}/asf-dist/release/airflow/clients/python"
-cd "${CLIENT_RELEASE_SVN}"
-
-export RC=2.0.0rc1
-export VERSION=${RC/rc?/}
-
-# Create new folder for the release
-svn mkdir ${VERSION}
-cd ${VERSION}
-
-# Move the artifacts to svn folder & commit
-for f in ${CLIENT_DEV_SVN}/$RC/*; do
- svn cp $f . ;
-done
-svn commit -m "Release Apache Airflow Python Client ${VERSION} from ${RC}"
-
-# Remove old release
-# http://www.apache.org/legal/release-policy.html#when-to-archive
-cd ..
-export PREVIOUS_VERSION=1.0.0
-svn rm ${PREVIOUS_VERSION}
-svn commit -m "Remove old release: ${PREVIOUS_VERSION}"
-```
-
-Verify that the packages appear in [airflow](https://dist.apache.org/repos/dist/release/airflow/clients/python)
-
-## Prepare PyPI "release" packages
-
-At this point we release an official package:
-
-- Copy the packages from the SVN into the dist folder in CLIENT_REPO_ROOT:
-
- ```shell script
- rm -rf ${CLIENT_REPO_ROOT}/dist
- mkdir ${CLIENT_REPO_ROOT}/dist
- cp ${CLIENT_RELEASE_SVN}/${VERSION}/apache-airflow-client-${VERSION}-bin.tar.gz ${CLIENT_REPO_ROOT}/dist/
- cp ${CLIENT_RELEASE_SVN}/${VERSION}/apache_airflow_client-${VERSION}-py3-none-any.whl ${CLIENT_REPO_ROOT}/dist/
- # Remove the -bin
- mv ${CLIENT_REPO_ROOT}/dist/apache-airflow-client-${VERSION}-bin.tar.gz ${CLIENT_REPO_ROOT}/dist/apache-airflow-client-${VERSION}.tar.gz
- ```
-
-- Verify the artifacts that would be uploaded:
-
- ```shell script
- twine check dist/*
- ```
-
-- Upload the package to PyPi's production environment:
-
- ```shell script
- twine upload -r pypi dist/*
- ```
-
-- Confirm that the package is available here: https://pypi.python.org/pypi/apache-airflow-client
-
-- Push Tag for the final version
-
- ```shell script
- git tag ${VERSION}
- git push origin ${VERSION}
- ```
-
-## Create release on GitHub
-
-Create a new release on GitHub with the release notes and assets from the release svn.
-
-## Notify developers of release
-
-Notify users@airflow.apache.org (cc'ing dev@airflow.apache.org) that the artifacts have been published:
-
-Subject:
-
-```shell script
- cat <<EOF
- [ANNOUNCE] Apache Airflow Python Client ${VERSION} Released
- EOF
-```
-Body:
-
-```shell script
- cat <<EOF
- Dear Airflow community,
-
-I'm happy to announce that Airflow Python Client ${VERSION} was just released.
-
-We also made this version available on PyPI for convenience:
-`pip install apache-airflow-client`
-https://pypi.org/project/apache-airflow-client/${VERSION}/
-
-The documentation is available at:
-https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html
-
-Find the changelog here for more details:
-https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md
-
-
-Cheers,
-<your name>
-EOF
-```
-Send the same email to announce@apache.org, except change the opening line to Dear community,. It is more reliable to send it via the web ui at https://lists.apache.org/list.html?announce@apache.org (press "c" to compose a new thread)
-
-
-
-## Add release data to Apache Committee Report Helper
-
-Add the release data (version and date) at: https://reporter.apache.org/addrelease.html?airflow
diff --git a/dev/insert_readme_example.py b/dev/insert_readme_example.py
deleted file mode 100755
index 9bbf902..0000000
--- a/dev/insert_readme_example.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python3
-# 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.
-
-from pathlib import Path
-
-BASE_DIR = Path(__file__).resolve().parent.parent
-
-if __name__ == '__main__':
- example = (BASE_DIR / "dev" / "test_python_client.py").read_text().splitlines()
- example = example[example.index("# under the License.")+1:] # Remove license header
- readme_lines = (BASE_DIR / "README.md").read_text().splitlines()
- result_lines = []
- skip_lines = False
- changes_made = False
- for line in readme_lines:
- if line.strip().startswith("example python script:"):
- result_lines.append(line)
- result_lines.append("")
- result_lines.append("```python")
- result_lines.extend(example)
- result_lines.append("```")
- skip_lines = True
- changes_made = True
- else:
- if not skip_lines:
- result_lines.append(line)
- if line.strip() == "```":
- skip_lines = False
- (BASE_DIR / "README.md").write_text("\n".join(result_lines))
- if not changes_made:
- raise Exception("Could not find example python script in README.md to replace. "
- "Please make sure `example python script:` line is in README.md")
diff --git a/dev/sign.sh b/dev/sign.sh
deleted file mode 100755
index 178ba3c..0000000
--- a/dev/sign.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-set -euo pipefail
-
-# Use this to sign the tar balls generated from
-# python setup.py sdist --formats=gztar
-# ie. sign.sh <my_tar_ball>
-# you will still be required to type in your signing key password
-# or it needs to be available in your keychain
-
-# Which key to sign releases with? This can be a (partial) email address or a
-# key id. By default use any apache.org key
-SIGN_WITH="${SIGN_WITH:-apache.org}"
-
-for name in "${@}"
-do
- gpg --yes --armor --local-user "$SIGN_WITH" --output "${name}.asc" --detach-sig "${name}"
- shasum -a 512 "${name}" > "${name}.sha512"
-done
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..a8a0e5b
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,105 @@
+# 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.
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[project]
+name = "apache-airflow-client"
+dynamic = ["version"]
+description = "Apache Airflow API (Stable)"
+readme = "README.md"
+license-files.globs = ["LICENSE", "NOTICE"]
+requires-python = "~=3.8"
+authors = [
+ { name = "Apache Software Foundation", email = "dev@airflow.apache.org" },
+]
+keywords = [
+ "Apache Airflow API (Stable)",
+ "OpenAPI",
+ "OpenAPI-Generator",
+]
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "Environment :: Console",
+ "Environment :: Web Environment",
+ "Framework :: Apache Airflow",
+ "Intended Audience :: Developers",
+ "Intended Audience :: System Administrators",
+ "License :: OSI Approved :: Apache Software License",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: 3.11",
+ "Topic :: System :: Monitoring",
+]
+
+dependencies = [
+ "python-dateutil",
+ "urllib3 >= 1.25.3",
+]
+
+[project.urls]
+"Bug Tracker" = "https://github.com/apache/airflow-client-python/issues"
+Changelog = "https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md"
+Documentation = "https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html"
+Download = "https://archive.apache.org/dist/airflow/clients/python/"
+Homepage = "https://airflow.apache.org/"
+"Source Code" = "https://github.com/apache/airflow/clients/python"
+
+[tool.hatch.envs.test]
+dependencies = [
+ "pytest-cov>=2.8.1",
+ "python_dateutil >= 2.5.3",
+ "urllib3 >= 1.25.3",
+]
+
+[tool.hatch.envs.test.scripts]
+run-coverage = "pytest --cov-config=pyproject.toml --cov=airflow_client test --color=yes"
+run = "run-coverage --no-cov"
+
+[[tool.hatch.envs.test.matrix]]
+python = ["3.8", "3.9", "3.10", "3.11"]
+
+[tool.hatch.version]
+path = "./version.txt"
+pattern = "^(?P<version>.+)$"
+
+[tool.hatch.build.targets.sdist]
+artifacts = [
+ "/airflow_client",
+ "/docs",
+ "/test",
+ "v1.yaml",
+]
+include = [
+ "version.txt",
+ "INSTALL",
+ "README.md",
+]
+
+[tool.hatch.build.targets.wheel]
+artifacts = [
+ "/airflow_client",
+ "/docs",
+ "/test",
+ "v1.yaml",
+]
+include = [
+ "/airflow_client",
+]
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 51a300c..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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.
-
-python_dateutil >= 2.5.3
-setuptools >= 21.0.0
-urllib3 >= 1.25.3
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 74563b0..0000000
--- a/setup.cfg
+++ /dev/null
@@ -1,42 +0,0 @@
-# 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.
-
-[flake8]
-max-line-length=99
-
-[metadata]
-name = apache-airflow-client
-description = Apache Airflow API (Stable)
-author = Apache Software Foundation
-author_email = dev@airflow.apache.org
-url = https://airflow.apache.org/
-long_description = file: README.md
-long_description_content_type = text/markdown
-license = Apache License 2.0
-license_files =
- LICENSE
- NOTICE
-project_urls =
- Documentation=https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html
- Changelog=https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md
- Bug Tracker=https://github.com/apache/airflow-client-python/issues
- Source Code=https://github.com/apache/airflow-client-python
-
-[options]
-zip_safe = False
-include_package_data = True
-python_requires = ~=3.7
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 4bb8e0c..0000000
--- a/setup.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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.
-
-"""
- Airflow API (Stable)
-
- The version of the OpenAPI document: 1.0.0
- Contact: dev@airflow.apache.org
- Generated by: https://openapi-generator.tech
-"""
-
-from setuptools import find_packages, setup # noqa: H301
-
-VERSION = "2.8.0"
-# To install the library, run the following
-#
-# python setup.py install
-#
-# prerequisite: setuptools
-# http://pypi.python.org/pypi/setuptools
-
-REQUIRES = [
- "urllib3 >= 1.25.3",
- "python-dateutil",
-]
-
-setup(
- version=VERSION,
- keywords=["OpenAPI", "OpenAPI-Generator", "Apache Airflow API (Stable)"],
- download_url=("https://archive.apache.org/dist/airflow/clients/python/" + VERSION),
- install_requires=REQUIRES,
- packages=find_packages(exclude=["test", "tests"]),
-)
diff --git a/spec/v1.yaml b/spec/v1.yaml
new file mode 100644
index 0000000..a8982dc
--- /dev/null
+++ b/spec/v1.yaml
@@ -0,0 +1,5488 @@
+components:
+ callbacks: {}
+ examples: {}
+ headers: {}
+ links: {}
+ parameters:
+ After:
+ description: Timestamp to select event logs occurring after.
+ in: query
+ name: after
+ required: false
+ schema:
+ format: date-time
+ type: string
+ Before:
+ description: Timestamp to select event logs occurring before.
+ in: query
+ name: before
+ required: false
+ schema:
+ format: date-time
+ type: string
+ ConnectionID:
+ description: The connection ID.
+ in: path
+ name: connection_id
+ required: true
+ schema:
+ type: string
+ ContinuationToken:
+ description: 'A token that allows you to continue fetching logs.
+
+ If passed, it will specify the location from which the download should be
+ continued.
+
+ '
+ in: query
+ name: token
+ required: false
+ schema:
+ type: string
+ DAGID:
+ description: The DAG ID.
+ in: path
+ name: dag_id
+ required: true
+ schema:
+ type: string
+ DAGRunID:
+ description: The DAG run ID.
+ in: path
+ name: dag_run_id
+ required: true
+ schema:
+ type: string
+ DatasetURI:
+ description: The encoded Dataset URI
+ in: path
+ name: uri
+ required: true
+ schema:
+ format: path
+ type: string
+ Event:
+ description: The name of event log.
+ in: query
+ name: event
+ required: false
+ schema:
+ type: string
+ EventLogID:
+ description: The event log ID.
+ in: path
+ name: event_log_id
+ required: true
+ schema:
+ type: integer
+ FileToken:
+ description: 'The key containing the encrypted path to the file. Encryption
+ and decryption take place only on
+
+ the server. This prevents the client from reading an non-DAG file. This also
+ ensures API
+
+ extensibility, because the format of encrypted data may change.
+
+ '
+ in: path
+ name: file_token
+ required: true
+ schema:
+ type: string
+ FilterDAGID:
+ description: Returns objects matched by the DAG ID.
+ in: query
+ name: dag_id
+ required: false
+ schema:
+ type: string
+ FilterDatasetID:
+ description: The Dataset ID that updated the dataset.
+ in: query
+ name: dataset_id
+ schema:
+ type: integer
+ FilterDurationGTE:
+ description: 'Returns objects greater than or equal to the specified values.
+
+
+ This can be combined with duration_lte parameter to receive only the selected
+ period.
+
+ '
+ in: query
+ name: duration_gte
+ required: false
+ schema:
+ type: number
+ FilterDurationLTE:
+ description: 'Returns objects less than or equal to the specified values.
+
+
+ This can be combined with duration_gte parameter to receive only the selected
+ range.
+
+ '
+ in: query
+ name: duration_lte
+ required: false
+ schema:
+ type: number
+ FilterEndDateGTE:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with start_date_lte parameter to receive only the selected
+ period.
+
+ '
+ in: query
+ name: end_date_gte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterEndDateLTE:
+ description: 'Returns objects less than or equal to the specified date.
+
+
+ This can be combined with start_date_gte parameter to receive only the selected
+ period.
+
+ '
+ in: query
+ name: end_date_lte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterExecutionDateGTE:
+ description: 'Returns objects greater or equal to the specified date.
+
+
+ This can be combined with execution_date_lte parameter to receive only the
+ selected period.
+
+ '
+ in: query
+ name: execution_date_gte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterExecutionDateLTE:
+ description: 'Returns objects less than or equal to the specified date.
+
+
+ This can be combined with execution_date_gte parameter to receive only the
+ selected period.
+
+ '
+ in: query
+ name: execution_date_lte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterMapIndex:
+ description: Filter on map index for mapped task.
+ in: query
+ name: map_index
+ schema:
+ type: integer
+ FilterPool:
+ description: The value can be repeated to retrieve multiple matching values
+ (OR condition).
+ in: query
+ name: pool
+ required: false
+ schema:
+ items:
+ type: string
+ type: array
+ FilterQueue:
+ description: The value can be repeated to retrieve multiple matching values
+ (OR condition).
+ in: query
+ name: queue
+ schema:
+ items:
+ type: string
+ type: array
+ FilterSourceDAGID:
+ description: The DAG ID that updated the dataset.
+ in: query
+ name: source_dag_id
+ schema:
+ type: string
+ FilterSourceMapIndex:
+ description: The map index that updated the dataset.
+ in: query
+ name: source_map_index
+ schema:
+ type: integer
+ FilterSourceRunID:
+ description: The DAG run ID that updated the dataset.
+ in: query
+ name: source_run_id
+ schema:
+ type: string
+ FilterSourceTaskID:
+ description: The task ID that updated the dataset.
+ in: query
+ name: source_task_id
+ schema:
+ type: string
+ FilterStartDateGTE:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with start_date_lte parameter to receive only the selected
+ period.
+
+ '
+ in: query
+ name: start_date_gte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterStartDateLTE:
+ description: 'Returns objects less or equal the specified date.
+
+
+ This can be combined with start_date_gte parameter to receive only the selected
+ period.
+
+ '
+ in: query
+ name: start_date_lte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterState:
+ description: The value can be repeated to retrieve multiple matching values
+ (OR condition).
+ in: query
+ name: state
+ required: false
+ schema:
+ items:
+ type: string
+ type: array
+ FilterTags:
+ description: 'List of tags to filter results.
+
+
+ *New in version 2.2.0*
+
+ '
+ in: query
+ name: tags
+ schema:
+ items:
+ type: string
+ type: array
+ FilterTaskID:
+ description: Returns objects matched by the Task ID.
+ in: query
+ name: task_id
+ required: false
+ schema:
+ type: string
+ FilterUpdatedAtGTE:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with updated_at_lte parameter to receive only the selected
+ period.
+
+
+ *New in version 2.6.0*
+
+ '
+ in: query
+ name: updated_at_gte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterUpdatedAtLTE:
+ description: 'Returns objects less or equal the specified date.
+
+
+ This can be combined with updated_at_gte parameter to receive only the selected
+ period.
+
+
+ *New in version 2.6.0*
+
+ '
+ in: query
+ name: updated_at_lte
+ required: false
+ schema:
+ format: date-time
+ type: string
+ FilterXcomKey:
+ description: Only filter the XCom records which have the provided key.
+ in: query
+ name: xcom_key
+ required: false
+ schema:
+ type: string
+ FullContent:
+ description: 'A full content will be returned.
+
+ By default, only the first fragment will be returned.
+
+ '
+ in: query
+ name: full_content
+ required: false
+ schema:
+ type: boolean
+ ImportErrorID:
+ description: The import error ID.
+ in: path
+ name: import_error_id
+ required: true
+ schema:
+ type: integer
+ MapIndex:
+ description: The map index.
+ in: path
+ name: map_index
+ required: true
+ schema:
+ type: integer
+ OnlyActive:
+ description: 'Only filter active DAGs.
+
+
+ *New in version 2.1.1*
+
+ '
+ in: query
+ name: only_active
+ required: false
+ schema:
+ default: true
+ type: boolean
+ OrderBy:
+ description: 'The name of the field to order the results by.
+
+ Prefix a field name with `-` to reverse the sort order.
+
+
+ *New in version 2.1.0*
+
+ '
+ in: query
+ name: order_by
+ required: false
+ schema:
+ type: string
+ Owner:
+ description: The owner's name of event log.
+ in: query
+ name: owner
+ required: false
+ schema:
+ type: string
+ PageLimit:
+ description: The numbers of items to return.
+ in: query
+ name: limit
+ required: false
+ schema:
+ default: 100
+ type: integer
+ PageOffset:
+ description: The number of items to skip before starting to collect the result
+ set.
+ in: query
+ name: offset
+ required: false
+ schema:
+ minimum: 0
+ type: integer
+ Paused:
+ description: 'Only filter paused/unpaused DAGs. If absent or null, it returns
+ paused and unpaused DAGs.
+
+
+ *New in version 2.6.0*
+
+ '
+ in: query
+ name: paused
+ required: false
+ schema:
+ type: boolean
+ PoolName:
+ description: The pool name.
+ in: path
+ name: pool_name
+ required: true
+ schema:
+ type: string
+ RoleName:
+ description: The role name
+ in: path
+ name: role_name
+ required: true
+ schema:
+ type: string
+ TaskID:
+ description: The task ID.
+ in: path
+ name: task_id
+ required: true
+ schema:
+ type: string
+ TaskTryNumber:
+ description: The task try number.
+ in: path
+ name: task_try_number
+ required: true
+ schema:
+ type: integer
+ UpdateMask:
+ description: 'The fields to update on the resource. If absent or empty, all
+ modifiable fields are updated.
+
+ A comma-separated list of fully qualified names of fields.
+
+ '
+ explode: false
+ in: query
+ name: update_mask
+ schema:
+ items:
+ type: string
+ type: array
+ style: form
+ Username:
+ description: 'The username of the user.
+
+
+ *New in version 2.1.0*
+
+ '
+ in: path
+ name: username
+ required: true
+ schema:
+ type: string
+ VariableKey:
+ description: The variable Key.
+ in: path
+ name: variable_key
+ required: true
+ schema:
+ format: path
+ type: string
+ XComKey:
+ description: The XCom key.
+ in: path
+ name: xcom_key
+ required: true
+ schema:
+ type: string
+ requestBodies: {}
+ responses:
+ AlreadyExists:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An existing resource conflicts with the request.
+ BadRequest:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: Client specified an invalid argument.
+ MethodNotAllowed:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: Request method is known by the server but is not supported by the
+ target resource.
+ NotAcceptable:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: A specified Accept header is not allowed.
+ NotFound:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: A specified resource is not found.
+ PermissionDenied:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: Client does not have sufficient permission.
+ Unauthenticated:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: Request not authenticated due to missing, invalid, authentication
+ info.
+ Unknown:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: Unknown server error.
+ schemas:
+ Action:
+ description: 'An action Item.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ name:
+ description: The name of the permission "action"
+ nullable: false
+ type: string
+ type: object
+ ActionCollection:
+ allOf:
+ - properties:
+ actions:
+ items:
+ $ref: '#/components/schemas/Action'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'A collection of actions.
+
+
+ *New in version 2.1.0*
+
+ '
+ type: object
+ ActionResource:
+ description: 'The Action-Resource item.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ action:
+ $ref: '#/components/schemas/Action'
+ description: The permission action
+ type: object
+ resource:
+ $ref: '#/components/schemas/Resource'
+ description: The permission resource
+ type: object
+ type: object
+ BasicDAGRun:
+ properties:
+ dag_id:
+ readOnly: true
+ type: string
+ data_interval_end:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ data_interval_start:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ end_date:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ logical_date:
+ description: 'The logical date (previously called execution date). This
+ is the time or interval covered by
+
+ this DAG run, according to the DAG definition.
+
+
+ The value of this field can be set only when creating the object. If you
+ try to modify the
+
+ field of an existing object, the request fails with an BAD_REQUEST error.
+
+
+ This together with DAG_ID are a unique key.
+
+
+ *New in version 2.2.0*
+
+ '
+ format: date-time
+ type: string
+ run_id:
+ description: 'Run ID.
+
+ '
+ type: string
+ start_date:
+ description: 'The start time. The time when DAG run was actually created.
+
+
+ *Changed in version 2.1.3*: Field becomes nullable.
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ state:
+ $ref: '#/components/schemas/DagState'
+ type: object
+ ClassReference:
+ description: Class reference
+ properties:
+ class_name:
+ readOnly: true
+ type: string
+ module_path:
+ readOnly: true
+ type: string
+ type: object
+ ClearDagRun:
+ properties:
+ dry_run:
+ default: true
+ description: 'If set, don''t actually run this operation. The response will
+ contain a list of task instances
+
+ planned to be cleaned, but not modified in any way.
+
+ '
+ type: boolean
+ type: object
+ ClearTaskInstances:
+ properties:
+ dag_run_id:
+ description: The DagRun ID for this task instance
+ nullable: true
+ type: string
+ dry_run:
+ default: true
+ description: 'If set, don''t actually run this operation. The response will
+ contain a list of task instances
+
+ planned to be cleaned, but not modified in any way.
+
+ '
+ type: boolean
+ end_date:
+ description: The maximum execution date to clear.
+ format: datetime
+ type: string
+ include_downstream:
+ default: false
+ description: If set to true, downstream tasks are also affected.
+ type: boolean
+ include_future:
+ default: false
+ description: If set to True, also tasks from future DAG Runs are affected.
+ type: boolean
+ include_parentdag:
+ description: Clear tasks in the parent dag of the subdag.
+ type: boolean
+ include_past:
+ default: false
+ description: If set to True, also tasks from past DAG Runs are affected.
+ type: boolean
+ include_subdags:
+ description: Clear tasks in subdags and clear external tasks indicated by
+ ExternalTaskMarker.
+ type: boolean
+ include_upstream:
+ default: false
+ description: If set to true, upstream tasks are also affected.
+ type: boolean
+ only_failed:
+ default: true
+ description: Only clear failed tasks.
+ type: boolean
+ only_running:
+ default: false
+ description: Only clear running tasks.
+ type: boolean
+ reset_dag_runs:
+ description: Set state of DAG runs to RUNNING.
+ type: boolean
+ start_date:
+ description: The minimum execution date to clear.
+ format: datetime
+ type: string
+ task_ids:
+ description: 'A list of task ids to clear.
+
+
+ *New in version 2.1.0*
+
+ '
+ items:
+ type: string
+ minItems: 1
+ type: array
+ type: object
+ CollectionInfo:
+ description: Metadata about collection.
+ properties:
+ total_entries:
+ description: 'Count of total objects in the current result set before pagination
+ parameters
+
+ (limit, offset) are applied.
+
+ '
+ type: integer
+ type: object
+ Color:
+ description: Color in hexadecimal notation.
+ pattern: ^#[a-fA-F0-9]{3,6}$
+ type: string
+ Config:
+ description: The configuration.
+ properties:
+ sections:
+ items:
+ $ref: '#/components/schemas/ConfigSection'
+ type: array
+ type: object
+ ConfigOption:
+ description: The option of configuration.
+ properties:
+ key:
+ readOnly: true
+ type: string
+ value:
+ readOnly: true
+ type: string
+ type: object
+ ConfigSection:
+ description: The section of configuration.
+ properties:
+ name:
+ readOnly: true
+ type: string
+ options:
+ items:
+ $ref: '#/components/schemas/ConfigOption'
+ type: array
+ type: object
+ Connection:
+ allOf:
+ - $ref: '#/components/schemas/ConnectionCollectionItem'
+ - properties:
+ extra:
+ description: Other values that cannot be put into another field, e.g.
+ RSA keys.
+ nullable: true
+ type: string
+ password:
+ description: Password of the connection.
+ format: password
+ type: string
+ writeOnly: true
+ type: object
+ description: Full representation of the connection.
+ ConnectionCollection:
+ allOf:
+ - properties:
+ connections:
+ items:
+ $ref: '#/components/schemas/ConnectionCollectionItem'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of connections.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ ConnectionCollectionItem:
+ description: 'Connection collection item.
+
+ The password and extra fields are only available when retrieving a single
+ object due to the sensitivity of this data.
+
+ '
+ properties:
+ conn_type:
+ description: The connection type.
+ type: string
+ connection_id:
+ description: The connection ID.
+ type: string
+ description:
+ description: The description of the connection.
+ nullable: true
+ type: string
+ host:
+ description: Host of the connection.
+ nullable: true
+ type: string
+ login:
+ description: Login of the connection.
+ nullable: true
+ type: string
+ port:
+ description: Port of the connection.
+ nullable: true
+ type: integer
+ schema:
+ description: Schema of the connection.
+ nullable: true
+ type: string
+ type: object
+ ConnectionTest:
+ description: 'Connection test results.
+
+
+ *New in version 2.2.0*
+
+ '
+ properties:
+ message:
+ description: The success or failure message of the request.
+ type: string
+ status:
+ description: The status of the request.
+ type: boolean
+ type: object
+ CronExpression:
+ description: Cron expression
+ nullable: true
+ properties:
+ __type:
+ type: string
+ value:
+ type: string
+ required:
+ - __type
+ - value
+ type: object
+ DAG:
+ description: DAG
+ properties:
+ dag_id:
+ description: The ID of the DAG.
+ readOnly: true
+ type: string
+ default_view:
+ description: 'Default view of the DAG inside the webserver
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: string
+ description:
+ description: 'User-provided DAG description, which can consist of several
+ sentences or paragraphs that describe DAG contents.
+
+ '
+ nullable: true
+ readOnly: true
+ type: string
+ file_token:
+ description: 'The key containing the encrypted path to the file. Encryption
+ and decryption take place only on the server. This prevents the client
+ from reading an non-DAG file. This also ensures API extensibility, because
+ the format of encrypted data may change.
+
+ '
+ readOnly: true
+ type: string
+ fileloc:
+ description: The absolute path to the file.
+ readOnly: true
+ type: string
+ has_import_errors:
+ description: 'Whether the DAG has import errors
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: boolean
+ has_task_concurrency_limits:
+ description: 'Whether the DAG has task concurrency limits
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: boolean
+ is_active:
+ description: 'Whether the DAG is currently seen by the scheduler(s).
+
+
+ *New in version 2.1.1*
+
+
+ *Changed in version 2.2.0*: Field is read-only.
+
+ '
+ nullable: true
+ readOnly: true
+ type: boolean
+ is_paused:
+ description: Whether the DAG is paused.
+ nullable: true
+ type: boolean
+ is_subdag:
+ description: Whether the DAG is SubDAG.
+ readOnly: true
+ type: boolean
+ last_expired:
+ description: 'Time when the DAG last received a refresh signal
+
+ (e.g. the DAG''s "refresh" button was clicked in the web UI)
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ last_parsed_time:
+ description: 'The last time the DAG was parsed.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ last_pickled:
+ description: 'The last time the DAG was pickled.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ max_active_runs:
+ description: 'Maximum number of active DAG runs for the DAG
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: integer
+ max_active_tasks:
+ description: 'Maximum number of active tasks that can be run on the DAG
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: integer
+ next_dagrun:
+ description: 'The logical date of the next dag run.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ next_dagrun_create_after:
+ description: 'Earliest time at which this ``next_dagrun`` can be created.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ next_dagrun_data_interval_end:
+ description: 'The end of the interval of the next dag run.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ next_dagrun_data_interval_start:
+ description: 'The start of the interval of the next dag run.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ owners:
+ items:
+ type: string
+ readOnly: true
+ type: array
+ pickle_id:
+ description: 'Foreign key to the latest pickle_id
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: string
+ root_dag_id:
+ description: If the DAG is SubDAG then it is the top level DAG identifier.
+ Otherwise, null.
+ nullable: true
+ readOnly: true
+ type: string
+ schedule_interval:
+ $ref: '#/components/schemas/ScheduleInterval'
+ scheduler_lock:
+ description: 'Whether (one of) the scheduler is scheduling this DAG at the
+ moment
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: boolean
+ tags:
+ description: List of tags.
+ items:
+ $ref: '#/components/schemas/Tag'
+ nullable: true
+ readOnly: true
+ type: array
+ timetable_description:
+ description: 'Timetable/Schedule Interval description.
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: string
+ type: object
+ DAGCollection:
+ allOf:
+ - properties:
+ dags:
+ items:
+ $ref: '#/components/schemas/DAG'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of DAGs.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ DAGDetail:
+ allOf:
+ - $ref: '#/components/schemas/DAG'
+ - properties:
+ catchup:
+ readOnly: true
+ type: boolean
+ concurrency:
+ readOnly: true
+ type: number
+ dag_run_timeout:
+ $ref: '#/components/schemas/TimeDelta'
+ default_view:
+ nullable: true
+ readOnly: true
+ type: string
+ doc_md:
+ nullable: true
+ readOnly: true
+ type: string
+ end_date:
+ description: 'The DAG''s end date.
+
+
+ *New in version 2.3.0*.
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ is_paused_upon_creation:
+ description: 'Whether the DAG is paused upon creation.
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: boolean
+ last_parsed:
+ description: 'The last time the DAG was parsed.
+
+
+ *New in version 2.3.0*
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ orientation:
+ readOnly: true
+ type: string
+ params:
+ description: 'User-specified DAG params.
+
+
+ *New in version 2.0.1*
+
+ '
+ readOnly: true
+ type: object
+ render_template_as_native_obj:
+ description: 'Whether to render templates as native Python objects.
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ readOnly: true
+ type: boolean
+ start_date:
+ description: 'The DAG''s start date.
+
+
+ *Changed in version 2.0.1*: Field becomes nullable.
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ template_search_path:
+ description: 'The template search path.
+
+
+ *New in version 2.3.0*
+
+ '
+ items:
+ type: string
+ nullable: true
+ type: array
+ timezone:
+ $ref: '#/components/schemas/Timezone'
+ type: object
+ description: 'DAG details.
+
+
+ For details see:
+
+ [airflow.models.dag.DAG](https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/dag/index.html#airflow.models.dag.DAG)
+
+ '
+ DAGRun:
+ properties:
+ conf:
+ description: 'JSON object describing additional configuration parameters.
+
+
+ The value of this field can be set only when creating the object. If you
+ try to modify the
+
+ field of an existing object, the request fails with an BAD_REQUEST error.
+
+ '
+ type: object
+ dag_id:
+ readOnly: true
+ type: string
+ dag_run_id:
+ description: 'Run ID.
+
+
+ The value of this field can be set only when creating the object. If you
+ try to modify the
+
+ field of an existing object, the request fails with an BAD_REQUEST error.
+
+
+ If not provided, a value will be generated based on execution_date.
+
+
+ If the specified dag_run_id is in use, the creation request fails with
+ an ALREADY_EXISTS error.
+
+
+ This together with DAG_ID are a unique key.
+
+ '
+ nullable: true
+ type: string
+ data_interval_end:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ data_interval_start:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ end_date:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ execution_date:
+ deprecated: true
+ description: 'The execution date. This is the same as logical_date, kept
+ for backwards compatibility.
+
+ If both this field and logical_date are provided but with different values,
+ the request
+
+ will fail with an BAD_REQUEST error.
+
+
+ *Changed in version 2.2.0*: Field becomes nullable.
+
+
+ *Deprecated since version 2.2.0*: Use ''logical_date'' instead.
+
+ '
+ format: date-time
+ nullable: true
+ type: string
+ external_trigger:
+ readOnly: true
+ type: boolean
+ last_scheduling_decision:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ logical_date:
+ description: 'The logical date (previously called execution date). This
+ is the time or interval covered by
+
+ this DAG run, according to the DAG definition.
+
+
+ The value of this field can be set only when creating the object. If you
+ try to modify the
+
+ field of an existing object, the request fails with an BAD_REQUEST error.
+
+
+ This together with DAG_ID are a unique key.
+
+
+ *New in version 2.2.0*
+
+ '
+ format: date-time
+ nullable: true
+ type: string
+ note:
+ description: 'Contains manually entered notes by the user about the DagRun.
+
+
+ *New in version 2.5.0*
+
+ '
+ nullable: true
+ type: string
+ run_type:
+ enum:
+ - backfill
+ - manual
+ - scheduled
+ - dataset_triggered
+ readOnly: true
+ type: string
+ start_date:
+ description: 'The start time. The time when DAG run was actually created.
+
+
+ *Changed in version 2.1.3*: Field becomes nullable.
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ state:
+ $ref: '#/components/schemas/DagState'
+ type: object
+ DAGRunCollection:
+ allOf:
+ - properties:
+ dag_runs:
+ items:
+ $ref: '#/components/schemas/DAGRun'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of DAG runs.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ DagProcessorStatus:
+ description: 'The status and the latest dag processor heartbeat.
+
+
+ *New in version 2.6.3*
+
+ '
+ properties:
+ latest_dag_processor_heartbeat:
+ description: The time the dag processor last did a heartbeat.
+ format: datetime
+ nullable: true
+ readOnly: true
+ type: string
+ status:
+ $ref: '#/components/schemas/HealthStatus'
+ type: object
+ DagScheduleDatasetReference:
+ description: 'A datasets reference to a downstream DAG.
+
+
+ *New in version 2.4.0*
+
+ '
+ properties:
+ created_at:
+ description: The dataset reference creation time
+ nullable: false
+ type: string
+ dag_id:
+ description: The DAG ID that depends on the dataset.
+ nullable: true
+ type: string
+ updated_at:
+ description: The dataset reference update time
+ nullable: false
+ type: string
+ type: object
+ DagState:
+ description: 'DAG State.
+
+
+ *Changed in version 2.1.3*: ''queued'' is added as a possible value.
+
+ '
+ enum:
+ - queued
+ - running
+ - success
+ - failed
+ readOnly: true
+ type: string
+ DagWarning:
+ properties:
+ dag_id:
+ description: The dag_id.
+ readOnly: true
+ type: string
+ message:
+ description: The message for the dag warning.
+ readOnly: true
+ type: string
+ timestamp:
+ description: The time when this warning was logged.
+ format: datetime
+ readOnly: true
+ type: string
+ warning_type:
+ description: The warning type for the dag warning.
+ readOnly: true
+ type: string
+ type: object
+ DagWarningCollection:
+ allOf:
+ - properties:
+ import_errors:
+ items:
+ $ref: '#/components/schemas/DagWarning'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of DAG warnings.
+
+ '
+ type: object
+ Dataset:
+ description: 'A dataset item.
+
+
+ *New in version 2.4.0*
+
+ '
+ properties:
+ consuming_dags:
+ items:
+ $ref: '#/components/schemas/DagScheduleDatasetReference'
+ type: array
+ created_at:
+ description: The dataset creation time
+ nullable: false
+ type: string
+ extra:
+ description: The dataset extra
+ nullable: true
+ type: object
+ id:
+ description: The dataset id
+ type: integer
+ producing_tasks:
+ items:
+ $ref: '#/components/schemas/TaskOutletDatasetReference'
+ type: array
+ updated_at:
+ description: The dataset update time
+ nullable: false
+ type: string
+ uri:
+ description: The dataset uri
+ nullable: false
+ type: string
+ type: object
+ DatasetCollection:
+ allOf:
+ - properties:
+ datasets:
+ items:
+ $ref: '#/components/schemas/Dataset'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'A collection of datasets.
+
+
+ *New in version 2.4.0*
+
+ '
+ type: object
+ DatasetEvent:
+ description: 'A dataset event.
+
+
+ *New in version 2.4.0*
+
+ '
+ properties:
+ created_dagruns:
+ items:
+ $ref: '#/components/schemas/BasicDAGRun'
+ type: array
+ dataset_id:
+ description: The dataset id
+ type: integer
+ dataset_uri:
+ description: The URI of the dataset
+ nullable: false
+ type: string
+ extra:
+ description: The dataset event extra
+ nullable: true
+ type: object
+ source_dag_id:
+ description: The DAG ID that updated the dataset.
+ nullable: true
+ type: string
+ source_map_index:
+ description: The task map index that updated the dataset.
+ nullable: true
+ type: integer
+ source_run_id:
+ description: The DAG run ID that updated the dataset.
+ nullable: true
+ type: string
+ source_task_id:
+ description: The task ID that updated the dataset.
+ nullable: true
+ type: string
+ timestamp:
+ description: The dataset event creation time
+ nullable: false
+ type: string
+ type: object
+ DatasetEventCollection:
+ allOf:
+ - properties:
+ dataset_events:
+ items:
+ $ref: '#/components/schemas/DatasetEvent'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'A collection of dataset events.
+
+
+ *New in version 2.4.0*
+
+ '
+ type: object
+ Error:
+ description: '[RFC7807](https://tools.ietf.org/html/rfc7807) compliant response.
+
+ '
+ properties:
+ detail:
+ description: A human-readable explanation specific to this occurrence of
+ the problem.
+ type: string
+ instance:
+ description: 'A URI reference that identifies the specific occurrence of
+ the problem. It may or may
+
+ not yield further information if dereferenced.
+
+ '
+ type: string
+ status:
+ description: The HTTP status code generated by the API server for this occurrence
+ of the problem.
+ type: number
+ title:
+ description: A short, human-readable summary of the problem type.
+ type: string
+ type:
+ 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.
+
+ '
+ type: string
+ required:
+ - type
+ - title
+ - status
+ type: object
+ EventLog:
+ description: Log of user operations via CLI or Web UI.
+ properties:
+ dag_id:
+ description: The DAG ID
+ nullable: true
+ readOnly: true
+ type: string
+ event:
+ description: A key describing the type of event.
+ readOnly: true
+ type: string
+ event_log_id:
+ description: The event log ID
+ readOnly: true
+ type: integer
+ execution_date:
+ description: 'When the event was dispatched for an object having execution_date,
+ the value of this field.
+
+ '
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ extra:
+ description: 'Other information that was not included in the other fields,
+ e.g. the complete CLI command.
+
+ '
+ nullable: true
+ readOnly: true
+ type: string
+ owner:
+ description: Name of the user who triggered these events a.
+ readOnly: true
+ type: string
+ task_id:
+ description: The DAG ID
+ nullable: true
+ readOnly: true
+ type: string
+ when:
+ description: The time when these events happened.
+ format: date-time
+ readOnly: true
+ type: string
+ type: object
+ EventLogCollection:
+ allOf:
+ - properties:
+ event_logs:
+ items:
+ $ref: '#/components/schemas/EventLog'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of event logs.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ ExtraLink:
+ description: Additional links containing additional information about the task.
+ properties:
+ class_ref:
+ $ref: '#/components/schemas/ClassReference'
+ href:
+ readOnly: true
+ type: string
+ name:
+ readOnly: true
+ type: string
+ type: object
+ ExtraLinkCollection:
+ description: The collection of extra links.
+ properties:
+ extra_links:
+ items:
+ $ref: '#/components/schemas/ExtraLink'
+ type: array
+ type: object
+ HealthInfo:
+ description: Instance status information.
+ properties:
+ dag_processor:
+ $ref: '#/components/schemas/DagProcessorStatus'
+ metadatabase:
+ $ref: '#/components/schemas/MetadatabaseStatus'
+ scheduler:
+ $ref: '#/components/schemas/SchedulerStatus'
+ triggerer:
+ $ref: '#/components/schemas/TriggererStatus'
+ type: object
+ HealthStatus:
+ description: Health status
+ enum:
+ - healthy
+ - unhealthy
+ nullable: true
+ type: string
+ ImportError:
+ properties:
+ filename:
+ description: The filename
+ readOnly: true
+ type: string
+ import_error_id:
+ description: The import error ID.
+ readOnly: true
+ type: integer
+ stack_trace:
+ description: The full stackstrace..
+ readOnly: true
+ type: string
+ timestamp:
+ description: The time when this error was created.
+ format: datetime
+ readOnly: true
+ type: string
+ type: object
+ ImportErrorCollection:
+ allOf:
+ - properties:
+ import_errors:
+ items:
+ $ref: '#/components/schemas/ImportError'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of import errors.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ Job:
+ nullable: true
+ properties:
+ dag_id:
+ nullable: true
+ type: string
+ end_date:
+ format: datetime
+ nullable: true
+ type: string
+ executor_class:
+ nullable: true
+ type: string
+ hostname:
+ nullable: true
+ type: string
+ id:
+ type: integer
+ job_type:
+ nullable: true
+ type: string
+ latest_heartbeat:
+ format: datetime
+ nullable: true
+ type: string
+ start_date:
+ format: datetime
+ nullable: true
+ type: string
+ state:
+ nullable: true
+ type: string
+ unixname:
+ nullable: true
+ type: string
+ type: object
+ ListDagRunsForm:
+ properties:
+ dag_ids:
+ description: 'Return objects with specific DAG IDs.
+
+ The value can be repeated to retrieve multiple matching values (OR condition).'
+ items:
+ type: string
+ type: array
+ end_date_gte:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with end_date_lte parameter to receive only the selected
+ period.
+
+ '
+ format: date-time
+ type: string
+ end_date_lte:
+ description: 'Returns objects less than or equal to the specified date.
+
+
+ This can be combined with end_date_gte parameter to receive only the selected
+ period.
+
+ '
+ format: date-time
+ type: string
+ execution_date_gte:
+ description: 'Returns objects greater or equal to the specified date.
+
+
+ This can be combined with execution_date_lte key to receive only the selected
+ period.
+
+ '
+ format: date-time
+ type: string
+ execution_date_lte:
+ description: 'Returns objects less than or equal to the specified date.
+
+
+ This can be combined with execution_date_gte key to receive only the selected
+ period.
+
+ '
+ format: date-time
+ type: string
+ order_by:
+ description: 'The name of the field to order the results by. Prefix a field
+ name
+
+ with `-` to reverse the sort order.
+
+
+ *New in version 2.1.0*
+
+ '
+ type: string
+ page_limit:
+ default: 100
+ description: The numbers of items to return.
+ minimum: 1
+ type: integer
+ page_offset:
+ description: The number of items to skip before starting to collect the
+ result set.
+ minimum: 0
+ type: integer
+ start_date_gte:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with start_date_lte key to receive only the selected
+ period.
+
+ '
+ format: date-time
+ type: string
+ start_date_lte:
+ description: 'Returns objects less or equal the specified date.
+
+
+ This can be combined with start_date_gte parameter to receive only the
+ selected period
+
+ '
+ format: date-time
+ type: string
+ states:
+ description: 'Return objects with specific states.
+
+ The value can be repeated to retrieve multiple matching values (OR condition).'
+ items:
+ type: string
+ type: array
+ type: object
+ ListTaskInstanceForm:
+ properties:
+ dag_ids:
+ description: 'Return objects with specific DAG IDs.
+
+ The value can be repeated to retrieve multiple matching values (OR condition).'
+ items:
+ type: string
+ type: array
+ dag_run_ids:
+ description: 'Return objects with specific DAG Run IDs.
+
+ The value can be repeated to retrieve multiple matching values (OR condition).
+
+ *New in version 2.7.1*'
+ items:
+ type: string
+ type: array
+ duration_gte:
+ description: 'Returns objects greater than or equal to the specified values.
+
+
+ This can be combined with duration_lte parameter to receive only the selected
+ period.
+
+ '
+ type: number
+ duration_lte:
+ description: 'Returns objects less than or equal to the specified values.
+
+
+ This can be combined with duration_gte parameter to receive only the selected
+ range.
+
+ '
+ type: number
+ end_date_gte:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with start_date_lte parameter to receive only the
+ selected period.
+
+ '
+ format: date-time
+ type: string
+ end_date_lte:
+ description: 'Returns objects less than or equal to the specified date.
+
+
+ This can be combined with start_date_gte parameter to receive only the
+ selected period.
+
+ '
+ format: date-time
+ type: string
+ execution_date_gte:
+ description: 'Returns objects greater or equal to the specified date.
+
+
+ This can be combined with execution_date_lte parameter to receive only
+ the selected period.
+
+ '
+ format: date-time
+ type: string
+ execution_date_lte:
+ description: 'Returns objects less than or equal to the specified date.
+
+
+ This can be combined with execution_date_gte parameter to receive only
+ the selected period.
+
+ '
+ format: date-time
+ type: string
+ pool:
+ description: The value can be repeated to retrieve multiple matching values
+ (OR condition).
+ items:
+ type: string
+ type: array
+ queue:
+ description: The value can be repeated to retrieve multiple matching values
+ (OR condition).
+ items:
+ type: string
+ type: array
+ start_date_gte:
+ description: 'Returns objects greater or equal the specified date.
+
+
+ This can be combined with start_date_lte parameter to receive only the
+ selected period.
+
+ '
+ format: date-time
+ type: string
+ start_date_lte:
+ description: 'Returns objects less or equal the specified date.
+
+
+ This can be combined with start_date_gte parameter to receive only the
+ selected period.
+
+ '
+ format: date-time
+ type: string
+ state:
+ description: The value can be repeated to retrieve multiple matching values
+ (OR condition).
+ items:
+ $ref: '#/components/schemas/TaskState'
+ type: array
+ task_ids:
+ description: 'Return objects with specific task IDs.
+
+ The value can be repeated to retrieve multiple matching values (OR condition).
+
+ *New in version 2.7.1*'
+ items:
+ type: string
+ type: array
+ type: object
+ MetadatabaseStatus:
+ description: The status of the metadatabase.
+ properties:
+ status:
+ $ref: '#/components/schemas/HealthStatus'
+ type: object
+ PluginCollection:
+ allOf:
+ - properties:
+ plugins:
+ items:
+ $ref: '#/components/schemas/PluginCollectionItem'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'A collection of plugin.
+
+
+ *New in version 2.1.0*
+
+ '
+ type: object
+ PluginCollectionItem:
+ description: 'A plugin Item.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ appbuilder_menu_items:
+ description: The Flask Appbuilder menu items
+ items:
+ nullable: true
+ type: object
+ type: array
+ appbuilder_views:
+ description: The appuilder views
+ items:
+ nullable: true
+ type: object
+ type: array
+ executors:
+ description: The plugin executors
+ items:
+ nullable: true
+ type: string
+ type: array
+ flask_blueprints:
+ description: The flask blueprints
+ items:
+ nullable: true
+ type: string
+ type: array
+ global_operator_extra_links:
+ description: The global operator extra links
+ items:
+ nullable: true
+ type: string
+ type: array
+ hooks:
+ description: The plugin hooks
+ items:
+ nullable: true
+ type: string
+ type: array
+ listeners:
+ description: The plugin listeners
+ items:
+ type: string
+ type: array
+ macros:
+ description: The plugin macros
+ items:
+ nullable: true
+ type: string
+ type: array
+ name:
+ description: The name of the plugin
+ type: string
+ operator_extra_links:
+ description: Operator extra links
+ items:
+ nullable: true
+ type: string
+ type: array
+ source:
+ description: The plugin source
+ nullable: true
+ type: string
+ ti_deps:
+ description: The plugin task instance dependencies
+ items:
+ type: string
+ type: array
+ timetables:
+ description: The plugin timetables
+ items:
+ type: string
+ type: array
+ type: object
+ Pool:
+ description: The pool
+ properties:
+ deferred_slots:
+ description: 'The number of slots used by deferred tasks at the moment.
+ Relevant if ''include_deferred'' is set to true.
+
+
+ *New in version 2.7.0*
+
+ '
+ readOnly: true
+ type: integer
+ description:
+ description: 'The description of the pool.
+
+
+ *New in version 2.3.0*
+
+ '
+ nullable: true
+ type: string
+ include_deferred:
+ description: 'If set to true, deferred tasks are considered when calculating
+ open pool slots.
+
+
+ *New in version 2.7.0*
+
+ '
+ type: boolean
+ name:
+ description: The name of pool.
+ type: string
+ occupied_slots:
+ description: The number of slots used by running/queued tasks at the moment.
+ May include deferred tasks if 'include_deferred' is set to true.
+ readOnly: true
+ type: integer
+ open_slots:
+ description: The number of free slots at the moment.
+ readOnly: true
+ type: integer
+ queued_slots:
+ description: The number of slots used by queued tasks at the moment.
+ readOnly: true
+ type: integer
+ running_slots:
+ description: The number of slots used by running tasks at the moment.
+ readOnly: true
+ type: integer
+ scheduled_slots:
+ description: The number of slots used by scheduled tasks at the moment.
+ readOnly: true
+ type: integer
+ slots:
+ description: 'The maximum number of slots that can be assigned to tasks.
+ One job may occupy one or more slots.
+
+ '
+ type: integer
+ type: object
+ PoolCollection:
+ allOf:
+ - properties:
+ pools:
+ items:
+ $ref: '#/components/schemas/Pool'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of pools.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ Provider:
+ description: 'The provider
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ description:
+ description: The description of the provider.
+ type: string
+ package_name:
+ description: The package name of the provider.
+ type: string
+ version:
+ description: The version of the provider.
+ type: string
+ type: object
+ ProviderCollection:
+ description: 'Collection of providers.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ providers:
+ items:
+ $ref: '#/components/schemas/Provider'
+ type: array
+ type: object
+ RelativeDelta:
+ description: Relative delta
+ properties:
+ __type:
+ type: string
+ day:
+ type: integer
+ days:
+ type: integer
+ hour:
+ type: integer
+ hours:
+ type: integer
+ leapdays:
+ type: integer
+ microsecond:
+ type: integer
+ microseconds:
+ type: integer
+ minute:
+ type: integer
+ minutes:
+ type: integer
+ month:
+ type: integer
+ months:
+ type: integer
+ second:
+ type: integer
+ seconds:
+ type: integer
+ year:
+ type: integer
+ years:
+ type: integer
+ required:
+ - __type
+ - years
+ - months
+ - days
+ - leapdays
+ - hours
+ - minutes
+ - seconds
+ - microseconds
+ - year
+ - month
+ - day
+ - hour
+ - minute
+ - second
+ - microsecond
+ type: object
+ Resource:
+ description: 'A resource on which permissions are granted.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ name:
+ description: The name of the resource
+ nullable: false
+ type: string
+ type: object
+ Role:
+ description: 'a role item.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ actions:
+ items:
+ $ref: '#/components/schemas/ActionResource'
+ type: array
+ name:
+ description: 'The name of the role
+
+
+ *Changed in version 2.3.0*: A minimum character length requirement
+ (''minLength'') is added.
+
+ '
+ minLength: 1
+ type: string
+ type: object
+ RoleCollection:
+ allOf:
+ - properties:
+ roles:
+ items:
+ $ref: '#/components/schemas/Role'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'A collection of roles.
+
+
+ *New in version 2.1.0*
+
+ '
+ type: object
+ SLAMiss:
+ nullable: true
+ properties:
+ dag_id:
+ description: The DAG ID.
+ type: string
+ description:
+ nullable: true
+ type: string
+ email_sent:
+ type: boolean
+ execution_date:
+ format: datetime
+ type: string
+ notification_sent:
+ type: boolean
+ task_id:
+ description: The task ID.
+ readOnly: true
+ type: string
+ timestamp:
+ format: datetime
+ type: string
+ type: object
+ ScheduleInterval:
+ anyOf:
+ - $ref: '#/components/schemas/TimeDelta'
+ - $ref: '#/components/schemas/RelativeDelta'
+ - $ref: '#/components/schemas/CronExpression'
+ description: 'Schedule interval. Defines how often DAG runs, this object gets
+ added to your latest task instance''s
+
+ execution_date to figure out the next schedule.
+
+ '
+ discriminator:
+ propertyName: __type
+ nullable: true
+ readOnly: true
+ SchedulerStatus:
+ description: The status and the latest scheduler heartbeat.
+ properties:
+ latest_scheduler_heartbeat:
+ description: The time the scheduler last did a heartbeat.
+ format: datetime
+ nullable: true
+ readOnly: true
+ type: string
+ status:
+ $ref: '#/components/schemas/HealthStatus'
+ type: object
+ SetDagRunNote:
+ properties:
+ note:
+ description: Custom notes left by users for this Dag Run.
+ type: string
+ type: object
+ SetTaskInstanceNote:
+ properties:
+ note:
+ description: The custom note to set for this Task Instance.
+ type: string
+ required:
+ - note
+ type: object
+ Tag:
+ description: Tag
+ properties:
+ name:
+ type: string
+ type: object
+ Task:
+ description: 'For details see:
+
+ [airflow.models.baseoperator.BaseOperator](https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/baseoperator/index.html#airflow.models.baseoperator.BaseOperator)
+
+ '
+ properties:
+ class_ref:
+ $ref: '#/components/schemas/ClassReference'
+ depends_on_past:
+ readOnly: true
+ type: boolean
+ downstream_task_ids:
+ items:
+ type: string
+ readOnly: true
+ type: array
+ end_date:
+ format: date-time
+ nullable: true
+ readOnly: true
+ type: string
+ execution_timeout:
+ $ref: '#/components/schemas/TimeDelta'
+ extra_links:
+ items:
+ properties:
+ class_ref:
+ $ref: '#/components/schemas/ClassReference'
+ type: object
+ readOnly: true
+ type: array
+ is_mapped:
+ readOnly: true
+ type: boolean
+ owner:
+ readOnly: true
+ type: string
+ pool:
+ readOnly: true
+ type: string
+ pool_slots:
+ readOnly: true
+ type: number
+ priority_weight:
+ readOnly: true
+ type: number
+ queue:
+ nullable: true
+ readOnly: true
+ type: string
+ retries:
+ readOnly: true
+ type: number
+ retry_delay:
+ $ref: '#/components/schemas/TimeDelta'
+ retry_exponential_backoff:
+ readOnly: true
+ type: boolean
+ start_date:
+ format: date-time
+ readOnly: true
+ type: string
+ sub_dag:
+ $ref: '#/components/schemas/DAG'
+ task_id:
+ readOnly: true
+ type: string
+ template_fields:
+ items:
+ type: string
+ readOnly: true
+ type: array
+ trigger_rule:
+ $ref: '#/components/schemas/TriggerRule'
+ ui_color:
+ $ref: '#/components/schemas/Color'
+ ui_fgcolor:
+ $ref: '#/components/schemas/Color'
+ wait_for_downstream:
+ readOnly: true
+ type: boolean
+ weight_rule:
+ $ref: '#/components/schemas/WeightRule'
+ type: object
+ TaskCollection:
+ description: Collection of tasks.
+ properties:
+ tasks:
+ items:
+ $ref: '#/components/schemas/Task'
+ type: array
+ type: object
+ TaskInstance:
+ properties:
+ dag_id:
+ type: string
+ dag_run_id:
+ description: 'The DagRun ID for this task instance
+
+
+ *New in version 2.3.0*
+
+ '
+ type: string
+ duration:
+ nullable: true
+ type: number
+ end_date:
+ format: datetime
+ nullable: true
+ type: string
+ execution_date:
+ format: datetime
+ type: string
+ executor_config:
+ type: string
+ hostname:
+ type: string
+ map_index:
+ type: integer
+ max_tries:
+ type: integer
+ note:
+ description: 'Contains manually entered notes by the user about the TaskInstance.
+
+
+ *New in version 2.5.0*
+
+ '
+ nullable: true
+ type: string
+ operator:
+ description: '*Changed in version 2.1.1*: Field becomes nullable.
+
+ '
+ nullable: true
+ type: string
+ pid:
+ nullable: true
+ type: integer
+ pool:
+ type: string
+ pool_slots:
+ type: integer
+ priority_weight:
+ nullable: true
+ type: integer
+ queue:
+ nullable: true
+ type: string
+ queued_when:
+ nullable: true
+ type: string
+ rendered_fields:
+ description: 'JSON object describing rendered fields.
+
+
+ *New in version 2.3.0*
+
+ '
+ type: object
+ sla_miss:
+ $ref: '#/components/schemas/SLAMiss'
+ start_date:
+ format: datetime
+ nullable: true
+ type: string
+ state:
+ $ref: '#/components/schemas/TaskState'
+ task_id:
+ type: string
+ trigger:
+ $ref: '#/components/schemas/Trigger'
+ triggerer_job:
+ $ref: '#/components/schemas/Job'
+ try_number:
+ type: integer
+ unixname:
+ type: string
+ type: object
+ TaskInstanceCollection:
+ allOf:
+ - properties:
+ task_instances:
+ items:
+ $ref: '#/components/schemas/TaskInstance'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of task instances.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ TaskInstanceReference:
+ properties:
+ dag_id:
+ description: The DAG ID.
+ readOnly: true
+ type: string
+ dag_run_id:
+ description: The DAG run ID.
+ readOnly: true
+ type: string
+ execution_date:
+ format: datetime
+ readOnly: true
+ type: string
+ task_id:
+ description: The task ID.
+ readOnly: true
+ type: string
+ type: object
+ TaskInstanceReferenceCollection:
+ properties:
+ task_instances:
+ items:
+ $ref: '#/components/schemas/TaskInstanceReference'
+ type: array
+ type: object
+ TaskOutletDatasetReference:
+ description: 'A datasets reference to an upstream task.
+
+
+ *New in version 2.4.0*
+
+ '
+ properties:
+ created_at:
+ description: The dataset creation time
+ nullable: false
+ type: string
+ dag_id:
+ description: The DAG ID that updates the dataset.
+ nullable: true
+ type: string
+ task_id:
+ description: The task ID that updates the dataset.
+ nullable: true
+ type: string
+ updated_at:
+ description: The dataset update time
+ nullable: false
+ type: string
+ type: object
+ TaskState:
+ description: 'Task state.
+
+
+ *Changed in version 2.0.2*: ''removed'' is added as a possible value.
+
+
+ *Changed in version 2.2.0*: ''deferred'' is added as a possible value.
+
+
+ *Changed in version 2.4.0*: ''sensing'' state has been removed.
+
+ *Changed in version 2.4.2*: ''restarting'' is added as a possible value
+
+
+ *Changed in version 2.7.0*: Field becomes nullable and null primitive
+ is added as a possible value.
+
+ *Changed in version 2.7.0*: ''none'' state is deprecated in favor of null.
+
+ '
+ enum:
+ - null
+ - success
+ - running
+ - failed
+ - upstream_failed
+ - skipped
+ - up_for_retry
+ - up_for_reschedule
+ - queued
+ - none
+ - scheduled
+ - deferred
+ - removed
+ - restarting
+ nullable: true
+ type: string
+ TimeDelta:
+ description: Time delta
+ nullable: true
+ properties:
+ __type:
+ type: string
+ days:
+ type: integer
+ microseconds:
+ type: integer
+ seconds:
+ type: integer
+ required:
+ - __type
+ - days
+ - seconds
+ - microseconds
+ type: object
+ Timezone:
+ type: string
+ Trigger:
+ nullable: true
+ properties:
+ classpath:
+ type: string
+ created_date:
+ format: datetime
+ type: string
+ id:
+ type: integer
+ kwargs:
+ type: string
+ triggerer_id:
+ nullable: true
+ type: integer
+ type: object
+ TriggerRule:
+ description: 'Trigger rule.
+
+
+ *Changed in version 2.2.0*: ''none_failed_min_one_success'' is added as
+ a possible value. Deprecated ''dummy'' and ''always'' is added as a possible
+ value
+
+
+ *Changed in version 2.3.0*: ''all_skipped'' is added as a possible value.
+
+
+ *Changed in version 2.5.0*: ''one_done'' is added as a possible value.
+
+
+ *Changed in version 2.7.0*: ''all_done_setup_success'' is added as a possible
+ value.
+
+ '
+ enum:
+ - all_success
+ - all_failed
+ - all_done
+ - all_done_setup_success
+ - one_success
+ - one_failed
+ - one_done
+ - none_failed
+ - none_skipped
+ - none_failed_or_skipped
+ - none_failed_min_one_success
+ - dummy
+ - all_skipped
+ - always
+ type: string
+ TriggererStatus:
+ description: 'The status and the latest triggerer heartbeat.
+
+
+ *New in version 2.6.2*
+
+ '
+ properties:
+ latest_triggerer_heartbeat:
+ description: The time the triggerer last did a heartbeat.
+ format: datetime
+ nullable: true
+ readOnly: true
+ type: string
+ status:
+ $ref: '#/components/schemas/HealthStatus'
+ type: object
+ UpdateDagRunState:
+ description: 'Modify the state of a DAG run.
+
+
+ *New in version 2.2.0*
+
+ '
+ properties:
+ state:
+ description: The state to set this DagRun
+ enum:
+ - success
+ - failed
+ - queued
+ type: string
+ type: object
+ UpdateTaskInstance:
+ properties:
+ dry_run:
+ default: true
+ description: 'If set, don''t actually run this operation. The response will
+ contain the task instance
+
+ planned to be affected, but won''t be modified in any way.
+
+ '
+ type: boolean
+ new_state:
+ $ref: '#/components/schemas/UpdateTaskState'
+ type: object
+ UpdateTaskInstancesState:
+ properties:
+ dag_run_id:
+ description: 'The task instance''s DAG run ID. Either set this or execution_date
+ but not both.
+
+
+ *New in version 2.3.0*
+
+ '
+ type: string
+ dry_run:
+ default: true
+ description: 'If set, don''t actually run this operation. The response will
+ contain a list of task instances
+
+ planned to be affected, but won''t be modified in any way.
+
+ '
+ type: boolean
+ execution_date:
+ description: The execution date. Either set this or dag_run_id but not both.
+ format: datetime
+ type: string
+ include_downstream:
+ description: If set to true, downstream tasks are also affected.
+ type: boolean
+ include_future:
+ description: If set to True, also tasks from future DAG Runs are affected.
+ type: boolean
+ include_past:
+ description: If set to True, also tasks from past DAG Runs are affected.
+ type: boolean
+ include_upstream:
+ description: If set to true, upstream tasks are also affected.
+ type: boolean
+ new_state:
+ $ref: '#/components/schemas/UpdateTaskState'
+ task_id:
+ description: The task ID.
+ type: string
+ type: object
+ UpdateTaskState:
+ description: 'Expected new state. Only a subset of TaskState are available.
+
+
+ Other states are managed directly by the scheduler or the workers and cannot
+ be updated manually through the REST API.
+
+ '
+ enum:
+ - success
+ - failed
+ - skipped
+ type: string
+ User:
+ allOf:
+ - $ref: '#/components/schemas/UserCollectionItem'
+ - properties:
+ password:
+ type: string
+ writeOnly: true
+ type: object
+ description: 'A user object with sensitive data.
+
+
+ *New in version 2.1.0*
+
+ '
+ type: object
+ UserCollection:
+ allOf:
+ - properties:
+ users:
+ items:
+ $ref: '#/components/schemas/UserCollectionItem'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of users.
+
+
+ *New in version 2.1.0*
+
+ '
+ type: object
+ UserCollectionItem:
+ description: 'A user object.
+
+
+ *New in version 2.1.0*
+
+ '
+ properties:
+ active:
+ description: Whether the user is active
+ nullable: true
+ readOnly: true
+ type: boolean
+ changed_on:
+ description: The date user was changed
+ format: datetime
+ nullable: true
+ readOnly: true
+ type: string
+ created_on:
+ description: The date user was created
+ format: datetime
+ nullable: true
+ readOnly: true
+ type: string
+ email:
+ description: 'The user''s email.
+
+
+ *Changed in version 2.2.0*: A minimum character length requirement
+ (''minLength'') is added.
+
+ '
+ minLength: 1
+ type: string
+ failed_login_count:
+ description: The number of times the login failed
+ nullable: true
+ readOnly: true
+ type: integer
+ first_name:
+ description: 'The user''s first name.
+
+
+ *Changed in version 2.4.0*: The requirement for this to be non-empty
+ was removed.
+
+ '
+ type: string
+ last_login:
+ description: The last user login
+ format: datetime
+ nullable: true
+ readOnly: true
+ type: string
+ last_name:
+ description: 'The user''s last name.
+
+
+ *Changed in version 2.4.0*: The requirement for this to be non-empty
+ was removed.
+
+ '
+ type: string
+ login_count:
+ description: The login count
+ nullable: true
+ readOnly: true
+ type: integer
+ roles:
+ description: 'User roles.
+
+
+ *Changed in version 2.2.0*: Field is no longer read-only.
+
+ '
+ items:
+ nullable: true
+ properties:
+ name:
+ type: string
+ type: object
+ type: array
+ username:
+ description: 'The username.
+
+
+ *Changed in version 2.2.0*: A minimum character length requirement
+ (''minLength'') is added.
+
+ '
+ minLength: 1
+ type: string
+ type: object
+ Variable:
+ allOf:
+ - $ref: '#/components/schemas/VariableCollectionItem'
+ - properties:
+ value:
+ type: string
+ type: object
+ description: Full representation of Variable
+ VariableCollection:
+ allOf:
+ - properties:
+ variables:
+ items:
+ $ref: '#/components/schemas/VariableCollectionItem'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of variables.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ VariableCollectionItem:
+ description: 'XCom entry collection item.
+
+ The value field are only available when retrieving a single object due to
+ the sensitivity of this data.'
+ properties:
+ description:
+ description: 'The description of the variable.
+
+
+ *New in version 2.4.0*
+
+ '
+ nullable: true
+ type: string
+ key:
+ type: string
+ type: object
+ VersionInfo:
+ description: Version information.
+ properties:
+ git_version:
+ description: The git version (including git commit hash)
+ nullable: true
+ type: string
+ version:
+ description: The version of Airflow
+ type: string
+ type: object
+ WeightRule:
+ description: Weight rule.
+ enum:
+ - downstream
+ - upstream
+ - absolute
+ type: string
+ XCom:
+ allOf:
+ - $ref: '#/components/schemas/XComCollectionItem'
+ - properties:
+ value:
+ description: The value
+ type: string
+ type: object
+ description: Full representations of XCom entry.
+ XComCollection:
+ allOf:
+ - properties:
+ xcom_entries:
+ items:
+ $ref: '#/components/schemas/XComCollectionItem'
+ type: array
+ type: object
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: 'Collection of XCom entries.
+
+
+ *Changed in version 2.1.0*: ''total_entries'' field is added.
+
+ '
+ type: object
+ XComCollectionItem:
+ description: 'XCom entry collection item.
+
+
+ The value field is only available when reading a single object due to the
+ size of the value.
+
+ '
+ properties:
+ dag_id:
+ type: string
+ execution_date:
+ format: datetime
+ type: string
+ key:
+ type: string
+ map_index:
+ type: integer
+ task_id:
+ type: string
+ timestamp:
+ format: datetime
+ type: string
+ type: object
+ securitySchemes:
+ Basic:
+ scheme: basic
+ type: http
+ GoogleOpenId:
+ openIdConnectUrl: https://accounts.google.com/.well-known/openid-configuration
+ type: openIdConnect
+ Kerberos:
+ scheme: negotiate
+ type: http
+externalDocs:
+ url: https://airflow.apache.org/docs/apache-airflow/stable/
+info:
+ contact:
+ email: dev@airflow.apache.org
+ name: Apache Software Foundation
+ url: https://airflow.apache.org
+ description: "# Overview\n\nTo facilitate management, Apache Airflow supports a\
+ \ range of REST API endpoints across its\nobjects.\nThis section provides an overview\
+ \ of the API design, methods, and supported use cases.\n\nMost of the endpoints\
+ \ accept `JSON` as input and return `JSON` responses.\nThis means that you must\
+ \ usually add the following headers to your request:\n```\nContent-type: application/json\n\
+ Accept: application/json\n```\n\n## Resources\n\nThe term `resource` refers to\
+ \ a single type of object in the Airflow metadata. An API is broken up by its\n\
+ endpoint's corresponding resource.\nThe name of a resource is typically plural\
+ \ and expressed in camelCase. Example: `dagRuns`.\n\nResource names are used as\
+ \ part of endpoint URLs, as well as in API parameters and responses.\n\n## CRUD\
+ \ Operations\n\nThe platform supports **C**reate, **R**ead, **U**pdate, and **D**elete\
+ \ operations on most resources.\nYou can review the standards for these operations\
+ \ and their standard parameters below.\n\nSome endpoints have special behavior\
+ \ as exceptions.\n\n### Create\n\nTo create a resource, you typically submit an\
+ \ HTTP `POST` request with the resource's required metadata\nin the request body.\n\
+ The response returns a `201 Created` response code upon success with the resource's\
+ \ metadata, including\nits internal `id`, in the response body.\n\n### Read\n\n\
+ The HTTP `GET` request can be used to read a resource or to list a number of resources.\n\
+ \nA resource's `id` can be submitted in the request parameters to read a specific\
+ \ resource.\nThe response usually returns a `200 OK` response code upon success,\
+ \ with the resource's metadata in\nthe response body.\n\nIf a `GET` request does\
+ \ not include a specific resource `id`, it is treated as a list request.\nThe\
+ \ response usually returns a `200 OK` response code upon success, with an object\
+ \ containing a list\nof resources' metadata in the response body.\n\nWhen reading\
+ \ resources, some common query parameters are usually available. e.g.:\n```\n\
+ v1/connections?limit=25&offset=25\n```\n\n|Query Parameter|Type|Description|\n\
+ |---------------|----|-----------|\n|limit|integer|Maximum number of objects to\
+ \ fetch. Usually 25 by default|\n|offset|integer|Offset after which to start returning\
+ \ objects. For use with limit query parameter.|\n\n### Update\n\nUpdating a resource\
+ \ requires the resource `id`, and is typically done using an HTTP `PATCH` request,\n\
+ with the fields to modify in the request body.\nThe response usually returns a\
+ \ `200 OK` response code upon success, with information about the modified\nresource\
+ \ in the response body.\n\n### Delete\n\nDeleting a resource requires the resource\
+ \ `id` and is typically executed via an HTTP `DELETE` request.\nThe response usually\
+ \ returns a `204 No Content` response code upon success.\n\n## Conventions\n\n\
+ - Resource names are plural and expressed in camelCase.\n- Names are consistent\
+ \ between URL parameter name and field name.\n\n- Field names are in snake_case.\n\
+ ```json\n{\n \"description\": \"string\",\n \"name\": \"string\",\n \"\
+ occupied_slots\": 0,\n \"open_slots\": 0\n \"queued_slots\": 0,\n \"\
+ running_slots\": 0,\n \"scheduled_slots\": 0,\n \"slots\": 0,\n}\n```\n\n\
+ ### Update Mask\n\nUpdate mask is available as a query parameter in patch endpoints.\
+ \ It is used to notify the\nAPI which fields you want to update. Using `update_mask`\
+ \ makes it easier to update objects\nby helping the server know which fields to\
+ \ update in an object instead of updating all fields.\nThe update request ignores\
+ \ any fields that aren't specified in the field mask, leaving them with\ntheir\
+ \ current values.\n\nExample:\n```\n resource = request.get('/resource/my-id').json()\n\
+ \ resource['my_field'] = 'new-value'\n request.patch('/resource/my-id?update_mask=my_field',\
+ \ data=json.dumps(resource))\n```\n\n## Versioning and Endpoint Lifecycle\n\n\
+ - API versioning is not synchronized to specific releases of the Apache Airflow.\n\
+ - APIs are designed to be backward compatible.\n- Any changes to the API will\
+ \ first go through a deprecation phase.\n\n# Trying the API\n\nYou can use a third\
+ \ party client, such as [curl](https://curl.haxx.se/), [HTTPie](https://httpie.org/),\n\
+ [Postman](https://www.postman.com/) or [the Insomnia rest client](https://insomnia.rest/)\
+ \ to test\nthe Apache Airflow API.\n\nNote that you will need to pass credentials\
+ \ data.\n\nFor e.g., here is how to pause a DAG with [curl](https://curl.haxx.se/),\
+ \ when basic authorization is used:\n```bash\ncurl -X PATCH 'https://example.com/api/v1/dags/{dag_id}?update_mask=is_paused'\
+ \ \\\n-H 'Content-Type: application/json' \\\n--user \"username:password\" \\\n\
+ -d '{\n \"is_paused\": true\n}'\n```\n\nUsing a graphical tool such as [Postman](https://www.postman.com/)\
+ \ or [Insomnia](https://insomnia.rest/),\nit is possible to import the API specifications\
+ \ directly:\n\n1. Download the API specification by clicking the **Download**\
+ \ button at the top of this document\n2. Import the JSON specification in the\
+ \ graphical tool of your choice.\n - In *Postman*, you can click the **import**\
+ \ button at the top\n - With *Insomnia*, you can just drag-and-drop the file\
+ \ on the UI\n\nNote that with *Postman*, you can also generate code snippets by\
+ \ selecting a request and clicking on\nthe **Code** button.\n\n## Enabling CORS\n\
+ \n[Cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)\n\
+ is a browser security feature that restricts HTTP requests that are\ninitiated\
+ \ from scripts running in the browser.\n\nFor details on enabling/configuring\
+ \ CORS, see\n[Enabling CORS](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).\n\
+ \n# Authentication\n\nTo be able to meet the requirements of many organizations,\
+ \ Airflow supports many authentication methods,\nand it is even possible to add\
+ \ your own method.\n\nIf you want to check which auth backend is currently set,\
+ \ you can use\n`airflow config get-value api auth_backends` command as in the\
+ \ example below.\n```bash\n$ airflow config get-value api auth_backends\nairflow.api.auth.backend.basic_auth\n\
+ ```\nThe default is to deny all requests.\n\nFor details on configuring the authentication,\
+ \ see\n[API Authorization](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).\n\
+ \n# Errors\n\nWe follow the error response format proposed in [RFC 7807](https://tools.ietf.org/html/rfc7807)\n\
+ also known as Problem Details for HTTP APIs. As with our normal API responses,\n\
+ your client must be prepared to gracefully handle additional members of the response.\n\
+ \n## Unauthenticated\n\nThis indicates that the request has not been applied because\
+ \ it lacks valid authentication\ncredentials for the target resource. Please check\
+ \ that you have valid credentials.\n\n## PermissionDenied\n\nThis response means\
+ \ that the server understood the request but refuses to authorize\nit because\
+ \ it lacks sufficient rights to the resource. It happens when you do not have\
+ \ the\nnecessary permission to execute the action you performed. You need to get\
+ \ the appropriate\npermissions in other to resolve this error.\n\n## BadRequest\n\
+ \nThis response means that the server cannot or will not process the request due\
+ \ to something\nthat is perceived to be a client error (e.g., malformed request\
+ \ syntax, invalid request message\nframing, or deceptive request routing). To\
+ \ resolve this, please ensure that your syntax is correct.\n\n## NotFound\n\n\
+ This client error response indicates that the server cannot find the requested\
+ \ resource.\n\n## MethodNotAllowed\n\nIndicates that the request method is known\
+ \ by the server but is not supported by the target resource.\n\n## NotAcceptable\n\
+ \nThe target resource does not have a current representation that would be acceptable\
+ \ to the user\nagent, according to the proactive negotiation header fields received\
+ \ in the request, and the\nserver is unwilling to supply a default representation.\n\
+ \n## AlreadyExists\n\nThe request could not be completed due to a conflict with\
+ \ the current state of the target\nresource, e.g. the resource it tries to create\
+ \ already exists.\n\n## Unknown\n\nThis means that the server encountered an unexpected\
+ \ condition that prevented it from\nfulfilling the request.\n"
+ license:
+ name: Apache 2.0
+ url: http://www.apache.org/licenses/LICENSE-2.0.html
+ title: Airflow API (Stable)
+ version: 2.9.0.dev0
+openapi: 3.0.3
+paths:
+ /config:
+ get:
+ operationId: get_config
+ parameters:
+ - description: If given, only return config of this section.
+ in: query
+ name: section
+ required: false
+ schema:
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ example:
+ sections:
+ - name: core
+ options:
+ - key: dags_folder
+ value: /home/user/my-dags-folder
+ - name: smtp
+ options:
+ - key: smtp_host
+ value: localhost
+ - key: smtp_mail_from
+ value: airflow@example.com
+ schema:
+ $ref: '#/components/schemas/Config'
+ text/plain:
+ example: '[core]
+
+ dags_folder = /home/user/my-dags-folder
+
+ [smtp]
+
+ smtp_host = localhost
+
+ smtp_mail_from = airflow@example.com
+
+ '
+ schema:
+ type: string
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get current configuration
+ tags:
+ - Config
+ x-openapi-router-controller: airflow.api_connexion.endpoints.config_endpoint
+ /config/section/{section}/option/{option}:
+ get:
+ operationId: get_value
+ parameters:
+ - in: path
+ name: section
+ required: true
+ schema:
+ type: string
+ - in: path
+ name: option
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ example:
+ sections:
+ - name: core
+ options:
+ - key: dags_folder
+ value: /home/user/my-dags-folder
+ schema:
+ $ref: '#/components/schemas/Config'
+ text/plain:
+ example: '[core]
+
+ dags_folder = /home/user/my-dags-folder
+
+ '
+ schema:
+ type: string
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a option from configuration
+ tags:
+ - Config
+ x-openapi-router-controller: airflow.api_connexion.endpoints.config_endpoint
+ /connections:
+ get:
+ operationId: get_connections
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConnectionCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List connections
+ tags:
+ - Connection
+ x-openapi-router-controller: airflow.api_connexion.endpoints.connection_endpoint
+ post:
+ operationId: post_connection
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Connection'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Connection'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: Create a connection
+ tags:
+ - Connection
+ x-openapi-router-controller: airflow.api_connexion.endpoints.connection_endpoint
+ /connections/test:
+ post:
+ description: 'Test a connection.
+
+
+ For security reasons, the test connection functionality is disabled by default
+ across Airflow UI, API and CLI.
+
+ For more information on capabilities of users, see the documentation:
+
+ https://airflow.apache.org/docs/apache-airflow/stable/security/security_model.html#capabilities-of-authenticated-ui-users.
+
+ It is strongly advised to not enable the feature until you make sure that
+ only
+
+ highly trusted UI/API users have "edit connection" permissions.
+
+
+ Set the "test_connection" flag to "Enabled" in the "core" section of Airflow
+ configuration (airflow.cfg) to enable testing of collections.
+
+ It can also be controlled by the environment variable `AIRFLOW__CORE__TEST_CONNECTION`.
+
+
+ *New in version 2.2.0*
+
+ '
+ operationId: test_connection
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Connection'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ConnectionTest'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Test a connection
+ tags:
+ - Connection
+ x-openapi-router-controller: airflow.api_connexion.endpoints.connection_endpoint
+ /connections/{connection_id}:
+ delete:
+ operationId: delete_connection
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Delete a connection
+ tags:
+ - Connection
+ x-openapi-router-controller: airflow.api_connexion.endpoints.connection_endpoint
+ get:
+ operationId: get_connection
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Connection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a connection
+ tags:
+ - Connection
+ x-openapi-router-controller: airflow.api_connexion.endpoints.connection_endpoint
+ parameters:
+ - $ref: '#/components/parameters/ConnectionID'
+ patch:
+ operationId: patch_connection
+ parameters:
+ - $ref: '#/components/parameters/UpdateMask'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Connection'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Connection'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update a connection
+ tags:
+ - Connection
+ x-openapi-router-controller: airflow.api_connexion.endpoints.connection_endpoint
+ /dagSources/{file_token}:
+ get:
+ description: 'Get a source code using file token.
+
+ '
+ operationId: get_dag_source
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ properties:
+ content:
+ type: string
+ type: object
+ plain/text:
+ schema:
+ type: string
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ '406':
+ $ref: '#/components/responses/NotAcceptable'
+ summary: Get a source code
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_source_endpoint
+ parameters:
+ - $ref: '#/components/parameters/FileToken'
+ /dagWarnings:
+ get:
+ operationId: get_dag_warnings
+ parameters:
+ - description: If set, only return DAG warnings with this dag_id.
+ in: query
+ name: dag_id
+ required: false
+ schema:
+ type: string
+ - description: If set, only return DAG warnings with this type.
+ in: query
+ name: warning_type
+ required: false
+ schema:
+ type: string
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DagWarningCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List dag warnings
+ tags:
+ - DagWarning
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_warning_endpoint
+ /dags:
+ get:
+ description: 'List DAGs in the database.
+
+ `dag_id_pattern` can be set to match dags of a specific pattern
+
+ '
+ operationId: get_dags
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ - $ref: '#/components/parameters/FilterTags'
+ - $ref: '#/components/parameters/OnlyActive'
+ - $ref: '#/components/parameters/Paused'
+ - description: 'If set, only return DAGs with dag_ids matching this pattern.
+
+ '
+ in: query
+ name: dag_id_pattern
+ required: false
+ schema:
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ summary: List DAGs
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_endpoint
+ patch:
+ description: 'Update DAGs of a given dag_id_pattern using UpdateMask.
+
+ This endpoint allows specifying `~` as the dag_id_pattern to update all DAGs.
+
+ *New in version 2.3.0*
+
+ '
+ operationId: patch_dags
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/FilterTags'
+ - $ref: '#/components/parameters/UpdateMask'
+ - $ref: '#/components/parameters/OnlyActive'
+ - description: 'If set, only update DAGs with dag_ids matching this pattern.
+
+ '
+ in: query
+ name: dag_id_pattern
+ required: true
+ schema:
+ type: string
+ requestBody:
+ content:
+ application/json:
+ example:
+ is_paused: true
+ schema:
+ $ref: '#/components/schemas/DAG'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update DAGs
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_endpoint
+ /dags/{dag_id}:
+ delete:
+ description: 'Deletes all metadata related to the DAG, including finished DAG
+ Runs and Tasks.
+
+ Logs are not deleted. This action cannot be undone.
+
+
+ *New in version 2.2.0*
+
+ '
+ operationId: delete_dag
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ '409':
+ $ref: '#/components/responses/AlreadyExists'
+ summary: Delete a DAG
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_endpoint
+ get:
+ description: 'Presents only information available in database (DAGModel).
+
+ If you need detailed information, consider using GET /dags/{dag_id}/details.
+
+ '
+ operationId: get_dag
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAG'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get basic information about a DAG
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ patch:
+ operationId: patch_dag
+ parameters:
+ - $ref: '#/components/parameters/UpdateMask'
+ requestBody:
+ content:
+ application/json:
+ example:
+ is_paused: true
+ schema:
+ $ref: '#/components/schemas/DAG'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAG'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update a DAG
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_endpoint
+ /dags/{dag_id}/clearTaskInstances:
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ post:
+ description: 'Clears a set of task instances associated with the DAG for a specified
+ date range.
+
+ '
+ operationId: post_clear_task_instances
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ClearTaskInstances'
+ description: Parameters of action
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceReferenceCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Clear a set of task instances
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /dags/{dag_id}/dagRuns:
+ get:
+ description: 'This endpoint allows specifying `~` as the dag_id to retrieve
+ DAG runs for all DAGs.
+
+ '
+ operationId: get_dag_runs
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/FilterExecutionDateGTE'
+ - $ref: '#/components/parameters/FilterExecutionDateLTE'
+ - $ref: '#/components/parameters/FilterStartDateGTE'
+ - $ref: '#/components/parameters/FilterStartDateLTE'
+ - $ref: '#/components/parameters/FilterEndDateGTE'
+ - $ref: '#/components/parameters/FilterEndDateLTE'
+ - $ref: '#/components/parameters/FilterUpdatedAtGTE'
+ - $ref: '#/components/parameters/FilterUpdatedAtLTE'
+ - $ref: '#/components/parameters/FilterState'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRunCollection'
+ description: List of DAG runs.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ summary: List DAG runs
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ post:
+ description: 'This will initiate a dagrun. If DAG is paused then dagrun state
+ will remain queued, and the task won''t run.
+
+ '
+ operationId: post_dag_run
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRun'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRun'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ '409':
+ $ref: '#/components/responses/AlreadyExists'
+ summary: Trigger a new DAG run.
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}:
+ delete:
+ operationId: delete_dag_run
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Delete a DAG run
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ get:
+ operationId: get_dag_run
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRun'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a DAG run
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ patch:
+ description: 'Modify a DAG run.
+
+
+ *New in version 2.2.0*
+
+ '
+ operationId: update_dag_run_state
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateDagRunState'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRun'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Modify a DAG run
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/clear:
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ post:
+ description: 'Clear a DAG run.
+
+
+ *New in version 2.4.0*
+
+ '
+ operationId: clear_dag_run
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ClearDagRun'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ anyOf:
+ - $ref: '#/components/schemas/DAGRun'
+ - $ref: '#/components/schemas/TaskInstanceCollection'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Clear a DAG run
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/setNote:
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ patch:
+ description: 'Update the manual user note of a DagRun.
+
+
+ *New in version 2.5.0*
+
+ '
+ operationId: set_dag_run_note
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SetDagRunNote'
+ description: Parameters of set DagRun note.
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRun'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update the DagRun note.
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances:
+ get:
+ description: 'This endpoint allows specifying `~` as the dag_id, dag_run_id
+ to retrieve DAG runs for all DAGs and DAG runs.
+
+ '
+ operationId: get_task_instances
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List task instances
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/FilterExecutionDateGTE'
+ - $ref: '#/components/parameters/FilterExecutionDateLTE'
+ - $ref: '#/components/parameters/FilterStartDateGTE'
+ - $ref: '#/components/parameters/FilterStartDateLTE'
+ - $ref: '#/components/parameters/FilterEndDateGTE'
+ - $ref: '#/components/parameters/FilterEndDateLTE'
+ - $ref: '#/components/parameters/FilterUpdatedAtGTE'
+ - $ref: '#/components/parameters/FilterUpdatedAtLTE'
+ - $ref: '#/components/parameters/FilterDurationGTE'
+ - $ref: '#/components/parameters/FilterDurationLTE'
+ - $ref: '#/components/parameters/FilterState'
+ - $ref: '#/components/parameters/FilterPool'
+ - $ref: '#/components/parameters/FilterQueue'
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}:
+ get:
+ operationId: get_task_instance
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstance'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a task instance
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ patch:
+ description: 'Updates the state for single task instance.
+
+ *New in version 2.5.0*
+
+ '
+ operationId: patch_task_instance
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateTaskInstance'
+ description: Parameters of action
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceReference'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Updates the state of a task instance
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links:
+ get:
+ description: 'List extra links for task instance.
+
+ '
+ operationId: get_extra_links
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ExtraLinkCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: List extra links
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.extra_link_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/listMapped:
+ get:
+ description: 'Get details of all mapped task instances.
+
+
+ *New in version 2.3.0*
+
+ '
+ operationId: get_mapped_task_instances
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/FilterExecutionDateGTE'
+ - $ref: '#/components/parameters/FilterExecutionDateLTE'
+ - $ref: '#/components/parameters/FilterStartDateGTE'
+ - $ref: '#/components/parameters/FilterStartDateLTE'
+ - $ref: '#/components/parameters/FilterEndDateGTE'
+ - $ref: '#/components/parameters/FilterEndDateLTE'
+ - $ref: '#/components/parameters/FilterUpdatedAtGTE'
+ - $ref: '#/components/parameters/FilterUpdatedAtLTE'
+ - $ref: '#/components/parameters/FilterDurationGTE'
+ - $ref: '#/components/parameters/FilterDurationLTE'
+ - $ref: '#/components/parameters/FilterState'
+ - $ref: '#/components/parameters/FilterPool'
+ - $ref: '#/components/parameters/FilterQueue'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: List mapped task instances
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{task_try_number}:
+ get:
+ description: "Get logs for a specific task instance and its try number.\nTo\
+ \ get log from specific character position, following way of using\nURLSafeSerializer\
+ \ can be used.\n\nExample:\n```\nfrom itsdangerous.url_safe import URLSafeSerializer\n\
+ \nrequest_url = f\"api/v1/dags/{DAG_ID}/dagRuns/{RUN_ID}/taskInstances/{TASK_ID}/logs/1\"\
+ \nkey = app.config[\"SECRET_KEY\"]\nserializer = URLSafeSerializer(key)\n\
+ token = serializer.dumps({\"log_pos\": 10000})\n\nresponse = self.client.get(\n\
+ \ request_url,\n query_string={\"token\": token},\n headers={\"Accept\"\
+ : \"text/plain\"},\n environ_overrides={\"REMOTE_USER\": \"test\"},\n)\n\
+ continuation_token = response.json[\"continuation_token\"]\n metadata =\
+ \ URLSafeSerializer(key).loads(continuation_token)\n log_pos = metadata[\"\
+ log_pos\"]\n end_of_log = metadata[\"end_of_log\"]\n```\nIf log_pos is\
+ \ passed as 10000 like the above example, it renders the logs starting\nfrom\
+ \ char position 10000 to last (not the end as the logs may be tailing behind\
+ \ in\nrunning state). This way pagination can be done with metadata as part\
+ \ of the token.\n"
+ operationId: get_log
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ properties:
+ content:
+ type: string
+ continuation_token:
+ type: string
+ type: object
+ text/plain:
+ schema:
+ type: string
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get logs
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.log_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ - $ref: '#/components/parameters/TaskTryNumber'
+ - $ref: '#/components/parameters/FullContent'
+ - $ref: '#/components/parameters/FilterMapIndex'
+ - $ref: '#/components/parameters/ContinuationToken'
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/setNote:
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ patch:
+ description: 'Update the manual user note of a non-mapped Task Instance.
+
+
+ *New in version 2.5.0*
+
+ '
+ operationId: set_task_instance_note
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SetTaskInstanceNote'
+ description: Parameters of set Task Instance note.
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstance'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update the TaskInstance note.
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries:
+ get:
+ description: This endpoint allows specifying `~` as the dag_id, dag_run_id,
+ task_id to retrieve XCOM entries for for all DAGs, DAG runs and task instances.
+ XCom values won't be returned as they can be large. Use this endpoint to get
+ a list of XCom entries and then fetch individual entry to get value.
+ operationId: get_xcom_entries
+ parameters:
+ - $ref: '#/components/parameters/FilterMapIndex'
+ - $ref: '#/components/parameters/FilterXcomKey'
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/XComCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List XCom entries
+ tags:
+ - XCom
+ x-openapi-router-controller: airflow.api_connexion.endpoints.xcom_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key}:
+ get:
+ operationId: get_xcom_entry
+ parameters:
+ - $ref: '#/components/parameters/FilterMapIndex'
+ - description: 'Whether to deserialize an XCom value when using a custom XCom
+ backend.
+
+
+ The XCom API endpoint calls `orm_deserialize_value` by default since an
+ XCom may contain value
+
+ that is potentially expensive to deserialize in the web server. Setting
+ this to true overrides
+
+ the consideration, and calls `deserialize_value` instead.
+
+
+ This parameter is not meaningful when using the default XCom backend.
+
+
+ *New in version 2.4.0*
+
+ '
+ in: query
+ name: deserialize
+ required: false
+ schema:
+ default: false
+ type: boolean
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/XCom'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get an XCom entry
+ tags:
+ - XCom
+ x-openapi-router-controller: airflow.api_connexion.endpoints.xcom_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ - $ref: '#/components/parameters/XComKey'
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}:
+ get:
+ description: 'Get details of a mapped task instance.
+
+
+ *New in version 2.3.0*
+
+ '
+ operationId: get_mapped_task_instance
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstance'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a mapped task instance
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ - $ref: '#/components/parameters/MapIndex'
+ patch:
+ description: 'Updates the state for single mapped task instance.
+
+ *New in version 2.5.0*
+
+ '
+ operationId: patch_mapped_task_instance
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateTaskInstance'
+ description: Parameters of action
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceReference'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Updates the state of a mapped task instance
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/setNote:
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ - $ref: '#/components/parameters/TaskID'
+ - $ref: '#/components/parameters/MapIndex'
+ patch:
+ description: 'Update the manual user note of a mapped Task Instance.
+
+
+ *New in version 2.5.0*
+
+ '
+ operationId: set_mapped_task_instance_note
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/SetTaskInstanceNote'
+ description: Parameters of set Task Instance note.
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstance'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update the TaskInstance note.
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /dags/{dag_id}/dagRuns/{dag_run_id}/upstreamDatasetEvents:
+ get:
+ description: 'Get datasets for a dag run.
+
+
+ *New in version 2.4.0*
+
+ '
+ operationId: get_upstream_dataset_events
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DatasetEventCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get dataset events for a DAG run
+ tags:
+ - DAGRun
+ - Dataset
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/DAGRunID'
+ /dags/{dag_id}/details:
+ get:
+ description: 'The response contains many DAG attributes, so the response can
+ be large. If possible, consider using GET /dags/{dag_id}.
+
+ '
+ operationId: get_dag_details
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGDetail'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a simplified representation of DAG
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ /dags/{dag_id}/tasks:
+ get:
+ operationId: get_tasks
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get tasks for DAG
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/OrderBy'
+ /dags/{dag_id}/tasks/{task_id}:
+ get:
+ operationId: get_task
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Task'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get simplified representation of a task
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ - $ref: '#/components/parameters/TaskID'
+ /dags/{dag_id}/updateTaskInstancesState:
+ parameters:
+ - $ref: '#/components/parameters/DAGID'
+ post:
+ description: 'Updates the state for multiple task instances simultaneously.
+
+ '
+ operationId: post_set_task_instances_state
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateTaskInstancesState'
+ description: Parameters of action
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceReferenceCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Set a state of task instances
+ tags:
+ - DAG
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /dags/~/dagRuns/list:
+ post:
+ description: 'This endpoint is a POST to allow filtering across a large number
+ of DAG IDs, where as a GET it would run in to maximum HTTP request URL length
+ limit.
+
+ '
+ operationId: get_dag_runs_batch
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ListDagRunsForm'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DAGRunCollection'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List DAG runs (batch)
+ tags:
+ - DAGRun
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dag_run_endpoint
+ /dags/~/dagRuns/~/taskInstances/list:
+ post:
+ description: 'List task instances from all DAGs and DAG runs.
+
+ This endpoint is a POST to allow filtering across a large number of DAG IDs,
+ where as a GET it would run in to maximum HTTP request URL length limits.
+
+ '
+ operationId: get_task_instances_batch
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ListTaskInstanceForm'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskInstanceCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: List task instances (batch)
+ tags:
+ - TaskInstance
+ x-openapi-router-controller: airflow.api_connexion.endpoints.task_instance_endpoint
+ /datasets:
+ get:
+ operationId: get_datasets
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ - description: 'If set, only return datasets with uris matching this pattern.
+
+ '
+ in: query
+ name: uri_pattern
+ required: false
+ schema:
+ type: string
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DatasetCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List datasets
+ tags:
+ - Dataset
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dataset_endpoint
+ /datasets/events:
+ get:
+ description: Get dataset events
+ operationId: get_dataset_events
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DatasetEventCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get dataset events
+ tags:
+ - Dataset
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dataset_endpoint
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ - $ref: '#/components/parameters/FilterDatasetID'
+ - $ref: '#/components/parameters/FilterSourceDAGID'
+ - $ref: '#/components/parameters/FilterSourceTaskID'
+ - $ref: '#/components/parameters/FilterSourceRunID'
+ - $ref: '#/components/parameters/FilterSourceMapIndex'
+ /datasets/{uri}:
+ get:
+ description: Get a dataset by uri.
+ operationId: get_dataset
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Dataset'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a dataset
+ tags:
+ - Dataset
+ x-openapi-router-controller: airflow.api_connexion.endpoints.dataset_endpoint
+ parameters:
+ - $ref: '#/components/parameters/DatasetURI'
+ /eventLogs:
+ get:
+ description: List log entries from event log.
+ operationId: get_event_logs
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ - $ref: '#/components/parameters/FilterDAGID'
+ - $ref: '#/components/parameters/FilterTaskID'
+ - $ref: '#/components/parameters/Event'
+ - $ref: '#/components/parameters/Owner'
+ - $ref: '#/components/parameters/Before'
+ - $ref: '#/components/parameters/After'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EventLogCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List log entries
+ tags:
+ - EventLog
+ x-openapi-router-controller: airflow.api_connexion.endpoints.event_log_endpoint
+ /eventLogs/{event_log_id}:
+ get:
+ operationId: get_event_log
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/EventLog'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a log entry
+ tags:
+ - EventLog
+ x-openapi-router-controller: airflow.api_connexion.endpoints.event_log_endpoint
+ parameters:
+ - $ref: '#/components/parameters/EventLogID'
+ /health:
+ get:
+ description: 'Get the status of Airflow''s metadatabase, triggerer and scheduler.
+ It includes info about
+
+ metadatabase and last heartbeat of scheduler and triggerer.
+
+ '
+ operationId: get_health
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HealthInfo'
+ description: Success.
+ summary: Get instance status
+ tags:
+ - Monitoring
+ x-openapi-router-controller: airflow.api_connexion.endpoints.health_endpoint
+ /importErrors:
+ get:
+ operationId: get_import_errors
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ImportErrorCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List import errors
+ tags:
+ - ImportError
+ x-openapi-router-controller: airflow.api_connexion.endpoints.import_error_endpoint
+ /importErrors/{import_error_id}:
+ get:
+ operationId: get_import_error
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ImportError'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get an import error
+ tags:
+ - ImportError
+ x-openapi-router-controller: airflow.api_connexion.endpoints.import_error_endpoint
+ parameters:
+ - $ref: '#/components/parameters/ImportErrorID'
+ /permissions:
+ get:
+ deprecated: true
+ description: 'Get a list of permissions.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: get_permissions
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ActionCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List permissions
+ tags:
+ - Permission
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ /plugins:
+ get:
+ description: 'Get a list of loaded plugins.
+
+
+ *New in version 2.1.0*
+
+ '
+ operationId: get_plugins
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PluginCollection'
+ description: Success
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a list of loaded plugins
+ tags:
+ - Plugin
+ x-openapi-router-controller: airflow.api_connexion.endpoints.plugin_endpoint
+ /pools:
+ get:
+ operationId: get_pools
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PoolCollection'
+ description: List of pools.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List pools
+ tags:
+ - Pool
+ x-openapi-router-controller: airflow.api_connexion.endpoints.pool_endpoint
+ post:
+ operationId: post_pool
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pool'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pool'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: Create a pool
+ tags:
+ - Pool
+ x-openapi-router-controller: airflow.api_connexion.endpoints.pool_endpoint
+ /pools/{pool_name}:
+ delete:
+ operationId: delete_pool
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Delete a pool
+ tags:
+ - Pool
+ x-openapi-router-controller: airflow.api_connexion.endpoints.pool_endpoint
+ get:
+ operationId: get_pool
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pool'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a pool
+ tags:
+ - Pool
+ x-openapi-router-controller: airflow.api_connexion.endpoints.pool_endpoint
+ parameters:
+ - $ref: '#/components/parameters/PoolName'
+ patch:
+ operationId: patch_pool
+ parameters:
+ - $ref: '#/components/parameters/UpdateMask'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pool'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pool'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ '409':
+ $ref: '#/components/responses/AlreadyExists'
+ summary: Update a pool
+ tags:
+ - Pool
+ x-openapi-router-controller: airflow.api_connexion.endpoints.pool_endpoint
+ /providers:
+ get:
+ description: 'Get a list of providers.
+
+
+ *New in version 2.1.0*
+
+ '
+ operationId: get_providers
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ allOf:
+ - $ref: '#/components/schemas/ProviderCollection'
+ - $ref: '#/components/schemas/CollectionInfo'
+ description: List of providers.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List providers
+ tags:
+ - Provider
+ x-openapi-router-controller: airflow.api_connexion.endpoints.provider_endpoint
+ /roles:
+ get:
+ deprecated: true
+ description: 'Get a list of roles.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: get_roles
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/RoleCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List roles
+ tags:
+ - Role
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ post:
+ deprecated: true
+ description: 'Create a new role.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: post_role
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Role'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Role'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: Create a role
+ tags:
+ - Role
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ /roles/{role_name}:
+ delete:
+ deprecated: true
+ description: 'Delete a role.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: delete_role
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Delete a role
+ tags:
+ - Role
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ get:
+ deprecated: true
+ description: 'Get a role.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: get_role
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Role'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a role
+ tags:
+ - Role
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ parameters:
+ - $ref: '#/components/parameters/RoleName'
+ patch:
+ deprecated: true
+ description: 'Update a role.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: patch_role
+ parameters:
+ - $ref: '#/components/parameters/UpdateMask'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Role'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Role'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update a role
+ tags:
+ - Role
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ /users:
+ get:
+ deprecated: true
+ description: 'Get a list of users.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: get_users
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List users
+ tags:
+ - User
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ post:
+ deprecated: true
+ description: 'Create a new user with unique username and email.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: post_user
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '409':
+ $ref: '#/components/responses/AlreadyExists'
+ summary: Create a user
+ tags:
+ - User
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ /users/{username}:
+ delete:
+ deprecated: true
+ description: 'Delete a user with a specific username.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: delete_user
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Delete a user
+ tags:
+ - User
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ get:
+ deprecated: true
+ description: 'Get a user with a specific username.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: get_user
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserCollectionItem'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a user
+ tags:
+ - User
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ parameters:
+ - $ref: '#/components/parameters/Username'
+ patch:
+ deprecated: true
+ description: 'Update fields for a user.
+
+
+ *This API endpoint is deprecated, please use the endpoint `/auth/fab/v1` for
+ this operation instead.*
+
+ '
+ operationId: patch_user
+ parameters:
+ - $ref: '#/components/parameters/UpdateMask'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UserCollectionItem'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update a user
+ tags:
+ - User
+ x-openapi-router-controller: airflow.api_connexion.endpoints.forward_to_fab_endpoint
+ /variables:
+ get:
+ description: The collection does not contain data. To get data, you must get
+ a single entity.
+ operationId: get_variables
+ parameters:
+ - $ref: '#/components/parameters/PageLimit'
+ - $ref: '#/components/parameters/PageOffset'
+ - $ref: '#/components/parameters/OrderBy'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VariableCollection'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: List variables
+ tags:
+ - Variable
+ x-openapi-router-controller: airflow.api_connexion.endpoints.variable_endpoint
+ post:
+ operationId: post_variables
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Variable'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Variable'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ summary: Create a variable
+ tags:
+ - Variable
+ x-openapi-router-controller: airflow.api_connexion.endpoints.variable_endpoint
+ /variables/{variable_key}:
+ delete:
+ operationId: delete_variable
+ responses:
+ '204':
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Delete a variable
+ tags:
+ - Variable
+ x-openapi-router-controller: airflow.api_connexion.endpoints.variable_endpoint
+ get:
+ description: Get a variable by key.
+ operationId: get_variable
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Variable'
+ description: Success.
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Get a variable
+ tags:
+ - Variable
+ x-openapi-router-controller: airflow.api_connexion.endpoints.variable_endpoint
+ parameters:
+ - $ref: '#/components/parameters/VariableKey'
+ patch:
+ description: Update a variable by key.
+ operationId: patch_variable
+ parameters:
+ - $ref: '#/components/parameters/UpdateMask'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Variable'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Variable'
+ description: Success.
+ '400':
+ $ref: '#/components/responses/BadRequest'
+ '401':
+ $ref: '#/components/responses/Unauthenticated'
+ '403':
+ $ref: '#/components/responses/PermissionDenied'
+ '404':
+ $ref: '#/components/responses/NotFound'
+ summary: Update a variable
+ tags:
+ - Variable
+ x-openapi-router-controller: airflow.api_connexion.endpoints.variable_endpoint
+ /version:
+ get:
+ operationId: get_version
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/VersionInfo'
+ description: Success.
+ summary: Get version information
+ tags:
+ - Monitoring
+ x-openapi-router-controller: airflow.api_connexion.endpoints.version_endpoint
+security:
+- Basic: []
+- GoogleOpenID: []
+- Kerberos: []
+servers:
+- description: Apache Airflow Stable API.
+ url: /api/v1
+tags:
+- name: Config
+- name: Connection
+- name: DAG
+- name: DAGRun
+- name: EventLog
+- name: ImportError
+- name: Monitoring
+- name: Pool
+- name: Provider
+- name: TaskInstance
+- name: Variable
+- name: XCom
+- name: Plugin
+- name: Role
+- name: Permission
+- name: User
+- name: DagWarning
+- name: Dataset
diff --git a/test-requirements.txt b/test-requirements.txt
deleted file mode 100644
index 2ccbc58..0000000
--- a/test-requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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.
-
-pytest-cov>=2.8.1
-python_dateutil >= 2.5.3
-urllib3 >= 1.25.3
diff --git a/dev/test_python_client.py b/test_python_client.py
similarity index 71%
rename from dev/test_python_client.py
rename to test_python_client.py
index 9dd10c2..ea0f42d 100644
--- a/dev/test_python_client.py
+++ b/test_python_client.py
@@ -14,9 +14,22 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
+#
+# PEP 723 compliant inline script metadata (not yet widely supported)
+# /// script
+# requires-python = ">=3.8"
+# dependencies = [
+# "apache-airflow-client",
+# "rich",
+# ]
+# ///
+
+from __future__ import annotations
+
import uuid
import airflow_client.client
+
try:
# If you have rich installed, you will have nice colored output of the API responses
from rich import print
@@ -42,9 +55,7 @@
# Configure HTTP basic authorization: Basic
configuration = airflow_client.client.Configuration(
- host="http://localhost:8080/api/v1",
- username='admin',
- password='admin'
+ host="http://localhost:8080/api/v1", username="admin", password="admin"
)
# Make sure in the [core] section, the `load_examples` config is set to True in your airflow.cfg
@@ -53,47 +64,44 @@
# Enter a context with an instance of the API client
with airflow_client.client.ApiClient(configuration) as api_client:
-
errors = False
- print('[blue]Getting DAG list')
+ print("[blue]Getting DAG list")
dag_api_instance = dag_api.DAGApi(api_client)
try:
api_response = dag_api_instance.get_dags()
print(api_response)
except airflow_client.client.OpenApiException as e:
- print("[red]Exception when calling DagAPI->get_dags: %s\n" % e)
+ print(f"[red]Exception when calling DagAPI->get_dags: {e}\n")
errors = True
else:
- print('[green]Getting DAG list successful')
+ print("[green]Getting DAG list successful")
-
- print('[blue]Getting Tasks for a DAG')
+ print("[blue]Getting Tasks for a DAG")
try:
api_response = dag_api_instance.get_tasks(DAG_ID)
print(api_response)
except airflow_client.client.exceptions.OpenApiException as e:
- print("[red]Exception when calling DagAPI->get_tasks: %s\n" % e)
+ print(f"[red]Exception when calling DagAPI->get_tasks: {e}\n")
errors = True
else:
- print('[green]Getting Tasks successful')
+ print("[green]Getting Tasks successful")
-
- print('[blue]Triggering a DAG run')
+ print("[blue]Triggering a DAG run")
dag_run_api_instance = dag_run_api.DAGRunApi(api_client)
try:
# Create a DAGRun object (no dag_id should be specified because it is read-only property of DAGRun)
# dag_run id is generated randomly to allow multiple executions of the script
dag_run = DAGRun(
- dag_run_id='some_test_run_' + uuid.uuid4().hex,
+ dag_run_id="some_test_run_" + uuid.uuid4().hex,
)
api_response = dag_run_api_instance.post_dag_run(DAG_ID, dag_run)
print(api_response)
except airflow_client.client.exceptions.OpenApiException as e:
- print("[red]Exception when calling DAGRunAPI->post_dag_run: %s\n" % e)
+ print(f"[red]Exception when calling DAGRunAPI->post_dag_run: {e}\n")
errors = True
else:
- print('[green]Posting DAG Run successful')
+ print("[green]Posting DAG Run successful")
# Get current configuration. Note, this is disabled by default with most installation.
# You need to set `expose_config = True` in Airflow configuration in order to retrieve configuration.
@@ -102,12 +110,19 @@
api_response = conf_api_instance.get_config()
print(api_response)
except airflow_client.client.OpenApiException as e:
- print("[red]Exception when calling ConfigApi->get_config: %s\n" % e)
- errors = True
+ if "FORBIDDEN" in str(e):
+ print(
+ "[yellow]You need to set `expose_config = True` in Airflow configuration"
+ " in order to retrieve configuration."
+ )
+ print("[bright_blue]This is OK. Exposing config is disabled by default.")
+ else:
+ print(f"[red]Exception when calling DAGRunAPI->post_dag_run: {e}\n")
+ errors = True
else:
- print('[green]Config retrieved successfully')
+ print("[green]Config retrieved successfully")
if errors:
- print ('\n[red]There were errors while running the script - see above for details')
+ print("\n[red]There were errors while running the script - see above for details")
else:
- print ('\n[green]Everything went well')
+ print("\n[green]Everything went well")
diff --git a/version.txt b/version.txt
new file mode 100644
index 0000000..834f262
--- /dev/null
+++ b/version.txt
@@ -0,0 +1 @@
+2.8.0