This is an automated email from the ASF dual-hosted git repository.
Lee-W pushed a commit to branch airflow-ctl/v0-1-stable
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/airflow-ctl/v0-1-stable by
this push:
new 93fc24af68c Run CI on airflow-ctl release-branch pull requests and
pushes (#70726)
93fc24af68c is described below
commit 93fc24af68ccb49a51a1b110dc94220941264eb1
Author: Wei Lee <[email protected]>
AuthorDate: Wed Aug 5 17:39:44 2026 +0800
Run CI on airflow-ctl release-branch pull requests and pushes (#70726)
---
.github/workflows/ci-amd-arm.yml | 12 +-
.github/workflows/ci-image-checks.yml | 8 +-
.github/workflows/ci-notification.yml | 6 +-
.github/workflows/codeql-analysis.yml | 14 +-
.github/workflows/e2e-flaky-tests-report.yml | 2 +-
.github/workflows/publish-docs-to-s3.yml | 2 +-
.github/workflows/registry-backfill.yml | 6 +-
.github/workflows/registry-build.yml | 2 +-
.github/workflows/registry-tests.yml | 2 +-
.../scheduled-verify-release-calendar.yml | 2 +-
.../update-constraints-on-push-stable.yml | 2 +-
.github/workflows/upgrade-check.yml | 4 +-
airflow-core/pyproject.toml | 6 +-
airflow-ctl/.pre-commit-config.yaml | 2 +-
.../src/airflowctl/api/datamodels/generated.py | 272 ++-------------------
uv.lock | 18 +-
16 files changed, 80 insertions(+), 280 deletions(-)
diff --git a/.github/workflows/ci-amd-arm.yml b/.github/workflows/ci-amd-arm.yml
index da98b28b4d0..5d193b173f6 100644
--- a/.github/workflows/ci-amd-arm.yml
+++ b/.github/workflows/ci-amd-arm.yml
@@ -24,12 +24,18 @@ on: # yamllint disable-line rule:truthy
branches:
- v[0-9]+-[0-9]+-test
- providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
+ - chart/v[0-9]+-[0-9]+x-test
+ - airflow-ctl/v[0-9]+-[0-9]+-test
pull_request:
branches:
- main
- v[0-9]+-[0-9]+-test
- v[0-9]+-[0-9]+-stable
- providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
+ - chart/v[0-9]+-[0-9]+x-test
+ - chart/v[0-9]+-[0-9]+x-stable
+ - airflow-ctl/v[0-9]+-[0-9]+-test
+ - airflow-ctl/v[0-9]+-[0-9]+-stable
types: [opened, reopened, synchronize, ready_for_review]
workflow_dispatch:
permissions:
@@ -1005,7 +1011,7 @@ jobs:
overwrite: true
- name: "Notify Slack (new/changed failures)"
if: steps.notification.outputs.action == 'notify_new'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -1021,7 +1027,7 @@ jobs:
# yamllint enable rule:line-length
- name: "Notify Slack (still not fixed)"
if: steps.notification.outputs.action == 'notify_reminder'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -1037,7 +1043,7 @@ jobs:
# yamllint enable rule:line-length
- name: "Notify Slack (all tests passing)"
if: steps.notification.outputs.action == 'notify_recovery'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
diff --git a/.github/workflows/ci-image-checks.yml
b/.github/workflows/ci-image-checks.yml
index 6b30ceec54e..9d45b106b62 100644
--- a/.github/workflows/ci-image-checks.yml
+++ b/.github/workflows/ci-image-checks.yml
@@ -264,7 +264,7 @@ jobs:
inputs.canary-run == 'true' &&
matrix.flag == '--docs-only' &&
steps.inventory-notification.outputs.action == 'notify_new'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -280,7 +280,7 @@ jobs:
inputs.canary-run == 'true' &&
matrix.flag == '--docs-only' &&
steps.inventory-notification.outputs.action == 'notify_reminder'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -296,7 +296,7 @@ jobs:
inputs.canary-run == 'true' &&
matrix.flag == '--docs-only' &&
steps.inventory-notification.outputs.action == 'notify_recovery'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -439,7 +439,7 @@ jobs:
inputs.canary-run == 'true' &&
(github.event_name == 'schedule' || github.event_name ==
'workflow_dispatch')
- name: Configure AWS credentials
- uses:
aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37
# v6.1.0
+ uses:
aws-actions/configure-aws-credentials@254c19bd240aabef8777f48595e9d2d7b972184b
# v6.2.1
with:
aws-access-key-id: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }}
diff --git a/.github/workflows/ci-notification.yml
b/.github/workflows/ci-notification.yml
index 31b390e2d0f..1ad449859ad 100644
--- a/.github/workflows/ci-notification.yml
+++ b/.github/workflows/ci-notification.yml
@@ -77,7 +77,7 @@ jobs:
- name: "Send Slack notification (new/changed failures)"
if: steps.notification.outputs.action == 'notify_new'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -98,7 +98,7 @@ jobs:
- name: "Send Slack notification (still not fixed)"
if: steps.notification.outputs.action == 'notify_reminder'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -119,7 +119,7 @@ jobs:
- name: "Send Slack notification (all passing)"
if: steps.notification.outputs.action == 'notify_recovery'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
diff --git a/.github/workflows/codeql-analysis.yml
b/.github/workflows/codeql-analysis.yml
index a6ae94fd3fa..9ed0c7fa890 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -20,9 +20,19 @@ name: "CodeQL"
on: # yamllint disable-line rule:truthy
pull_request:
- branches: ['main', 'v[0-9]+-[0-9]+-test', 'v[0-9]+-[0-9]+-stable']
+ branches:
+ - main
+ - v[0-9]+-[0-9]+-test
+ - v[0-9]+-[0-9]+-stable
+ - chart/v[0-9]+-[0-9]+x-test
+ - chart/v[0-9]+-[0-9]+x-stable
+ - airflow-ctl/v[0-9]+-[0-9]+-test
+ - airflow-ctl/v[0-9]+-[0-9]+-stable
push:
- branches: [main]
+ branches:
+ - main
+ - chart/v[0-9]+-[0-9]+x-test
+ - airflow-ctl/v[0-9]+-[0-9]+-test
schedule:
- cron: '0 2 * * *'
diff --git a/.github/workflows/e2e-flaky-tests-report.yml
b/.github/workflows/e2e-flaky-tests-report.yml
index be10b33b1c6..f8478df766d 100644
--- a/.github/workflows/e2e-flaky-tests-report.yml
+++ b/.github/workflows/e2e-flaky-tests-report.yml
@@ -52,7 +52,7 @@ jobs:
- name: "Post report to Slack"
if: always() && steps.analyze.outcome == 'success'
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
diff --git a/.github/workflows/publish-docs-to-s3.yml
b/.github/workflows/publish-docs-to-s3.yml
index 4e0ce4d260d..80788ea05d8 100644
--- a/.github/workflows/publish-docs-to-s3.yml
+++ b/.github/workflows/publish-docs-to-s3.yml
@@ -409,7 +409,7 @@ jobs:
sudo /tmp/aws/install --update
rm -rf /tmp/aws/
- name: Configure AWS credentials
- uses:
aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37
# v6.1.0
+ uses:
aws-actions/configure-aws-credentials@254c19bd240aabef8777f48595e9d2d7b972184b
# v6.2.1
with:
aws-access-key-id: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }}
diff --git a/.github/workflows/registry-backfill.yml
b/.github/workflows/registry-backfill.yml
index 2e1d089e967..5b7ed420266 100644
--- a/.github/workflows/registry-backfill.yml
+++ b/.github/workflows/registry-backfill.yml
@@ -118,7 +118,7 @@ jobs:
done
- name: "Install uv"
- uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 #
v8.0.0
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 #
v8.2.0
- name: "Install Breeze"
uses: ./.github/actions/breeze
@@ -136,7 +136,7 @@ jobs:
rm -rf /tmp/aws/
- name: "Configure AWS credentials"
- uses:
aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37
# v6.1.0
+ uses:
aws-actions/configure-aws-credentials@254c19bd240aabef8777f48595e9d2d7b972184b
# v6.2.1
with:
aws-access-key-id: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }}
@@ -252,7 +252,7 @@ jobs:
rm -rf /tmp/aws/
- name: "Configure AWS credentials"
- uses:
aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37
# v6.1.0
+ uses:
aws-actions/configure-aws-credentials@254c19bd240aabef8777f48595e9d2d7b972184b
# v6.2.1
with:
aws-access-key-id: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }}
diff --git a/.github/workflows/registry-build.yml
b/.github/workflows/registry-build.yml
index fe4655cf30f..9a76fa43232 100644
--- a/.github/workflows/registry-build.yml
+++ b/.github/workflows/registry-build.yml
@@ -133,7 +133,7 @@ jobs:
rm -rf /tmp/aws/
- name: "Configure AWS credentials"
- uses:
aws-actions/configure-aws-credentials@ec61189d14ec14c8efccab744f656cffd0e33f37
# v6.1.0
+ uses:
aws-actions/configure-aws-credentials@254c19bd240aabef8777f48595e9d2d7b972184b
# v6.2.1
with:
aws-access-key-id: ${{ secrets.DOCS_AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.DOCS_AWS_SECRET_ACCESS_KEY }}
diff --git a/.github/workflows/registry-tests.yml
b/.github/workflows/registry-tests.yml
index 2c38e724b86..20c15fd8eee 100644
--- a/.github/workflows/registry-tests.yml
+++ b/.github/workflows/registry-tests.yml
@@ -50,7 +50,7 @@ jobs:
persist-credentials: false
- name: "Install uv"
- uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 #
v8.0.0
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 #
v8.2.0
with:
python-version: "3.12"
diff --git a/.github/workflows/scheduled-verify-release-calendar.yml
b/.github/workflows/scheduled-verify-release-calendar.yml
index 199ccfb72c1..22ae46109de 100644
--- a/.github/workflows/scheduled-verify-release-calendar.yml
+++ b/.github/workflows/scheduled-verify-release-calendar.yml
@@ -50,7 +50,7 @@ jobs:
# yamllint disable rule:line-length
- name: "Notify Slack on failure"
if: failure()
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c
with:
method: chat.postMessage
token: ${{ secrets.SLACK_BOT_TOKEN }}
diff --git a/.github/workflows/update-constraints-on-push-stable.yml
b/.github/workflows/update-constraints-on-push-stable.yml
index fcacc09a6bb..72f5d525892 100644
--- a/.github/workflows/update-constraints-on-push-stable.yml
+++ b/.github/workflows/update-constraints-on-push-stable.yml
@@ -156,7 +156,7 @@ jobs:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
steps:
- name: "Send Slack notification"
- uses:
slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
+ uses:
slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c # v3.0.3
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
diff --git a/.github/workflows/upgrade-check.yml
b/.github/workflows/upgrade-check.yml
index d4f23d57822..562b9b13e1c 100644
--- a/.github/workflows/upgrade-check.yml
+++ b/.github/workflows/upgrade-check.yml
@@ -103,7 +103,7 @@ jobs:
[${{ inputs.target-branch }}] Notify Slack on success
if: success() && steps.find-pr.outputs.pr-url != ''
uses: >-
- slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95
+ slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
@@ -132,7 +132,7 @@ jobs:
[${{ inputs.target-branch }}] Notify Slack on failure
if: failure()
uses: >-
- slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95
+ slackapi/slack-github-action@45a88b9581bfab2566dc881e2cd66d334e621e2c
with:
method: chat.postMessage
token: ${{ env.SLACK_BOT_TOKEN }}
diff --git a/airflow-core/pyproject.toml b/airflow-core/pyproject.toml
index 783ac958fa5..88f85d2895d 100644
--- a/airflow-core/pyproject.toml
+++ b/airflow-core/pyproject.toml
@@ -64,7 +64,7 @@ classifiers = [
]
# Version is defined in src/airflow/__init__.py and it is automatically
synchronized by prek hook
-version = "3.3.0"
+version = "3.2.1"
dependencies = [
"a2wsgi>=1.10.8",
@@ -149,7 +149,7 @@ dependencies = [
"typing-extensions>=4.14.1",
"universal-pathlib>=0.3.8",
"uuid6>=2024.7.10",
- "apache-airflow-task-sdk<1.4.0,>=1.3.0",
+ "apache-airflow-task-sdk==1.2.1",
"apache-airflow-ctl<0.1.6,>=0.1.5",
# pre-installed providers
"apache-airflow-providers-common-compat>=1.7.4",
@@ -248,7 +248,6 @@ exclude = [
"../shared/secrets_backend/src/airflow_shared/secrets_backend" =
"src/airflow/_shared/secrets_backend"
"../shared/secrets_masker/src/airflow_shared/secrets_masker" =
"src/airflow/_shared/secrets_masker"
"../shared/serialization/src/airflow_shared/serialization" =
"src/airflow/_shared/serialization"
-"../shared/state/src/airflow_shared/state" = "src/airflow/_shared/state"
"../shared/timezones/src/airflow_shared/timezones" =
"src/airflow/_shared/timezones"
"../shared/listeners/src/airflow_shared/listeners" =
"src/airflow/_shared/listeners"
"../shared/plugins_manager/src/airflow_shared/plugins_manager" =
"src/airflow/_shared/plugins_manager"
@@ -337,7 +336,6 @@ shared_distributions = [
"apache-airflow-shared-secrets-backend",
"apache-airflow-shared-secrets-masker",
"apache-airflow-shared-serialization",
- "apache-airflow-shared-state",
"apache-airflow-shared-timezones",
"apache-airflow-shared-plugins-manager",
"apache-airflow-shared-providers-discovery",
diff --git a/airflow-ctl/.pre-commit-config.yaml
b/airflow-ctl/.pre-commit-config.yaml
index 4561533c574..2fd1432e9d5 100644
--- a/airflow-ctl/.pre-commit-config.yaml
+++ b/airflow-ctl/.pre-commit-config.yaml
@@ -27,7 +27,7 @@ repos:
- id: mypy-airflow-ctl
name: Run mypy for airflow-ctl
language: python
- entry:
../scripts/ci/prek/run_mypy_full_dist_local_venv_or_breeze_in_ci.py airflow-ctl
+ entry: ../scripts/ci/prek/mypy_local_folder.py airflow-ctl
pass_filenames: false
files: ^.*\.py$
require_serial: true
diff --git a/airflow-ctl/src/airflowctl/api/datamodels/generated.py
b/airflow-ctl/src/airflowctl/api/datamodels/generated.py
index f05fa65cf56..510a59c3b09 100644
--- a/airflow-ctl/src/airflowctl/api/datamodels/generated.py
+++ b/airflow-ctl/src/airflowctl/api/datamodels/generated.py
@@ -49,27 +49,6 @@ class AssetAliasResponse(BaseModel):
group: Annotated[str, Field(title="Group")]
-class AssetStateBody(BaseModel):
- """
- Request body for setting an asset state value.
- """
-
- model_config = ConfigDict(
- extra="forbid",
- )
- value: Annotated[str, Field(max_length=65535, title="Value")]
-
-
-class AssetStateResponse(BaseModel):
- """
- A single asset state key/value pair with metadata.
- """
-
- key: Annotated[str, Field(title="Key")]
- value: Annotated[str, Field(title="Value")]
- updated_at: Annotated[datetime, Field(title="Updated At")]
-
-
class AssetWatcherResponse(BaseModel):
"""
Asset watcher serializer for responses.
@@ -129,32 +108,6 @@ class BulkActionResponse(BaseModel):
] = []
-class BulkDAGRunBody(BaseModel):
- """
- Request body for bulk delete operations on Dag Runs.
- """
-
- model_config = ConfigDict(
- extra="forbid",
- )
- dag_run_id: Annotated[str, Field(title="Dag Run Id")]
- dag_id: Annotated[str | None, Field(title="Dag Id")] = None
-
-
-class BulkDeleteActionBulkDAGRunBody(BaseModel):
- model_config = ConfigDict(
- extra="forbid",
- )
- action: Annotated[
- Literal["delete"], Field(description="The action to be performed on
the entities.", title="Action")
- ]
- entities: Annotated[
- list[str | BulkDAGRunBody],
- Field(description="A list of entity id/key or entity objects to be
deleted.", title="Entities"),
- ]
- action_on_non_existence: BulkActionNotOnExistence | None = "fail"
-
-
class BulkResponse(BaseModel):
"""
Serializer for responses to bulk entity operations.
@@ -182,26 +135,6 @@ class Note(RootModel[str]):
root: Annotated[str, Field(max_length=1000, title="Note")]
-class BulkUpdateActionBulkDAGRunBody(BaseModel):
- model_config = ConfigDict(
- extra="forbid",
- )
- action: Annotated[
- Literal["update"], Field(description="The action to be performed on
the entities.", title="Action")
- ]
- entities: Annotated[
- list[BulkDAGRunBody], Field(description="A list of entities to be
updated.", title="Entities")
- ]
- update_mask: Annotated[
- list[str] | None,
- Field(
- description="A list of field names to update for each entity.Only
these fields will be applied from the request body to the database model.Any
extra fields provided will be ignored.",
- title="Update Mask",
- ),
- ] = None
- action_on_non_existence: BulkActionNotOnExistence | None = "fail"
-
-
class TaskIds(RootModel[list]):
root: Annotated[list, Field(max_length=2, min_length=2)]
@@ -235,12 +168,11 @@ class ClearTaskInstancesBody(BaseModel):
run_on_latest_version: Annotated[
bool | None,
Field(
- description="(Experimental) Run on the latest bundle version of
the dag after clearing the task instances. If not specified, falls back to the
DAG-level ``rerun_with_latest_version`` parameter, then the ``[core]
rerun_with_latest_version`` config option, and finally ``False`` (the
historical default for clear/rerun).",
+ description="(Experimental) Run on the latest bundle version of
the dag after clearing the task instances.",
title="Run On Latest Version",
),
- ] = None
+ ] = False
prevent_running_task: Annotated[bool | None, Field(title="Prevent Running
Task")] = False
- note: Annotated[Note | None, Field(title="Note")] = None
class Value(RootModel[list]):
@@ -355,20 +287,23 @@ class DAGRunClearBody(BaseModel):
)
dry_run: Annotated[bool | None, Field(title="Dry Run")] = True
only_failed: Annotated[bool | None, Field(title="Only Failed")] = False
- only_new: Annotated[
- bool | None,
- Field(
- description="Only queue newly added tasks in the latest Dag
version without clearing existing tasks.",
- title="Only New",
- ),
- ] = False
run_on_latest_version: Annotated[
bool | None,
Field(
- description="(Experimental) Run on the latest bundle version of
the Dag after clearing the Dag Run. If not specified, falls back to the
DAG-level ``rerun_with_latest_version`` parameter, then the ``[core]
rerun_with_latest_version`` config option, and finally ``False`` (the
historical default for clear/rerun).",
+ description="(Experimental) Run on the latest bundle version of
the Dag after clearing the Dag Run.",
title="Run On Latest Version",
),
- ] = None
+ ] = False
+
+
+class DAGRunPatchStates(str, Enum):
+ """
+ Enum for Dag Run states when updating a Dag Run.
+ """
+
+ QUEUED = "queued"
+ SUCCESS = "success"
+ FAILED = "failed"
class DAGSourceResponse(BaseModel):
@@ -421,16 +356,6 @@ class DagRunAssetReference(BaseModel):
partition_key: Annotated[str | None, Field(title="Partition Key")] = None
-class DagRunMutableStates(str, Enum):
- """
- Dag Run states from which the run may be mutated (patched, deleted).
- """
-
- QUEUED = "queued"
- SUCCESS = "success"
- FAILED = "failed"
-
-
class DagRunState(str, Enum):
"""
All possible states that a DagRun can be in.
@@ -469,7 +394,6 @@ class DagRunType(str, Enum):
BACKFILL = "backfill"
SCHEDULED = "scheduled"
MANUAL = "manual"
- OPERATOR_TRIGGERED = "operator_triggered"
ASSET_TRIGGERED = "asset_triggered"
ASSET_MATERIALIZATION = "asset_materialization"
@@ -714,15 +638,6 @@ class MaterializeAssetBody(BaseModel):
partition_key: Annotated[str | None, Field(title="Partition Key")] = None
-class NewTaskResponse(BaseModel):
- """
- Lightweight response for new tasks that don't have TaskInstances yet.
- """
-
- task_id: Annotated[str, Field(title="Task Id")]
- task_display_name: Annotated[str, Field(title="Task Display Name")]
-
-
class PluginImportErrorResponse(BaseModel):
"""
Plugin Import Error serializer for responses.
@@ -973,28 +888,6 @@ class TaskOutletAssetReference(BaseModel):
updated_at: Annotated[datetime, Field(title="Updated At")]
-class TaskStateBody(BaseModel):
- """
- Request body for setting a task state value.
- """
-
- model_config = ConfigDict(
- extra="forbid",
- )
- value: Annotated[str, Field(max_length=65535, title="Value")]
-
-
-class TaskStateResponse(BaseModel):
- """
- A single task state key/value pair with metadata.
- """
-
- key: Annotated[str, Field(title="Key")]
- value: Annotated[str, Field(title="Value")]
- updated_at: Annotated[datetime, Field(title="Updated At")]
- expires_at: Annotated[datetime | None, Field(title="Expires At")] = None
-
-
class TimeDelta(BaseModel):
"""
TimeDelta can be used to interact with datetime.timedelta objects.
@@ -1225,15 +1118,6 @@ class AssetResponse(BaseModel):
last_asset_event: LastAssetEventResponse | None = None
-class AssetStateCollectionResponse(BaseModel):
- """
- All asset state entries for an asset.
- """
-
- asset_states: Annotated[list[AssetStateResponse], Field(title="Asset
States")]
- total_entries: Annotated[int, Field(title="Total Entries")]
-
-
class BackfillPostBody(BaseModel):
"""
Object used for create backfill request.
@@ -1246,16 +1130,10 @@ class BackfillPostBody(BaseModel):
from_date: Annotated[datetime, Field(title="From Date")]
to_date: Annotated[datetime, Field(title="To Date")]
run_backwards: Annotated[bool | None, Field(title="Run Backwards")] = False
- dag_run_conf: Annotated[dict[str, Any] | None, Field(title="Dag Run
Conf")] = None
+ dag_run_conf: Annotated[dict[str, Any] | None, Field(title="Dag Run
Conf")] = {}
reprocess_behavior: ReprocessBehavior | None = "none"
max_active_runs: Annotated[int | None, Field(title="Max Active Runs")] = 10
- run_on_latest_version: Annotated[
- bool | None,
- Field(
- description="Run on the latest bundle version of the Dag for each
backfilled run. If not specified, falls back to the DAG-level
``rerun_with_latest_version`` parameter, then the ``[core]
rerun_with_latest_version`` config option, and finally ``True`` (the historical
default for backfills).",
- title="Run On Latest Version",
- ),
- ] = None
+ run_on_latest_version: Annotated[bool | None, Field(title="Run On Latest
Version")] = True
class BackfillResponse(BaseModel):
@@ -1277,19 +1155,6 @@ class BackfillResponse(BaseModel):
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
-class BulkCreateActionBulkDAGRunBody(BaseModel):
- model_config = ConfigDict(
- extra="forbid",
- )
- action: Annotated[
- Literal["create"], Field(description="The action to be performed on
the entities.", title="Action")
- ]
- entities: Annotated[
- list[BulkDAGRunBody], Field(description="A list of entities to be
created.", title="Entities")
- ]
- action_on_existence: BulkActionOnExistence | None = "fail"
-
-
class BulkCreateActionConnectionBody(BaseModel):
model_config = ConfigDict(
extra="forbid",
@@ -1511,7 +1376,6 @@ class DAGDetailsResponse(BaseModel):
timetable_summary: Annotated[str | None, Field(title="Timetable Summary")]
= None
timetable_description: Annotated[str | None, Field(title="Timetable
Description")] = None
timetable_partitioned: Annotated[bool, Field(title="Timetable
Partitioned")]
- timetable_periodic: Annotated[bool, Field(title="Timetable Periodic")]
tags: Annotated[list[DagTagResponse], Field(title="Tags")]
max_active_tasks: Annotated[int, Field(title="Max Active Tasks")]
max_active_runs: Annotated[int | None, Field(title="Max Active Runs")] =
None
@@ -1541,13 +1405,9 @@ class DAGDetailsResponse(BaseModel):
timezone: Annotated[str | None, Field(title="Timezone")] = None
last_parsed: Annotated[datetime | None, Field(title="Last Parsed")] = None
default_args: Annotated[dict[str, Any] | None, Field(title="Default
Args")] = None
- rerun_with_latest_version: Annotated[bool | None, Field(title="Rerun With
Latest Version")] = None
owner_links: Annotated[dict[str, str] | None, Field(title="Owner Links")]
= None
is_favorite: Annotated[bool | None, Field(title="Is Favorite")] = False
active_runs_count: Annotated[int | None, Field(title="Active Runs Count")]
= 0
- is_backfillable: Annotated[
- bool, Field(description="Whether this Dag's schedule supports
backfilling.", title="Is Backfillable")
- ]
file_token: Annotated[str, Field(description="Return file token.",
title="File Token")]
concurrency: Annotated[
int,
@@ -1581,7 +1441,6 @@ class DAGResponse(BaseModel):
timetable_summary: Annotated[str | None, Field(title="Timetable Summary")]
= None
timetable_description: Annotated[str | None, Field(title="Timetable
Description")] = None
timetable_partitioned: Annotated[bool, Field(title="Timetable
Partitioned")]
- timetable_periodic: Annotated[bool, Field(title="Timetable Periodic")]
tags: Annotated[list[DagTagResponse], Field(title="Tags")]
max_active_tasks: Annotated[int, Field(title="Max Active Tasks")]
max_active_runs: Annotated[int | None, Field(title="Max Active Runs")] =
None
@@ -1598,9 +1457,6 @@ class DAGResponse(BaseModel):
next_dagrun_run_after: Annotated[datetime | None, Field(title="Next Dagrun
Run After")] = None
allowed_run_types: Annotated[list[DagRunType] | None, Field(title="Allowed
Run Types")] = None
owners: Annotated[list[str], Field(title="Owners")]
- is_backfillable: Annotated[
- bool, Field(description="Whether this Dag's schedule supports
backfilling.", title="Is Backfillable")
- ]
file_token: Annotated[str, Field(description="Return file token.",
title="File Token")]
@@ -1612,7 +1468,7 @@ class DAGRunPatchBody(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: DagRunMutableStates | None = None
+ state: DAGRunPatchStates | None = None
note: Annotated[Note | None, Field(title="Note")] = None
@@ -1775,7 +1631,7 @@ class JobCollectionResponse(BaseModel):
class PatchTaskInstanceBody(BaseModel):
"""
- Request body for patching task instance state.
+ Request body for Clear Task Instances endpoint.
"""
model_config = ConfigDict(
@@ -1972,15 +1828,6 @@ class TaskResponse(BaseModel):
]
-class TaskStateCollectionResponse(BaseModel):
- """
- All task state entries for a task instance.
- """
-
- task_states: Annotated[list[TaskStateResponse], Field(title="Task States")]
- total_entries: Annotated[int, Field(title="Total Entries")]
-
-
class VariableCollectionResponse(BaseModel):
"""
Variable Collection serializer for responses.
@@ -2026,18 +1873,6 @@ class BackfillCollectionResponse(BaseModel):
total_entries: Annotated[int, Field(title="Total Entries")]
-class BulkBodyBulkDAGRunBody(BaseModel):
- model_config = ConfigDict(
- extra="forbid",
- )
- actions: Annotated[
- list[
- BulkCreateActionBulkDAGRunBody | BulkUpdateActionBulkDAGRunBody |
BulkDeleteActionBulkDAGRunBody
- ],
- Field(title="Actions"),
- ]
-
-
class BulkBodyConnectionBody(BaseModel):
model_config = ConfigDict(
extra="forbid",
@@ -2097,15 +1932,6 @@ class BulkDeleteActionBulkTaskInstanceBody(BaseModel):
action_on_non_existence: BulkActionNotOnExistence | None = "fail"
-class ClearTaskInstanceCollectionResponse(BaseModel):
- """
- Response for clear dag run dry run, which may contain new tasks without
full TaskInstance data.
- """
-
- task_instances: Annotated[list[TaskInstanceResponse | NewTaskResponse],
Field(title="Task Instances")]
- total_entries: Annotated[int, Field(title="Total Entries")]
-
-
class DAGCollectionResponse(BaseModel):
"""
Dag Collection serializer for responses.
@@ -2117,38 +1943,11 @@ class DAGCollectionResponse(BaseModel):
class DAGRunCollectionResponse(BaseModel):
"""
- Dag Run collection response supporting both offset and cursor pagination.
-
- A single flat model is used instead of a discriminated union
- (``Annotated[Offset | Cursor, Field(discriminator=...)]``) because
- the OpenAPI ``oneOf`` + ``discriminator`` construct is not handled
- correctly by ``@hey-api/openapi-ts`` /
``@7nohe/openapi-react-query-codegen``:
- return types degrade to ``unknown`` in JSDoc and can produce
- incorrect TypeScript types (see hey-api/openapi-ts#1613, #3270).
+ Dag Run Collection serializer for responses.
"""
dag_runs: Annotated[list[DAGRunResponse], Field(title="Dag Runs")]
- total_entries: Annotated[
- int | None,
- Field(
- description="Total number of matching items. Populated for offset
pagination, ``null`` when using cursor pagination.",
- title="Total Entries",
- ),
- ] = None
- next_cursor: Annotated[
- str | None,
- Field(
- description="Token pointing to the next page. Populated for cursor
pagination, ``null`` when using offset pagination or when there is no next
page.",
- title="Next Cursor",
- ),
- ] = None
- previous_cursor: Annotated[
- str | None,
- Field(
- description="Token pointing to the previous page. Populated for
cursor pagination, ``null`` when using offset pagination or when on the first
page.",
- title="Previous Cursor",
- ),
- ] = None
+ total_entries: Annotated[int, Field(title="Total Entries")]
class DAGWarningCollectionResponse(BaseModel):
@@ -2240,38 +2039,11 @@ class TaskCollectionResponse(BaseModel):
class TaskInstanceCollectionResponse(BaseModel):
"""
- Task instance collection response supporting both offset and cursor
pagination.
-
- A single flat model is used instead of a discriminated union
- (``Annotated[Offset | Cursor, Field(discriminator=...)]``) because
- the OpenAPI ``oneOf`` + ``discriminator`` construct is not handled
- correctly by ``@hey-api/openapi-ts`` /
``@7nohe/openapi-react-query-codegen``:
- return types degrade to ``unknown`` in JSDoc and can produce
- incorrect TypeScript types (see hey-api/openapi-ts#1613, #3270).
+ Task Instance Collection serializer for responses.
"""
task_instances: Annotated[list[TaskInstanceResponse], Field(title="Task
Instances")]
- total_entries: Annotated[
- int | None,
- Field(
- description="Total number of matching items. Populated for offset
pagination, ``null`` when using cursor pagination.",
- title="Total Entries",
- ),
- ] = None
- next_cursor: Annotated[
- str | None,
- Field(
- description="Token pointing to the next page. Populated for cursor
pagination, ``null`` when using offset pagination or when there is no next
page.",
- title="Next Cursor",
- ),
- ] = None
- previous_cursor: Annotated[
- str | None,
- Field(
- description="Token pointing to the previous page. Populated for
cursor pagination, ``null`` when using offset pagination or when on the first
page.",
- title="Previous Cursor",
- ),
- ] = None
+ total_entries: Annotated[int, Field(title="Total Entries")]
class TaskInstanceHistoryCollectionResponse(BaseModel):
diff --git a/uv.lock b/uv.lock
index a7a98c70d06..5e4cb68ac6d 100644
--- a/uv.lock
+++ b/uv.lock
@@ -101,9 +101,9 @@ apache-airflow-providers-mongo = false
apache-airflow-providers-apprise = false
apache-airflow-providers-apache-impala = false
apache-airflow-ctl = false
-apache-airflow-providers-zendesk = false
apache-airflow-providers-github = false
apache-airflow-providers-snowflake = false
+apache-airflow-providers-zendesk = false
apache-airflow-providers-presto = false
apache-airflow-providers-airbyte = false
apache-airflow-providers-apache-hive = false
@@ -1735,6 +1735,7 @@ dependencies = [
{ name = "a2wsgi" },
{ name = "aiosqlite" },
{ name = "alembic" },
+ { name = "apache-airflow-ctl" },
{ name = "apache-airflow-providers-common-compat" },
{ name = "apache-airflow-providers-common-io" },
{ name = "apache-airflow-providers-common-sql" },
@@ -1744,6 +1745,7 @@ dependencies = [
{ name = "argcomplete" },
{ name = "asgiref" },
{ name = "attrs" },
+ { name = "cachetools" },
{ name = "cadwyn" },
{ name = "colorlog" },
{ name = "cron-descriptor" },
@@ -1846,10 +1848,14 @@ dev = [
{ name = "apache-airflow-providers-fab" },
{ name = "apache-airflow-providers-ftp" },
{ name = "apache-airflow-providers-git" },
+ { name = "apache-airflow-task-sdk" },
]
docs = [
{ name = "apache-airflow-devel-common", extra = ["docs"] },
]
+mypy = [
+ { name = "apache-airflow-devel-common", extra = ["mypy"] },
+]
[package.metadata]
requires-dist = [
@@ -1857,6 +1863,7 @@ requires-dist = [
{ name = "aiosqlite", specifier = ">=0.20.0,<0.22.0" },
{ name = "alembic", specifier = ">=1.13.1,<2.0" },
{ name = "apache-airflow-core", extras = ["graphviz", "gunicorn",
"kerberos", "otel", "statsd"], marker = "extra == 'all'", editable =
"airflow-core" },
+ { name = "apache-airflow-ctl", editable = "airflow-ctl" },
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
{ name = "apache-airflow-providers-common-io", editable =
"providers/common/io" },
{ name = "apache-airflow-providers-common-sql", editable =
"providers/common/sql" },
@@ -1867,6 +1874,7 @@ requires-dist = [
{ name = "asgiref", marker = "python_full_version < '3.14'", specifier =
">=2.3.0" },
{ name = "asgiref", marker = "python_full_version >= '3.14'", specifier =
">=3.11.1" },
{ name = "attrs", specifier = ">=22.1.0,!=25.2.0" },
+ { name = "cachetools", specifier = ">=6.0.0" },
{ name = "cadwyn", specifier = ">=6.0.4" },
{ name = "colorlog", specifier = ">=6.8.2" },
{ name = "cron-descriptor", specifier = ">=1.2.24" },
@@ -1921,7 +1929,7 @@ requires-dist = [
{ name = "rich-argparse", specifier = ">=1.0.0" },
{ name = "setproctitle", specifier = ">=1.3.3" },
{ name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.48" },
- { name = "starlette", specifier = ">=0.45.0,<1" },
+ { name = "starlette", specifier = ">=0.45.0" },
{ name = "statsd", marker = "extra == 'statsd'", specifier = ">=3.3.0" },
{ name = "structlog", specifier = ">=25.4.0" },
{ name = "svcs", specifier = ">=25.1.0" },
@@ -1948,8 +1956,10 @@ dev = [
{ name = "apache-airflow-providers-fab", editable = "providers/fab" },
{ name = "apache-airflow-providers-ftp", editable = "providers/ftp" },
{ name = "apache-airflow-providers-git", editable = "providers/git" },
+ { name = "apache-airflow-task-sdk", editable = "task-sdk" },
]
docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
+mypy = [{ name = "apache-airflow-devel-common", extras = ["mypy"], editable =
"devel-common" }]
[[package]]
name = "apache-airflow-ctl"
@@ -1987,6 +1997,9 @@ dev = [
docs = [
{ name = "apache-airflow-devel-common", extra = ["docs"] },
]
+mypy = [
+ { name = "apache-airflow-devel-common", extra = ["mypy"] },
+]
[package.metadata]
requires-dist = [
@@ -2017,6 +2030,7 @@ dev = [
{ name = "apache-airflow-devel-common", editable = "devel-common" },
]
docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
+mypy = [{ name = "apache-airflow-devel-common", extras = ["mypy"], editable =
"devel-common" }]
[[package]]
name = "apache-airflow-ctl-tests"