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