diff --git a/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py b/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py index 2b178e97fc220..cae21ab96c646 100644 --- a/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py +++ b/airflow-core/src/airflow/api_fastapi/execution_api/routes/dag_runs.py @@ -30,6 +30,7 @@ from airflow.api_fastapi.common.db.common import SessionDep from airflow.api_fastapi.common.types import UtcDateTime from airflow.api_fastapi.compat import HTTP_422_UNPROCESSABLE_CONTENT +from airflow.api_fastapi.core_api.services.public.common import resolve_run_on_latest_version from airflow.api_fastapi.execution_api.datamodels.dagrun import DagRunStateResponse, TriggerDAGRunPayload from airflow.api_fastapi.execution_api.datamodels.taskinstance import DagRun from airflow.api_fastapi.execution_api.datamodels.token import TIToken @@ -197,7 +198,8 @@ def clear_dag_run( ) dag = get_dag_for_run(dag_bag, dag_run=dag_run, session=session) - dag.clear(run_id=run_id) + resolved_run_on_latest = resolve_run_on_latest_version(None, dag_id, session) + dag.clear(run_id=run_id, run_on_latest_version=resolved_run_on_latest) @router.get( diff --git a/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_dag_runs.py b/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_dag_runs.py index 337bc1c90b8d5..05483f1966b73 100644 --- a/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_dag_runs.py +++ b/airflow-core/tests/unit/api_fastapi/execution_api/versions/head/test_dag_runs.py @@ -17,6 +17,8 @@ from __future__ import annotations +from unittest import mock + import pytest import time_machine from fastapi import Request @@ -322,6 +324,27 @@ def test_dag_run_not_found(self, client): assert response.status_code == 404 + def test_dag_run_clear_invokes_resolver(self, client, session, dag_maker): + """Clearing invokes resolve_run_on_latest_version with no explicit override.""" + dag_id = "test_clear_invokes_resolver" + run_id = "test_run_id" + + with dag_maker(dag_id=dag_id, session=session, serialized=True): + EmptyOperator(task_id="test_task") + dag_maker.create_dagrun(run_id=run_id, state=DagRunState.SUCCESS) + session.commit() + + with mock.patch( + "airflow.api_fastapi.execution_api.routes.dag_runs.resolve_run_on_latest_version", + return_value=False, + ) as mock_resolver: + response = client.post(f"/execution/dag-runs/{dag_id}/{run_id}/clear") + + assert response.status_code == 204 + mock_resolver.assert_called_once() + # First positional arg is the explicit override; operator does not pass one. + assert mock_resolver.call_args.args[0] is None + class TestDagRunDetail: def setup_method(self):