This is an automated email from the ASF dual-hosted git repository.
vatsrahul1001 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new c921eaaacbd Collapse unreleased Execution API versions under
2026-06-30 (#68611)
c921eaaacbd is described below
commit c921eaaacbd2f288b27fcc7186badccb8e0e3036
Author: Rahul Vats <[email protected]>
AuthorDate: Tue Jun 16 11:51:11 2026 +0530
Collapse unreleased Execution API versions under 2026-06-30 (#68611)
The 2026-06-16 and 2026-06-30 Execution API versions were both added
after the 3.2.0 release (whose HEAD was 2026-04-06) and have not shipped
in any released Airflow version. Per the release process, unreleased
Cadwyn migrations between the last released version and the tentative
release date are collapsed before the release.
Merge the four VersionChange classes from 2026-06-16 (retry policy
fields, team_name field, assets-by-alias endpoint, task/asset state
store endpoints) into the single 2026-06-30 version, drop the
2026-06-16 version file, and point the version-gated tests at the new
previous version (2026-04-06). HEAD is unchanged, so the task SDK
generated datamodels (API_VERSION 2026-06-30) are unaffected.
---
.../api_fastapi/execution_api/versions/__init__.py | 13 ++--
.../execution_api/versions/v2026_06_16.py | 80 ----------------------
.../execution_api/versions/v2026_06_30.py | 65 +++++++++++++++++-
.../versions/v2026_06_30/test_connection_tests.py | 2 +-
.../versions/v2026_06_30/test_variables.py | 2 +-
5 files changed, 70 insertions(+), 92 deletions(-)
diff --git
a/airflow-core/src/airflow/api_fastapi/execution_api/versions/__init__.py
b/airflow-core/src/airflow/api_fastapi/execution_api/versions/__init__.py
index 4893cc0dd03..332ddb28704 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/versions/__init__.py
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/versions/__init__.py
@@ -40,16 +40,14 @@ from airflow.api_fastapi.execution_api.versions.v2026_04_06
import (
MovePreviousRunEndpoint,
RemoveUpstreamMapIndexesField,
)
-from airflow.api_fastapi.execution_api.versions.v2026_06_16 import (
- AddAssetsByAliasEndpoint,
- AddRetryPolicyFields,
- AddTaskAndAssetStateStoreEndpoints,
- AddTeamNameField,
-)
from airflow.api_fastapi.execution_api.versions.v2026_06_30 import (
+ AddAssetsByAliasEndpoint,
AddAwaitingInputStatePayload,
AddConnectionTestEndpoint,
+ AddRetryPolicyFields,
+ AddTaskAndAssetStateStoreEndpoints,
AddTaskInstanceQueueField,
+ AddTeamNameField,
AddVariableKeysEndpoint,
)
@@ -61,9 +59,6 @@ bundle = VersionBundle(
AddConnectionTestEndpoint,
AddAwaitingInputStatePayload,
AddTaskInstanceQueueField,
- ),
- Version(
- "2026-06-16",
AddRetryPolicyFields,
AddTeamNameField,
AddTaskAndAssetStateStoreEndpoints,
diff --git
a/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_16.py
b/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_16.py
deleted file mode 100644
index 39c759e52ac..00000000000
--- a/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_16.py
+++ /dev/null
@@ -1,80 +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.
-
-from __future__ import annotations
-
-from cadwyn import ResponseInfo, VersionChange,
convert_response_to_previous_version_for, endpoint, schema
-
-from airflow.api_fastapi.execution_api.datamodels.taskinstance import (
- DagRun,
- TIRetryStatePayload,
- TIRunContext,
-)
-
-
-class AddRetryPolicyFields(VersionChange):
- """Add retry_delay_seconds and retry_reason fields to TIRetryStatePayload
for pluggable retry policies."""
-
- description = __doc__
-
- instructions_to_migrate_to_previous_version = (
- schema(TIRetryStatePayload).field("retry_delay_seconds").didnt_exist,
- schema(TIRetryStatePayload).field("retry_reason").didnt_exist,
- )
-
-
-class AddTeamNameField(VersionChange):
- """Add the ``team_name`` field to DagRun model."""
-
- description = __doc__
-
- instructions_to_migrate_to_previous_version =
(schema(DagRun).field("team_name").didnt_exist,)
-
- @convert_response_to_previous_version_for(TIRunContext) # type:
ignore[arg-type]
- def remove_team_name_field(response: ResponseInfo) -> None: # type:
ignore[misc]
- """Remove the ``team_name`` field from dag_run for older API
versions."""
- if "dag_run" in response.body and isinstance(response.body["dag_run"],
dict):
- response.body["dag_run"].pop("team_name", None)
-
-
-class AddAssetsByAliasEndpoint(VersionChange):
- """Add endpoint to resolve assets from an AssetAlias."""
-
- description = __doc__
-
- instructions_to_migrate_to_previous_version =
(endpoint("/assets/by-alias", ["GET"]).didnt_exist,)
-
-
-class AddTaskAndAssetStateStoreEndpoints(VersionChange):
- """Add task state store and asset state store API endpoints."""
-
- description = __doc__
-
- instructions_to_migrate_to_previous_version = (
- endpoint("/store/ti/{task_instance_id}/{key}", ["GET"]).didnt_exist,
- endpoint("/store/ti/{task_instance_id}/{key}", ["PUT"]).didnt_exist,
- endpoint("/store/ti/{task_instance_id}/{key}", ["DELETE"]).didnt_exist,
- endpoint("/store/ti/{task_instance_id}", ["DELETE"]).didnt_exist,
- endpoint("/store/asset/by-name/value", ["GET"]).didnt_exist,
- endpoint("/store/asset/by-name/value", ["PUT"]).didnt_exist,
- endpoint("/store/asset/by-name/value", ["DELETE"]).didnt_exist,
- endpoint("/store/asset/by-name/clear", ["DELETE"]).didnt_exist,
- endpoint("/store/asset/by-uri/value", ["GET"]).didnt_exist,
- endpoint("/store/asset/by-uri/value", ["PUT"]).didnt_exist,
- endpoint("/store/asset/by-uri/value", ["DELETE"]).didnt_exist,
- endpoint("/store/asset/by-uri/clear", ["DELETE"]).didnt_exist,
- )
diff --git
a/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_30.py
b/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_30.py
index cfa5b616396..cbd801c0a9b 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_30.py
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/versions/v2026_06_30.py
@@ -17,11 +17,20 @@
from __future__ import annotations
-from cadwyn import VersionChange, endpoint, schema
+from cadwyn import (
+ ResponseInfo,
+ VersionChange,
+ convert_response_to_previous_version_for,
+ endpoint,
+ schema,
+)
from airflow.api_fastapi.execution_api.datamodels.taskinstance import (
+ DagRun,
TaskInstance,
TIAwaitingInputStatePayload,
+ TIRetryStatePayload,
+ TIRunContext,
)
@@ -64,3 +73,57 @@ class AddAwaitingInputStatePayload(VersionChange):
schema(TIAwaitingInputStatePayload).field("next_kwargs").didnt_exist,
schema(TIAwaitingInputStatePayload).field("rendered_map_index").didnt_exist,
)
+
+
+class AddRetryPolicyFields(VersionChange):
+ """Add retry_delay_seconds and retry_reason fields to TIRetryStatePayload
for pluggable retry policies."""
+
+ description = __doc__
+
+ instructions_to_migrate_to_previous_version = (
+ schema(TIRetryStatePayload).field("retry_delay_seconds").didnt_exist,
+ schema(TIRetryStatePayload).field("retry_reason").didnt_exist,
+ )
+
+
+class AddTeamNameField(VersionChange):
+ """Add the ``team_name`` field to DagRun model."""
+
+ description = __doc__
+
+ instructions_to_migrate_to_previous_version =
(schema(DagRun).field("team_name").didnt_exist,)
+
+ @convert_response_to_previous_version_for(TIRunContext) # type:
ignore[arg-type]
+ def remove_team_name_field(response: ResponseInfo) -> None: # type:
ignore[misc]
+ """Remove the ``team_name`` field from dag_run for older API
versions."""
+ if "dag_run" in response.body and isinstance(response.body["dag_run"],
dict):
+ response.body["dag_run"].pop("team_name", None)
+
+
+class AddAssetsByAliasEndpoint(VersionChange):
+ """Add endpoint to resolve assets from an AssetAlias."""
+
+ description = __doc__
+
+ instructions_to_migrate_to_previous_version =
(endpoint("/assets/by-alias", ["GET"]).didnt_exist,)
+
+
+class AddTaskAndAssetStateStoreEndpoints(VersionChange):
+ """Add task state store and asset state store API endpoints."""
+
+ description = __doc__
+
+ instructions_to_migrate_to_previous_version = (
+ endpoint("/store/ti/{task_instance_id}/{key}", ["GET"]).didnt_exist,
+ endpoint("/store/ti/{task_instance_id}/{key}", ["PUT"]).didnt_exist,
+ endpoint("/store/ti/{task_instance_id}/{key}", ["DELETE"]).didnt_exist,
+ endpoint("/store/ti/{task_instance_id}", ["DELETE"]).didnt_exist,
+ endpoint("/store/asset/by-name/value", ["GET"]).didnt_exist,
+ endpoint("/store/asset/by-name/value", ["PUT"]).didnt_exist,
+ endpoint("/store/asset/by-name/value", ["DELETE"]).didnt_exist,
+ endpoint("/store/asset/by-name/clear", ["DELETE"]).didnt_exist,
+ endpoint("/store/asset/by-uri/value", ["GET"]).didnt_exist,
+ endpoint("/store/asset/by-uri/value", ["PUT"]).didnt_exist,
+ endpoint("/store/asset/by-uri/value", ["DELETE"]).didnt_exist,
+ endpoint("/store/asset/by-uri/clear", ["DELETE"]).didnt_exist,
+ )
diff --git
a/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_connection_tests.py
b/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_connection_tests.py
index 8197e8d2bde..b41e77ba40c 100644
---
a/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_connection_tests.py
+++
b/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_connection_tests.py
@@ -28,7 +28,7 @@ pytestmark = pytest.mark.db_test
@pytest.fixture
def old_ver_client(client):
"""Client configured to use API version before connection-tests endpoint
was added."""
- client.headers["Airflow-API-Version"] = "2026-06-16"
+ client.headers["Airflow-API-Version"] = "2026-04-06"
return client
diff --git
a/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_variables.py
b/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_variables.py
index c1494512290..bcfd8062b5a 100644
---
a/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_variables.py
+++
b/airflow-core/tests/unit/api_fastapi/execution_api/versions/v2026_06_30/test_variables.py
@@ -25,7 +25,7 @@ pytestmark = pytest.mark.db_test
@pytest.fixture
def old_ver_client(client):
"""Last released execution API before `GET /variables/keys` was added."""
- client.headers["Airflow-API-Version"] = "2026-06-16"
+ client.headers["Airflow-API-Version"] = "2026-04-06"
return client