This is an automated email from the ASF dual-hosted git repository.
shahar1 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 37b6b04e723 Add name filtering to the Deadline Alerts API (#74127)
37b6b04e723 is described below
commit 37b6b04e7233ec47c193915d6cff04dac742d5fd
Author: SameerMesiah97 <[email protected]>
AuthorDate: Thu Oct 29 20:41:36 2026 +0000
Add name filtering to the Deadline Alerts API (#74127)
---
.../api_fastapi/core_api/openapi/_private_ui.yaml | 17 +++-
.../api_fastapi/core_api/routes/ui/deadlines.py | 10 ++-
.../src/airflow/ui/openapi-gen/queries/common.ts | 5 +-
.../ui/openapi-gen/queries/ensureQueryData.ts | 8 +-
.../src/airflow/ui/openapi-gen/queries/prefetch.ts | 8 +-
.../src/airflow/ui/openapi-gen/queries/queries.ts | 8 +-
.../src/airflow/ui/openapi-gen/queries/suspense.ts | 8 +-
.../ui/openapi-gen/requests/services.gen.ts | 4 +-
.../airflow/ui/openapi-gen/requests/types.gen.ts | 4 +
.../core_api/routes/ui/test_deadlines.py | 91 +++++++++++++++++++---
10 files changed, 135 insertions(+), 28 deletions(-)
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
index d89efe70a34..0d2e68ca34a 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
+++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
@@ -1456,7 +1456,8 @@ paths:
tags:
- Deadlines
summary: Get Dag Deadline Alerts
- description: Get all deadline alerts defined on a Dag.
+ description: Get deadline alerts defined on a Dag, optionally filtered
by name
+ pattern.
operationId: get_dag_deadline_alerts
security:
- OAuth2PasswordBearer: []
@@ -1484,6 +1485,20 @@ paths:
minimum: 0
default: 50
title: Limit
+ - name: name_pattern
+ in: query
+ required: false
+ schema:
+ anyOf:
+ - type: string
+ - type: 'null'
+ description: "Case-insensitive substring match (SQL `ILIKE`). Slower
than\
+ \ `name_prefix_pattern` on large tables \u2014 see \"Filtering
with pattern\
+ \ parameters\"."
+ title: Name Pattern
+ description: "Case-insensitive substring match (SQL `ILIKE`). Slower
than\
+ \ `name_prefix_pattern` on large tables \u2014 see \"Filtering with
pattern\
+ \ parameters\"."
- name: offset
in: query
required: false
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
index c6298e2062e..035a44713a8 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/deadlines.py
@@ -36,8 +36,10 @@ from airflow.api_fastapi.common.parameters import (
RangeFilter,
SortParam,
_DagIdTeamsFilter,
+ _SearchParam,
datetime_range_filter_factory,
filter_param_factory,
+ search_param_factory,
teams_filter_factory,
)
from airflow.api_fastapi.common.router import AirflowRouter
@@ -182,6 +184,10 @@ def get_dag_deadline_alerts(
dag_id: str,
session: SessionDep,
limit: QueryLimit,
+ name_pattern: Annotated[
+ _SearchParam,
+ Depends(search_param_factory(DeadlineAlert.name, "name_pattern")),
+ ],
offset: QueryOffset,
order_by: Annotated[
SortParam,
@@ -194,7 +200,7 @@ def get_dag_deadline_alerts(
],
version_number: int | None = None,
) -> DeadlineAlertCollectionResponse:
- """Get all deadline alerts defined on a Dag."""
+ """Get deadline alerts defined on a Dag, optionally filtered by name
pattern."""
serialized_dag_select = (
select(SerializedDagModel.id)
.join(DagVersion, SerializedDagModel.dag_version_id == DagVersion.id)
@@ -221,7 +227,7 @@ def get_dag_deadline_alerts(
alerts_select, total_entries = paginated_select(
statement=query,
- filters=None,
+ filters=[name_pattern],
order_by=order_by,
offset=offset,
limit=limit,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
index 6af9fa923c4..18716396457 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -1163,13 +1163,14 @@ export const UseDeadlinesServiceGetDeadlinesKeyFn = ({
dagId, dagRunId, deadline
export type DeadlinesServiceGetDagDeadlineAlertsDefaultResponse =
Awaited<ReturnType<typeof DeadlinesService.getDagDeadlineAlerts>>;
export type DeadlinesServiceGetDagDeadlineAlertsQueryResult<TData =
DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown> =
UseQueryResult<TData, TError>;
export const useDeadlinesServiceGetDagDeadlineAlertsKey =
"DeadlinesServiceGetDagDeadlineAlerts";
-export const UseDeadlinesServiceGetDagDeadlineAlertsKeyFn = ({ dagId, limit,
offset, orderBy, versionNumber }: {
+export const UseDeadlinesServiceGetDagDeadlineAlertsKeyFn = ({ dagId, limit,
namePattern, offset, orderBy, versionNumber }: {
dagId: string;
limit?: number;
+ namePattern?: string;
offset?: number;
orderBy?: string[];
versionNumber?: number;
-}, queryKey?: Array<unknown>) => [useDeadlinesServiceGetDagDeadlineAlertsKey,
...(queryKey ?? [{ dagId, limit, offset, orderBy, versionNumber }])];
+}, queryKey?: Array<unknown>) => [useDeadlinesServiceGetDagDeadlineAlertsKey,
...(queryKey ?? [{ dagId, limit, namePattern, offset, orderBy, versionNumber
}])];
export type DeadlinesServiceGetCallbackLogsDefaultResponse =
Awaited<ReturnType<typeof DeadlinesService.getCallbackLogs>>;
export type DeadlinesServiceGetCallbackLogsQueryResult<TData =
DeadlinesServiceGetCallbackLogsDefaultResponse, TError = unknown> =
UseQueryResult<TData, TError>;
export const useDeadlinesServiceGetCallbackLogsKey =
"DeadlinesServiceGetCallbackLogs";
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
index 15003eedc51..b0892f02a2a 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -2298,23 +2298,25 @@ export const ensureUseDeadlinesServiceGetDeadlinesData
= (queryClient: QueryClie
}) => queryClient.ensureQueryData({ queryKey:
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt,
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt,
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset,
orderBy, teams }), queryFn: () => DeadlinesService.getDeadlines({ dagId,
dagRunId, deadlineTimeGt, deadlineTimeGte, deadlineTimeLt, deadlineTimeLte,
lastUpdatedAtGt, lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit
[...]
/**
* Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
* @param data The data for the request.
* @param data.dagId
* @param data.versionNumber
* @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`).
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern
parameters".
* @param data.offset
* @param data.orderBy Attributes to order by, multi criteria sort is
supported. Prefix with `-` for descending order. Supported attributes: `id,
created_at, name`
* @returns DeadlineAlertCollectionResponse Successful Response
* @throws ApiError
*/
-export const ensureUseDeadlinesServiceGetDagDeadlineAlertsData = (queryClient:
QueryClient, { dagId, limit, offset, orderBy, versionNumber }: {
+export const ensureUseDeadlinesServiceGetDagDeadlineAlertsData = (queryClient:
QueryClient, { dagId, limit, namePattern, offset, orderBy, versionNumber }: {
dagId: string;
limit?: number;
+ namePattern?: string;
offset?: number;
orderBy?: string[];
versionNumber?: number;
-}) => queryClient.ensureQueryData({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset,
orderBy, versionNumber }), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy,
versionNumber }) });
+}) => queryClient.ensureQueryData({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit,
namePattern, offset, orderBy, versionNumber }), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset,
orderBy, versionNumber }) });
/**
* Get Callback Logs
* Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
index 489ea7df9b0..7c481b03a76 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -2298,23 +2298,25 @@ export const prefetchUseDeadlinesServiceGetDeadlines =
(queryClient: QueryClient
}) => queryClient.prefetchQuery({ queryKey:
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt,
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt,
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset,
orderBy, teams }), queryFn: () => DeadlinesService.getDeadlines({ dagId,
dagRunId, deadlineTimeGt, deadlineTimeGte, deadlineTimeLt, deadlineTimeLte,
lastUpdatedAtGt, lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit,
[...]
/**
* Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
* @param data The data for the request.
* @param data.dagId
* @param data.versionNumber
* @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`).
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern
parameters".
* @param data.offset
* @param data.orderBy Attributes to order by, multi criteria sort is
supported. Prefix with `-` for descending order. Supported attributes: `id,
created_at, name`
* @returns DeadlineAlertCollectionResponse Successful Response
* @throws ApiError
*/
-export const prefetchUseDeadlinesServiceGetDagDeadlineAlerts = (queryClient:
QueryClient, { dagId, limit, offset, orderBy, versionNumber }: {
+export const prefetchUseDeadlinesServiceGetDagDeadlineAlerts = (queryClient:
QueryClient, { dagId, limit, namePattern, offset, orderBy, versionNumber }: {
dagId: string;
limit?: number;
+ namePattern?: string;
offset?: number;
orderBy?: string[];
versionNumber?: number;
-}) => queryClient.prefetchQuery({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset,
orderBy, versionNumber }), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy,
versionNumber }) });
+}) => queryClient.prefetchQuery({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit,
namePattern, offset, orderBy, versionNumber }), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset,
orderBy, versionNumber }) });
/**
* Get Callback Logs
* Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
index e3a0c653bd0..c293963b5a0 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -2298,23 +2298,25 @@ export const useDeadlinesServiceGetDeadlines = <TData =
Common.DeadlinesServiceG
}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt,
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt,
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset,
orderBy, teams }, queryKey), queryFn: () => DeadlinesService.getDeadlines({
dagId, dagRunId, deadlineTimeGt, deadlineTimeGte, deadline [...]
/**
* Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
* @param data The data for the request.
* @param data.dagId
* @param data.versionNumber
* @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`).
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern
parameters".
* @param data.offset
* @param data.orderBy Attributes to order by, multi criteria sort is
supported. Prefix with `-` for descending order. Supported attributes: `id,
created_at, name`
* @returns DeadlineAlertCollectionResponse Successful Response
* @throws ApiError
*/
-export const useDeadlinesServiceGetDagDeadlineAlerts = <TData =
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, offset, orderBy,
versionNumber }: {
+export const useDeadlinesServiceGetDagDeadlineAlerts = <TData =
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, namePattern,
offset, orderBy, versionNumber }: {
dagId: string;
limit?: number;
+ namePattern?: string;
offset?: number;
orderBy?: string[];
versionNumber?: number;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset,
orderBy, versionNumber }, queryKey), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy,
versionNumber }) as TData, ...options });
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit,
namePattern, offset, orderBy, versionNumber }, queryKey), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset,
orderBy, versionNumber }) as TData, ...options });
/**
* Get Callback Logs
* Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
index 368cf359d2a..8dfcb84ced9 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -2298,23 +2298,25 @@ export const useDeadlinesServiceGetDeadlinesSuspense =
<TData = Common.Deadlines
}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseDeadlinesServiceGetDeadlinesKeyFn({ dagId, dagRunId, deadlineTimeGt,
deadlineTimeGte, deadlineTimeLt, deadlineTimeLte, lastUpdatedAtGt,
lastUpdatedAtGte, lastUpdatedAtLt, lastUpdatedAtLte, limit, missed, offset,
orderBy, teams }, queryKey), queryFn: () => DeadlinesService.getDeadlines({
dagId, dagRunId, deadlineTimeGt, deadlineTimeGte, [...]
/**
* Get Dag Deadline Alerts
-* Get all deadline alerts defined on a Dag.
+* Get deadline alerts defined on a Dag, optionally filtered by name pattern.
* @param data The data for the request.
* @param data.dagId
* @param data.versionNumber
* @param data.limit
+* @param data.namePattern Case-insensitive substring match (SQL `ILIKE`).
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern
parameters".
* @param data.offset
* @param data.orderBy Attributes to order by, multi criteria sort is
supported. Prefix with `-` for descending order. Supported attributes: `id,
created_at, name`
* @returns DeadlineAlertCollectionResponse Successful Response
* @throws ApiError
*/
-export const useDeadlinesServiceGetDagDeadlineAlertsSuspense = <TData =
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, offset, orderBy,
versionNumber }: {
+export const useDeadlinesServiceGetDagDeadlineAlertsSuspense = <TData =
Common.DeadlinesServiceGetDagDeadlineAlertsDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, limit, namePattern,
offset, orderBy, versionNumber }: {
dagId: string;
limit?: number;
+ namePattern?: string;
offset?: number;
orderBy?: string[];
versionNumber?: number;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit, offset,
orderBy, versionNumber }, queryKey), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, offset, orderBy,
versionNumber }) as TData, ...options });
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseDeadlinesServiceGetDagDeadlineAlertsKeyFn({ dagId, limit,
namePattern, offset, orderBy, versionNumber }, queryKey), queryFn: () =>
DeadlinesService.getDagDeadlineAlerts({ dagId, limit, namePattern, offset,
orderBy, versionNumber }) as TData, ...options });
/**
* Get Callback Logs
* Get the execution logs of a deadline callback.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
index 79964c5104c..fedf3892f29 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
@@ -5570,11 +5570,12 @@ export class DeadlinesService {
/**
* Get Dag Deadline Alerts
- * Get all deadline alerts defined on a Dag.
+ * Get deadline alerts defined on a Dag, optionally filtered by name
pattern.
* @param data The data for the request.
* @param data.dagId
* @param data.versionNumber
* @param data.limit
+ * @param data.namePattern Case-insensitive substring match (SQL `ILIKE`).
Slower than `name_prefix_pattern` on large tables — see "Filtering with pattern
parameters".
* @param data.offset
* @param data.orderBy Attributes to order by, multi criteria sort is
supported. Prefix with `-` for descending order. Supported attributes: `id,
created_at, name`
* @returns DeadlineAlertCollectionResponse Successful Response
@@ -5590,6 +5591,7 @@ export class DeadlinesService {
query: {
version_number: data.versionNumber,
limit: data.limit,
+ name_pattern: data.namePattern,
offset: data.offset,
order_by: data.orderBy
},
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
index eea8bebd212..9dfb51d42cb 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -5721,6 +5721,10 @@ export type GetDeadlinesResponse =
DeadlineCollectionResponse;
export type GetDagDeadlineAlertsData = {
dagId: string;
limit?: number;
+ /**
+ * Case-insensitive substring match (SQL `ILIKE`). Slower than
`name_prefix_pattern` on large tables — see "Filtering with pattern parameters".
+ */
+ namePattern?: string | null;
offset?: number;
/**
* Attributes to order by, multi criteria sort is supported. Prefix with
`-` for descending order. Supported attributes: `id, created_at, name`
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
index 3943b9cc9b4..e60cb95894e 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_deadlines.py
@@ -190,6 +190,17 @@ def setup(dag_maker, session):
callback_def={"path": _CALLBACK_PATH},
)
session.add(alert)
+
+ session.add(
+ DeadlineAlert(
+ serialized_dag_id=serialized_dag.id,
+ name="Another Alert",
+ reference=DeadlineReference.DAGRUN_QUEUED_AT.serialize_reference(),
+ interval=3600.0,
+ callback_def={"path": _CALLBACK_PATH},
+ )
+ )
+
session.flush()
session.add(
Deadline(
@@ -549,7 +560,14 @@ class TestGetDagDeadlineAlerts:
session.scalar.return_value = None
with pytest.raises(HTTPException, match=f"Dag with id {DAG_ID} was not
found"):
- get_dag_deadline_alerts(DAG_ID, session, limit=100, offset=0,
order_by=Mock())
+ get_dag_deadline_alerts(
+ DAG_ID,
+ session,
+ limit=100,
+ offset=0,
+ order_by=Mock(),
+ name_pattern=None,
+ )
statement = session.scalar.call_args.args[0]
assert "LIMIT 1" in
str(statement.compile(compile_kwargs={"literal_binds": True}))
@@ -559,20 +577,63 @@ class TestGetDagDeadlineAlerts:
response = test_client.get(f"/dags/{DAG_ID}/deadlineAlerts")
assert response.status_code == 200
data = response.json()
- assert data["total_entries"] == 1
- assert len(data["deadline_alerts"]) == 1
+ assert data["total_entries"] == 2
+ assert len(data["deadline_alerts"]) == 2
def test_alert_response_fields(self, test_client):
"""Alert response includes expected fields with correct values."""
response = test_client.get(f"/dags/{DAG_ID}/deadlineAlerts")
+
assert response.status_code == 200
- alert = response.json()["deadline_alerts"][0]
+
+ data = response.json()
+ alert = next(alert for alert in data["deadline_alerts"] if
alert["name"] == ALERT_NAME)
+
assert alert["name"] == ALERT_NAME
assert alert["interval"] == 3600.0
assert alert["reference_type"] == "DagRunQueuedAtDeadline"
assert "id" in alert
assert "created_at" in alert
+ @pytest.mark.parametrize(
+ ("params", "expected_alerts"),
+ [
+ pytest.param(
+ {"name_pattern": ALERT_NAME},
+ [ALERT_NAME],
+ id="matching_name",
+ ),
+ pytest.param(
+ {"name_pattern": "Another"},
+ ["Another Alert"],
+ id="matching_substring",
+ ),
+ pytest.param(
+ {"name_pattern": "Alert"},
+ [ALERT_NAME, "Another Alert"],
+ id="matching_multiple_alerts",
+ ),
+ pytest.param(
+ {"name_pattern": "does-not-exist"},
+ [],
+ id="no_match",
+ ),
+ ],
+ )
+ def test_filter_by_name_pattern(self, test_client, params,
expected_alerts):
+ """Filtering by name pattern returns matching DeadlineAlerts."""
+ response = test_client.get(
+ f"/dags/{DAG_ID}/deadlineAlerts",
+ params=params,
+ )
+
+ assert response.status_code == 200
+
+ data = response.json()
+
+ assert data["total_entries"] == len(expected_alerts)
+ assert sorted(alert["name"] for alert in data["deadline_alerts"]) ==
sorted(expected_alerts)
+
def test_dag_with_no_alerts_returns_empty_list(self, test_client,
dag_maker, session):
"""A DAG with no deadline alerts returns an empty list."""
with dag_maker("dag_no_alerts", serialized=True, session=session):
@@ -621,19 +682,29 @@ class TestGetDagDeadlineAlerts:
return dag_id
@pytest.mark.parametrize(
- ("params", "expected_alert"),
+ ("params", "expected_alerts"),
[
- pytest.param({}, "v2_alert", id="default_returns_latest_version"),
- pytest.param({"version_number": 1}, "v1_alert",
id="older_version"),
- pytest.param({"version_number": 2}, "v2_alert",
id="latest_version"),
+ pytest.param({}, ["v2_alert"],
id="default_returns_latest_version"),
+ pytest.param({"version_number": 1}, ["v1_alert"],
id="older_version"),
+ pytest.param({"version_number": 2}, ["v2_alert"],
id="latest_version"),
+ pytest.param(
+ {"version_number": 1, "name_pattern": "v1_alert"},
+ ["v1_alert"],
+ id="version_1_matching_name",
+ ),
+ pytest.param(
+ {"version_number": 1, "name_pattern": "v2_alert"},
+ [],
+ id="version_1_non_matching_name",
+ ),
],
)
- def test_version_number_scopes_alerts(self, test_client, dag_maker,
session, params, expected_alert):
+ def test_version_number_scopes_alerts(self, test_client, dag_maker,
session, params, expected_alerts):
dag_id = self._make_two_versions_with_alerts(dag_maker, session)
response = test_client.get(f"/dags/{dag_id}/deadlineAlerts",
params=params)
assert response.status_code == 200
data = response.json()
- assert [alert["name"] for alert in data["deadline_alerts"]] ==
[expected_alert]
+ assert [alert["name"] for alert in data["deadline_alerts"]] ==
expected_alerts
def test_unknown_version_number_returns_404(self, test_client, dag_maker,
session):
dag_id = self._make_two_versions_with_alerts(dag_maker, session)