This is an automated email from the ASF dual-hosted git repository.
pierrejeambrun pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-1-test by this push:
new 540a96d87f2 [v3-1-test] Respect maximum page limit in API (#60989)
(#61073)
540a96d87f2 is described below
commit 540a96d87f25b96e1e7f3480fac21e47efad3f7f
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Jan 26 17:31:25 2026 +0100
[v3-1-test] Respect maximum page limit in API (#60989) (#61073)
* Respect maximum page limit in API
* Fix CI
(cherry picked from commit 2ed39694038132ee0ae1ea20aad51e0c7f335f83)
Co-authored-by: Pierre Jeambrun <[email protected]>
---
airflow-core/src/airflow/api_fastapi/common/parameters.py | 5 +++--
.../api_fastapi/core_api/routes/public/test_task_instances.py | 10 +++++++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/airflow-core/src/airflow/api_fastapi/common/parameters.py
b/airflow-core/src/airflow/api_fastapi/common/parameters.py
index 1d48187f1ce..a2f80876994 100644
--- a/airflow-core/src/airflow/api_fastapi/common/parameters.py
+++ b/airflow-core/src/airflow/api_fastapi/common/parameters.py
@@ -40,6 +40,7 @@ from sqlalchemy.inspection import inspect
from airflow._shared.timezones import timezone
from airflow.api_fastapi.core_api.base import OrmClause
from airflow.api_fastapi.core_api.security import GetUserDep
+from airflow.configuration import conf
from airflow.models import Base
from airflow.models.asset import (
AssetAliasModel,
@@ -99,8 +100,8 @@ class LimitFilter(BaseParam[NonNegativeInt]):
return select.limit(self.value)
@classmethod
- def depends(cls, limit: NonNegativeInt = 50) -> LimitFilter:
- return cls().set_value(limit)
+ def depends(cls, limit: NonNegativeInt = conf.getint("api", "page_size"))
-> LimitFilter:
+ return cls().set_value(min(limit, conf.getint("api",
"maximum_page_limit")))
class OffsetFilter(BaseParam[NonNegativeInt]):
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
index ee5e9724784..8b3cb628da0 100644
---
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
+++
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
@@ -47,6 +47,7 @@ from airflow.utils.types import DagRunType
from tests_common.test_utils.api_fastapi import _check_task_instance_note
from tests_common.test_utils.asserts import assert_queries_count
+from tests_common.test_utils.config import conf_vars
from tests_common.test_utils.db import (
clear_db_runs,
clear_rendered_ti_fields,
@@ -785,8 +786,8 @@ class TestGetMappedTaskInstances:
({"order_by": "map_index", "limit": 100}, list(range(100))),
({"order_by": "-map_index", "limit": 100}, list(range(109, 9,
-1))),
(
- {"order_by": "state", "limit": 108},
- list(range(5, 25)) + list(range(25, 110)) + list(range(3)),
+ {"order_by": "state", "limit": 108}, # Maximum page limit
will limit result to 100 items.
+ list(range(5, 25)) + list(range(25, 105)),
),
(
{"order_by": "-state", "limit": 100},
@@ -801,6 +802,8 @@ class TestGetMappedTaskInstances:
def test_mapped_instances_order(
self, test_client, session, params, expected_map_indexes,
one_task_with_many_mapped_tis
):
+ from airflow.configuration import conf
+
with assert_queries_count(4):
response = test_client.get(
"/dags/mapped_tis/dagRuns/run_mapped_tis/taskInstances/task_2/listMapped",
@@ -810,7 +813,7 @@ class TestGetMappedTaskInstances:
assert response.status_code == 200
body = response.json()
assert body["total_entries"] == 110
- assert len(body["task_instances"]) == params["limit"]
+ assert len(body["task_instances"]) == min(params["limit"],
conf.getint("api", "maximum_page_limit"))
assert expected_map_indexes == [ti["map_index"] for ti in
body["task_instances"]]
# Ordering of nulls values is DB specific.
@@ -822,6 +825,7 @@ class TestGetMappedTaskInstances:
({"order_by": "-rendered_map_index", "limit": 100}, [0] +
list(range(11, 110)[::-1])), # Desc
],
)
+ @conf_vars({("api", "maximum_page_limit"): "110"})
def test_rendered_map_index_order(
self, test_client, session, params, expected_map_indexes,
one_task_with_many_mapped_tis
):