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*&#58; 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*&#58; ''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*&#58; 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*&#58; ''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*&#58; 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*&#58; Field becomes nullable.
+
+
+            *Deprecated since version 2.2.0*&#58; 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*&#58; 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*&#58; ''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*&#58; ''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*&#58; ''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*&#58; ''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*&#58; ''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*&#58; 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*&#58; 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*&#58; ''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*&#58; ''removed'' is added as a possible value.
+
+
+        *Changed in version 2.2.0*&#58; ''deferred'' is added as a possible value.
+
+
+        *Changed in version 2.4.0*&#58; ''sensing'' state has been removed.
+
+        *Changed in version 2.4.2*&#58; ''restarting'' is added as a possible value
+
+
+        *Changed in version 2.7.0*&#58; Field becomes nullable and null primitive
+        is added as a possible value.
+
+        *Changed in version 2.7.0*&#58; ''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*&#58; ''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*&#58; ''all_skipped'' is added as a possible value.
+
+
+        *Changed in version 2.5.0*&#58; ''one_done'' is added as a possible value.
+
+
+        *Changed in version 2.7.0*&#58; ''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*&#58; 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*&#58; 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*&#58; 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*&#58; 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*&#58; 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*&#58; ''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*&#58; ''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