| <!-- | |
| 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. | |
| --> | |
| # 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.9.0 | |
| - Package version: 2.9.0 | |
| - Build package: org.openapitools.codegen.languages.PythonClientCodegen | |
| For more information, please visit [https://airflow.apache.org](https://airflow.apache.org) | |
| ## Requirements. | |
| Python >=3.8 | |
| ## Installation & Usage | |
| ### pip install | |
| 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: | |
| ```bash | |
| pip install apache-airflow-client | |
| ``` | |
| 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 | |
| ``` | |
| ## Getting Started | |
| Please follow the [installation procedure](#installation--usage) and then run the following: | |
| ```python | |
| import time | |
| import airflow_client.client | |
| 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 | |
| # 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. | |
| # 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" | |
| ) | |
| ``` | |
| * Run scheduler (or dag file processor you have setup with standalone dag file processor) for few parsing | |
| loops (you can pass --num-runs parameter to it or keep it running in the background). The script relies | |
| on example DAGs being serialized to the DB and this only | |
| happens when scheduler runs with ``core/load_examples`` set to True. | |
| * Run webserver - reachable at the host/port for the test script you want to run. Make sure it had enough | |
| time to initialize. | |
| 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 |