This is an automated email from the ASF dual-hosted git repository.
jasonliu 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 afa0329368f Add Dag ID pattern search functionality to Dag Runs and
Task Instances (#55691)
afa0329368f is described below
commit afa0329368f8fb9e13684cb7ff8e44834206e69e
Author: Dheeraj Turaga <[email protected]>
AuthorDate: Fri Sep 19 03:04:15 2025 -0500
Add Dag ID pattern search functionality to Dag Runs and Task Instances
(#55691)
* Add DAG ID pattern search functionality to DAG runs and task instances
- Add dag_id_pattern query parameter to DAG runs and task instances API
endpoints
- Implement SQL LIKE pattern matching with % and _ wildcards
- Add search fields to DAG runs and task instances UI pages with
conditional display
- Update TypeScript client with new dag_id_pattern parameters
- Add comprehensive unit tests for DAG ID pattern filtering
- Fix test to use existing example DAGs instead of non-existent ones
* Fix Translations
* Fix tests based on Jason's and Pierre's feedback
---
.../core_api/openapi/v2-rest-api-generated.yaml | 24 +++++++++++
.../api_fastapi/core_api/routes/public/dag_run.py | 2 +
.../core_api/routes/public/task_instances.py | 4 ++
.../src/airflow/ui/openapi-gen/queries/common.ts | 10 +++--
.../ui/openapi-gen/queries/ensureQueryData.ts | 12 ++++--
.../src/airflow/ui/openapi-gen/queries/prefetch.ts | 12 ++++--
.../src/airflow/ui/openapi-gen/queries/queries.ts | 12 ++++--
.../src/airflow/ui/openapi-gen/queries/suspense.ts | 12 ++++--
.../ui/openapi-gen/requests/services.gen.ts | 6 ++-
.../airflow/ui/openapi-gen/requests/types.gen.ts | 8 ++++
airflow-core/src/airflow/ui/src/pages/DagRuns.tsx | 30 +++++++++++++
.../ui/src/pages/TaskInstances/TaskInstances.tsx | 3 ++
.../pages/TaskInstances/TaskInstancesFilter.tsx | 35 ++++++++++++++-
.../core_api/routes/public/test_dag_run.py | 16 +++++++
.../core_api/routes/public/test_task_instances.py | 50 +++++++++++++++++++---
15 files changed, 208 insertions(+), 28 deletions(-)
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
index dab0066101f..61565e7912c 100644
---
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
+++
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
@@ -2245,6 +2245,18 @@ paths:
title: Triggering User Name Pattern
description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g.
`%customer_%`).\
\ Regular expressions are **not** supported."
+ - name: dag_id_pattern
+ in: query
+ required: false
+ schema:
+ anyOf:
+ - type: string
+ - type: 'null'
+ description: "SQL LIKE expression \u2014 use `%` / `_` wildcards
(e.g. `%customer_%`).\
+ \ Regular expressions are **not** supported."
+ title: Dag Id Pattern
+ description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g.
`%customer_%`).\
+ \ Regular expressions are **not** supported."
responses:
'200':
description: Successful Response
@@ -6479,6 +6491,18 @@ paths:
title: Task Display Name Pattern
description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g.
`%customer_%`).\
\ Regular expressions are **not** supported."
+ - name: dag_id_pattern
+ in: query
+ required: false
+ schema:
+ anyOf:
+ - type: string
+ - type: 'null'
+ description: "SQL LIKE expression \u2014 use `%` / `_` wildcards
(e.g. `%customer_%`).\
+ \ Regular expressions are **not** supported."
+ title: Dag Id Pattern
+ description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g.
`%customer_%`).\
+ \ Regular expressions are **not** supported."
- name: state
in: query
required: false
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
index 657d2df6955..0aa4be09979 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -351,6 +351,7 @@ def get_dag_runs(
_SearchParam,
Depends(search_param_factory(DagRun.triggering_user_name,
"triggering_user_name_pattern")),
],
+ dag_id_pattern: Annotated[_SearchParam,
Depends(search_param_factory(DagRun.dag_id, "dag_id_pattern"))],
) -> DAGRunCollectionResponse:
"""
Get all DAG Runs.
@@ -381,6 +382,7 @@ def get_dag_runs(
readable_dag_runs_filter,
run_id_pattern,
triggering_user_name_pattern,
+ dag_id_pattern,
],
order_by=order_by,
offset=offset,
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
index 28831ac01e6..a4eb092885f 100644
---
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
+++
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
@@ -52,9 +52,11 @@ from airflow.api_fastapi.common.parameters import (
Range,
RangeFilter,
SortParam,
+ _SearchParam,
datetime_range_filter_factory,
filter_param_factory,
float_range_filter_factory,
+ search_param_factory,
)
from airflow.api_fastapi.common.router import AirflowRouter
from airflow.api_fastapi.core_api.datamodels.common import BulkBody,
BulkResponse
@@ -408,6 +410,7 @@ def get_task_instances(
update_at_range: Annotated[RangeFilter,
Depends(datetime_range_filter_factory("updated_at", TI))],
duration_range: Annotated[RangeFilter,
Depends(float_range_filter_factory("duration", TI))],
task_display_name_pattern: QueryTITaskDisplayNamePatternSearch,
+ dag_id_pattern: Annotated[_SearchParam,
Depends(search_param_factory(TI.dag_id, "dag_id_pattern"))],
state: QueryTIStateFilter,
pool: QueryTIPoolFilter,
queue: QueryTIQueueFilter,
@@ -491,6 +494,7 @@ def get_task_instances(
executor,
task_id,
task_display_name_pattern,
+ dag_id_pattern,
version_number,
readable_ti_filter,
try_number,
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 7ec7d3201c2..bfb860cfc3d 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -143,8 +143,9 @@ export const UseDagRunServiceGetUpstreamAssetEventsKeyFn =
({ dagId, dagRunId }:
export type DagRunServiceGetDagRunsDefaultResponse = Awaited<ReturnType<typeof
DagRunService.getDagRuns>>;
export type DagRunServiceGetDagRunsQueryResult<TData =
DagRunServiceGetDagRunsDefaultResponse, TError = unknown> =
UseQueryResult<TData, TError>;
export const useDagRunServiceGetDagRunsKey = "DagRunServiceGetDagRuns";
-export const UseDagRunServiceGetDagRunsKeyFn = ({ dagId, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern,
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }: {
+export const UseDagRunServiceGetDagRunsKeyFn = ({ dagId, dagIdPattern,
dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern,
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }: {
dagId: string;
+ dagIdPattern?: string;
dagVersion?: number[];
endDateGt?: string;
endDateGte?: string;
@@ -173,7 +174,7 @@ export const UseDagRunServiceGetDagRunsKeyFn = ({ dagId,
dagVersion, endDateGt,
updatedAtGte?: string;
updatedAtLt?: string;
updatedAtLte?: string;
-}, queryKey?: Array<unknown>) => [useDagRunServiceGetDagRunsKey, ...(queryKey
?? [{ dagId, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit,
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy,
runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType,
startDateGt, startDateGte, startDateLt, startDateLte, state,
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte
}])];
+}, queryKey?: Array<unknown>) => [useDagRunServiceGetDagRunsKey, ...(queryKey
?? [{ dagId, dagIdPattern, dagVersion, endDateGt, endDateGte, endDateLt,
endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt,
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt,
startDateLte, state, triggeringUserNamePattern, updatedAtGt, updatedAtGte,
updatedAtLt, updatedAtLte }])];
export type DagRunServiceWaitDagRunUntilFinishedDefaultResponse =
Awaited<ReturnType<typeof DagRunService.waitDagRunUntilFinished>>;
export type DagRunServiceWaitDagRunUntilFinishedQueryResult<TData =
DagRunServiceWaitDagRunUntilFinishedDefaultResponse, TError = unknown> =
UseQueryResult<TData, TError>;
export const useDagRunServiceWaitDagRunUntilFinishedKey =
"DagRunServiceWaitDagRunUntilFinished";
@@ -471,8 +472,9 @@ export const
UseTaskInstanceServiceGetMappedTaskInstanceKeyFn = ({ dagId, dagRun
export type TaskInstanceServiceGetTaskInstancesDefaultResponse =
Awaited<ReturnType<typeof TaskInstanceService.getTaskInstances>>;
export type TaskInstanceServiceGetTaskInstancesQueryResult<TData =
TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown> =
UseQueryResult<TData, TError>;
export const useTaskInstanceServiceGetTaskInstancesKey =
"TaskInstanceServiceGetTaskInstances";
-export const UseTaskInstanceServiceGetTaskInstancesKeyFn = ({ dagId, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt,
startDateGte, startDateLt, startDateLte, state, taskDisplayNamePattern, taskId,
tryNumber, updatedAtGt, updatedAtGte, updated [...]
+export const UseTaskInstanceServiceGetTaskInstancesKeyFn = ({ dagId,
dagIdPattern, dagRunId, durationGt, durationGte, durationLt, durationLte,
endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator,
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte,
startDateGt, startDateGte, startDateLt, startDateLte, state,
taskDisplayNamePattern, taskId, tryNumber, updatedAtGt, updated [...]
dagId: string;
+ dagIdPattern?: string;
dagRunId: string;
durationGt?: number;
durationGte?: number;
@@ -511,7 +513,7 @@ export const UseTaskInstanceServiceGetTaskInstancesKeyFn =
({ dagId, dagRunId, d
updatedAtLt?: string;
updatedAtLte?: string;
versionNumber?: number[];
-}, queryKey?: Array<unknown>) => [useTaskInstanceServiceGetTaskInstancesKey,
...(queryKey ?? [{ dagId, dagRunId, durationGt, durationGte, durationLt,
durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit,
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset,
operator, orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state,
taskDisplayNamePattern, taskId, tryNumber, [...]
+}, queryKey?: Array<unknown>) => [useTaskInstanceServiceGetTaskInstancesKey,
...(queryKey ?? [{ dagId, dagIdPattern, dagRunId, durationGt, durationGte,
durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte,
executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte,
mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte,
state, taskDisplayNamePattern, taskI [...]
export type TaskInstanceServiceGetTaskInstanceTryDetailsDefaultResponse =
Awaited<ReturnType<typeof TaskInstanceService.getTaskInstanceTryDetails>>;
export type TaskInstanceServiceGetTaskInstanceTryDetailsQueryResult<TData =
TaskInstanceServiceGetTaskInstanceTryDetailsDefaultResponse, TError = unknown>
= UseQueryResult<TData, TError>;
export const useTaskInstanceServiceGetTaskInstanceTryDetailsKey =
"TaskInstanceServiceGetTaskInstanceTryDetails";
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 411f9e07a87..54c822bdc23 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -291,11 +291,13 @@ export const
ensureUseDagRunServiceGetUpstreamAssetEventsData = (queryClient: Qu
* @param data.orderBy
* @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @returns DAGRunCollectionResponse Successful Response
* @throws ApiError
*/
-export const ensureUseDagRunServiceGetDagRunsData = (queryClient: QueryClient,
{ dagId, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit,
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy,
runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType,
startDateGt, startDateGte, startDateLt, startDateLte, state,
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte
}: {
+export const ensureUseDagRunServiceGetDagRunsData = (queryClient: QueryClient,
{ dagId, dagIdPattern, dagVersion, endDateGt, endDateGte, endDateLt,
endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt,
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt,
startDateLte, state, triggeringUserNamePattern, updatedAtGt, updatedAtGte,
updatedAtLt, updatedAtLte }: {
dagId: string;
+ dagIdPattern?: string;
dagVersion?: number[];
endDateGt?: string;
endDateGte?: string;
@@ -324,7 +326,7 @@ export const ensureUseDagRunServiceGetDagRunsData =
(queryClient: QueryClient, {
updatedAtGte?: string;
updatedAtLt?: string;
updatedAtLte?: string;
-}) => queryClient.ensureQueryData({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt,
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte,
startDateLt, startDateLte, state, triggeringUserNamePattern, updatedAtGt,
updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () =>
DagRunService.getDagR [...]
+}) => queryClient.ensureQueryData({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern,
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () => DagRunS
[...]
/**
* Experimental: Wait for a dag run to complete, and return task results if
requested.
* 🚧 This is an experimental endpoint and may change or be removed without
notice.Successful response are streamed as newline-delimited JSON (NDJSON).
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const
ensureUseTaskInstanceServiceGetMappedTaskInstanceData = (queryClien
* @param data.durationLte
* @param data.durationLt
* @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.state
* @param data.pool
* @param data.queue
@@ -932,8 +935,9 @@ export const
ensureUseTaskInstanceServiceGetMappedTaskInstanceData = (queryClien
* @returns TaskInstanceCollectionResponse Successful Response
* @throws ApiError
*/
-export const ensureUseTaskInstanceServiceGetTaskInstancesData = (queryClient:
QueryClient, { dagId, dagRunId, durationGt, durationGte, durationLt,
durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit,
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset,
operator, orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state,
taskDisplayNamePattern, taskId, tryNumber, upd [...]
+export const ensureUseTaskInstanceServiceGetTaskInstancesData = (queryClient:
QueryClient, { dagId, dagIdPattern, dagRunId, durationGt, durationGte,
durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte,
executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte,
mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte,
state, taskDisplayNamePattern, taskId, [...]
dagId: string;
+ dagIdPattern?: string;
dagRunId: string;
durationGt?: number;
durationGte?: number;
@@ -972,7 +976,7 @@ export const
ensureUseTaskInstanceServiceGetTaskInstancesData = (queryClient: Qu
updatedAtLt?: string;
updatedAtLte?: string;
versionNumber?: number[];
-}) => queryClient.ensureQueryData({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt,
startDateGte, startDateLt, startDateLte, state, taskDisplayNamePattern, taskId,
tryNumbe [...]
+}) => queryClient.ensureQueryData({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern,
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt,
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator,
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte,
startDateGt, startDateGte, startDateLt, startDateLte, state,
taskDisplayNamePattern, ta [...]
/**
* Get Task Instance Try Details
* Get task instance details by try number.
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 ec223f57f5a..b267c936712 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -291,11 +291,13 @@ export const
prefetchUseDagRunServiceGetUpstreamAssetEvents = (queryClient: Quer
* @param data.orderBy
* @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @returns DAGRunCollectionResponse Successful Response
* @throws ApiError
*/
-export const prefetchUseDagRunServiceGetDagRuns = (queryClient: QueryClient, {
dagId, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit,
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy,
runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType,
startDateGt, startDateGte, startDateLt, startDateLte, state,
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte
}: {
+export const prefetchUseDagRunServiceGetDagRuns = (queryClient: QueryClient, {
dagId, dagIdPattern, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte,
limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset,
orderBy, runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern,
runType, startDateGt, startDateGte, startDateLt, startDateLte, state,
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte
}: {
dagId: string;
+ dagIdPattern?: string;
dagVersion?: number[];
endDateGt?: string;
endDateGte?: string;
@@ -324,7 +326,7 @@ export const prefetchUseDagRunServiceGetDagRuns =
(queryClient: QueryClient, { d
updatedAtGte?: string;
updatedAtLt?: string;
updatedAtLte?: string;
-}) => queryClient.prefetchQuery({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt,
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte,
startDateLt, startDateLte, state, triggeringUserNamePattern, updatedAtGt,
updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () =>
DagRunService.getDagRun [...]
+}) => queryClient.prefetchQuery({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern,
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () =>
DagRunSer [...]
/**
* Experimental: Wait for a dag run to complete, and return task results if
requested.
* 🚧 This is an experimental endpoint and may change or be removed without
notice.Successful response are streamed as newline-delimited JSON (NDJSON).
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const
prefetchUseTaskInstanceServiceGetMappedTaskInstance = (queryClient:
* @param data.durationLte
* @param data.durationLt
* @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.state
* @param data.pool
* @param data.queue
@@ -932,8 +935,9 @@ export const
prefetchUseTaskInstanceServiceGetMappedTaskInstance = (queryClient:
* @returns TaskInstanceCollectionResponse Successful Response
* @throws ApiError
*/
-export const prefetchUseTaskInstanceServiceGetTaskInstances = (queryClient:
QueryClient, { dagId, dagRunId, durationGt, durationGte, durationLt,
durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit,
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset,
operator, orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state,
taskDisplayNamePattern, taskId, tryNumber, updat [...]
+export const prefetchUseTaskInstanceServiceGetTaskInstances = (queryClient:
QueryClient, { dagId, dagIdPattern, dagRunId, durationGt, durationGte,
durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte,
executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte,
mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte,
state, taskDisplayNamePattern, taskId, tr [...]
dagId: string;
+ dagIdPattern?: string;
dagRunId: string;
durationGt?: number;
durationGte?: number;
@@ -972,7 +976,7 @@ export const prefetchUseTaskInstanceServiceGetTaskInstances
= (queryClient: Quer
updatedAtLt?: string;
updatedAtLte?: string;
versionNumber?: number[];
-}) => queryClient.prefetchQuery({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt,
startDateGte, startDateLt, startDateLte, state, taskDisplayNamePattern, taskId,
tryNumber, [...]
+}) => queryClient.prefetchQuery({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern,
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt,
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator,
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte,
startDateGt, startDateGte, startDateLt, startDateLte, state,
taskDisplayNamePattern, task [...]
/**
* Get Task Instance Try Details
* Get task instance details by try number.
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 556d7932d60..62e4fc99d36 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -291,11 +291,13 @@ export const useDagRunServiceGetUpstreamAssetEvents =
<TData = Common.DagRunServ
* @param data.orderBy
* @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @returns DAGRunCollectionResponse Successful Response
* @throws ApiError
*/
-export const useDagRunServiceGetDagRuns = <TData =
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey
extends Array<unknown> = unknown[]>({ dagId, dagVersion, endDateGt, endDateGte,
endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt,
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt,
startDateLte, state, triggeringUserNamePattern, updatedAtGt, upd [...]
+export const useDagRunServiceGetDagRuns = <TData =
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey
extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern, up
[...]
dagId: string;
+ dagIdPattern?: string;
dagVersion?: number[];
endDateGt?: string;
endDateGte?: string;
@@ -324,7 +326,7 @@ export const useDagRunServiceGetDagRuns = <TData =
Common.DagRunServiceGetDagRun
updatedAtGte?: string;
updatedAtLt?: string;
updatedAtLte?: string;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt,
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte,
startDateLt, startDateLte, state, triggeringUserNamePattern, upd [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNa [...]
/**
* Experimental: Wait for a dag run to complete, and return task results if
requested.
* 🚧 This is an experimental endpoint and may change or be removed without
notice.Successful response are streamed as newline-delimited JSON (NDJSON).
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const useTaskInstanceServiceGetMappedTaskInstance =
<TData = Common.TaskI
* @param data.durationLte
* @param data.durationLt
* @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.state
* @param data.pool
* @param data.queue
@@ -932,8 +935,9 @@ export const useTaskInstanceServiceGetMappedTaskInstance =
<TData = Common.TaskI
* @returns TaskInstanceCollectionResponse Successful Response
* @throws ApiError
*/
-export const useTaskInstanceServiceGetTaskInstances = <TData =
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagRunId, durationGt,
durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt,
endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt,
logicalDateLte, mapIndex, offset, operator, orderBy, pool, queue, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, startDateGt, [...]
+export const useTaskInstanceServiceGetTaskInstances = <TData =
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte [...]
dagId: string;
+ dagIdPattern?: string;
dagRunId: string;
durationGt?: number;
durationGte?: number;
@@ -972,7 +976,7 @@ export const useTaskInstanceServiceGetTaskInstances =
<TData = Common.TaskInstan
updatedAtLt?: string;
updatedAtLte?: string;
versionNumber?: number[];
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern,
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt,
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator,
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLt [...]
/**
* Get Task Instance Try Details
* Get task instance details by try number.
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 433fad2caa6..5fafc55f54a 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -291,11 +291,13 @@ export const
useDagRunServiceGetUpstreamAssetEventsSuspense = <TData = Common.Da
* @param data.orderBy
* @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @returns DAGRunCollectionResponse Successful Response
* @throws ApiError
*/
-export const useDagRunServiceGetDagRunsSuspense = <TData =
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey
extends Array<unknown> = unknown[]>({ dagId, dagVersion, endDateGt, endDateGte,
endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt,
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt,
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt,
startDateLte, state, triggeringUserNamePattern, updatedA [...]
+export const useDagRunServiceGetDagRunsSuspense = <TData =
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey
extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePat [...]
dagId: string;
+ dagIdPattern?: string;
dagVersion?: number[];
endDateGt?: string;
endDateGte?: string;
@@ -324,7 +326,7 @@ export const useDagRunServiceGetDagRunsSuspense = <TData =
Common.DagRunServiceG
updatedAtGte?: string;
updatedAtLt?: string;
updatedAtLte?: string;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt,
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte,
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte,
startDateLt, startDateLte, state, triggeringUserNamePatt [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion,
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt,
startDateGte, startDateLt, startDateLte, state, triggeri [...]
/**
* Experimental: Wait for a dag run to complete, and return task results if
requested.
* 🚧 This is an experimental endpoint and may change or be removed without
notice.Successful response are streamed as newline-delimited JSON (NDJSON).
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const
useTaskInstanceServiceGetMappedTaskInstanceSuspense = <TData = Comm
* @param data.durationLte
* @param data.durationLt
* @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g.
`%customer_%`). Regular expressions are **not** supported.
* @param data.state
* @param data.pool
* @param data.queue
@@ -932,8 +935,9 @@ export const
useTaskInstanceServiceGetMappedTaskInstanceSuspense = <TData = Comm
* @returns TaskInstanceCollectionResponse Successful Response
* @throws ApiError
*/
-export const useTaskInstanceServiceGetTaskInstancesSuspense = <TData =
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagRunId, durationGt,
durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt,
endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt,
logicalDateLte, mapIndex, offset, operator, orderBy, pool, queue, runAfterGt,
runAfterGte, runAfterLt, runAfterLte, star [...]
+export const useTaskInstanceServiceGetTaskInstancesSuspense = <TData =
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown,
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, run [...]
dagId: string;
+ dagIdPattern?: string;
dagRunId: string;
durationGt?: number;
durationGte?: number;
@@ -972,7 +976,7 @@ export const useTaskInstanceServiceGetTaskInstancesSuspense
= <TData = Common.Ta
updatedAtLt?: string;
updatedAtLte?: string;
versionNumber?: number[];
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId,
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte,
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte,
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool,
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, sta [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>,
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey:
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern,
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt,
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt,
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator,
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, ru [...]
/**
* Get Task Instance Try Details
* Get task instance details by try number.
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 6d674b9fa5e..292be91e27b 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
@@ -1002,6 +1002,7 @@ export class DagRunService {
* @param data.orderBy
* @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards
(e.g. `%customer_%`). Regular expressions are **not** supported.
* @param data.triggeringUserNamePattern SQL LIKE expression — use `%` /
`_` wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+ * @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards
(e.g. `%customer_%`). Regular expressions are **not** supported.
* @returns DAGRunCollectionResponse Successful Response
* @throws ApiError
*/
@@ -1040,7 +1041,8 @@ export class DagRunService {
dag_version: data.dagVersion,
order_by: data.orderBy,
run_id_pattern: data.runIdPattern,
- triggering_user_name_pattern: data.triggeringUserNamePattern
+ triggering_user_name_pattern: data.triggeringUserNamePattern,
+ dag_id_pattern: data.dagIdPattern
},
errors: {
401: 'Unauthorized',
@@ -2344,6 +2346,7 @@ export class TaskInstanceService {
* @param data.durationLte
* @param data.durationLt
* @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_`
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+ * @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards
(e.g. `%customer_%`). Regular expressions are **not** supported.
* @param data.state
* @param data.pool
* @param data.queue
@@ -2393,6 +2396,7 @@ export class TaskInstanceService {
duration_lte: data.durationLte,
duration_lt: data.durationLt,
task_display_name_pattern: data.taskDisplayNamePattern,
+ dag_id_pattern: data.dagIdPattern,
state: data.state,
pool: data.pool,
queue: data.queue,
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 e4403b35273..228b26620d4 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
@@ -2245,6 +2245,10 @@ export type ClearDagRunResponse =
TaskInstanceCollectionResponse | DAGRunRespons
export type GetDagRunsData = {
dagId: string;
+ /**
+ * SQL LIKE expression — use `%` / `_` wildcards (e.g. `%customer_%`).
Regular expressions are **not** supported.
+ */
+ dagIdPattern?: string | null;
dagVersion?: Array<(number)>;
endDateGt?: string | null;
endDateGte?: string | null;
@@ -2702,6 +2706,10 @@ export type PatchTaskInstanceByMapIndexResponse =
TaskInstanceCollectionResponse
export type GetTaskInstancesData = {
dagId: string;
+ /**
+ * SQL LIKE expression — use `%` / `_` wildcards (e.g. `%customer_%`).
Regular expressions are **not** supported.
+ */
+ dagIdPattern?: string | null;
dagRunId: string;
durationGt?: number | null;
durationGte?: number | null;
diff --git a/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
index 11c660eef99..4ab1c1d81a6 100644
--- a/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
@@ -48,6 +48,7 @@ import { renderDuration, useAutoRefresh, isStatePending }
from "src/utils";
type DagRunRow = { row: { original: DAGRunResponse } };
const {
+ DAG_ID_PATTERN: DAG_ID_PATTERN_PARAM,
END_DATE: END_DATE_PARAM,
RUN_ID_PATTERN: RUN_ID_PATTERN_PARAM,
RUN_TYPE: RUN_TYPE_PARAM,
@@ -189,6 +190,7 @@ export const DagRuns = () => {
const filteredType = searchParams.get(RUN_TYPE_PARAM);
const filteredRunIdPattern = searchParams.get(RUN_ID_PATTERN_PARAM);
const filteredTriggeringUserNamePattern =
searchParams.get(TRIGGERING_USER_NAME_PATTERN_PARAM);
+ const filteredDagIdPattern = searchParams.get(DAG_ID_PATTERN_PARAM);
const startDate = searchParams.get(START_DATE_PARAM);
const endDate = searchParams.get(END_DATE_PARAM);
@@ -197,6 +199,7 @@ export const DagRuns = () => {
const { data, error, isLoading } = useDagRunServiceGetDagRuns(
{
dagId: dagId ?? "~",
+ dagIdPattern: filteredDagIdPattern ?? undefined,
endDateLte: endDate ?? undefined,
limit: pageSize,
offset: pageIndex * pageSize,
@@ -282,9 +285,36 @@ export const DagRuns = () => {
[pagination, searchParams, setSearchParams, setTableURLState, sorting],
);
+ const handleDagIdPatternChange = useCallback(
+ (value: string) => {
+ if (value === "") {
+ searchParams.delete(DAG_ID_PATTERN_PARAM);
+ } else {
+ searchParams.set(DAG_ID_PATTERN_PARAM, value);
+ }
+ setTableURLState({
+ pagination: { ...pagination, pageIndex: 0 },
+ sorting,
+ });
+ setSearchParams(searchParams);
+ },
+ [pagination, searchParams, setSearchParams, setTableURLState, sorting],
+ );
+
return (
<>
<HStack paddingY="4px">
+ {dagId === undefined && (
+ <Box>
+ <SearchBar
+ defaultValue={filteredDagIdPattern ?? ""}
+ hideAdvanced
+ hotkeyDisabled={true}
+ onChange={handleDagIdPatternChange}
+ placeHolder={translate("dags:search.dags")}
+ />
+ </Box>
+ )}
<Box>
<SearchBar
defaultValue={filteredRunIdPattern ?? ""}
diff --git
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
index 10e494d7d27..091760588f1 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
@@ -44,6 +44,7 @@ import { TaskInstancesFilter } from "./TaskInstancesFilter";
type TaskInstanceRow = { row: { original: TaskInstanceResponse } };
const {
+ DAG_ID_PATTERN: DAG_ID_PATTERN_PARAM,
END_DATE: END_DATE_PARAM,
NAME_PATTERN: NAME_PATTERN_PARAM,
POOL: POOL_PARAM,
@@ -205,6 +206,7 @@ export const TaskInstances = () => {
const startDate = searchParams.get(START_DATE_PARAM);
const endDate = searchParams.get(END_DATE_PARAM);
const pool = searchParams.getAll(POOL_PARAM);
+ const filteredDagIdPattern = searchParams.get(DAG_ID_PATTERN_PARAM);
const hasFilteredState = filteredState.length > 0;
const hasFilteredPool = pool.length > 0;
@@ -217,6 +219,7 @@ export const TaskInstances = () => {
const { data, error, isLoading } = useTaskInstanceServiceGetTaskInstances(
{
dagId: dagId ?? "~",
+ dagIdPattern: filteredDagIdPattern ?? undefined,
dagRunId: runId ?? "~",
endDateLte: endDate ?? undefined,
limit: pagination.pageSize,
diff --git
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
index c7834e4aab2..f7295080b7d 100644
---
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
+++
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
@@ -29,7 +29,11 @@ import { Select } from "src/components/ui";
import { SearchParamsKeys, type SearchParamsKeysType } from
"src/constants/searchParams";
import { taskInstanceStateOptions } from "src/constants/stateOptions";
-const { NAME_PATTERN: NAME_PATTERN_PARAM, STATE: STATE_PARAM }:
SearchParamsKeysType = SearchParamsKeys;
+const {
+ DAG_ID_PATTERN: DAG_ID_PATTERN_PARAM,
+ NAME_PATTERN: NAME_PATTERN_PARAM,
+ STATE: STATE_PARAM,
+}: SearchParamsKeysType = SearchParamsKeys;
export const TaskInstancesFilter = ({
setTaskDisplayNamePattern,
@@ -38,13 +42,14 @@ export const TaskInstancesFilter = ({
readonly setTaskDisplayNamePattern:
React.Dispatch<React.SetStateAction<string | undefined>>;
readonly taskDisplayNamePattern: string | undefined;
}) => {
- const { runId } = useParams();
+ const { dagId, runId } = useParams();
const [searchParams, setSearchParams] = useSearchParams();
const { setTableURLState, tableURLState } = useTableURLState();
const { pagination, sorting } = tableURLState;
const { t: translate } = useTranslation();
const filteredState = searchParams.getAll(STATE_PARAM);
+ const filteredDagIdPattern = searchParams.get(DAG_ID_PATTERN_PARAM);
const hasFilteredState = filteredState.length > 0;
const handleStateChange = useCallback(
@@ -80,8 +85,34 @@ export const TaskInstancesFilter = ({
setSearchParams(searchParams);
};
+ const handleDagIdPatternChange = useCallback(
+ (value: string) => {
+ if (value === "") {
+ searchParams.delete(DAG_ID_PATTERN_PARAM);
+ } else {
+ searchParams.set(DAG_ID_PATTERN_PARAM, value);
+ }
+ setTableURLState({
+ pagination: { ...pagination, pageIndex: 0 },
+ sorting,
+ });
+ setSearchParams(searchParams);
+ },
+ [pagination, searchParams, setSearchParams, setTableURLState, sorting],
+ );
+
return (
<HStack paddingY="4px">
+ {dagId === undefined && (
+ <SearchBar
+ buttonProps={{ disabled: true }}
+ defaultValue={filteredDagIdPattern ?? ""}
+ hideAdvanced
+ hotkeyDisabled={true}
+ onChange={handleDagIdPatternChange}
+ placeHolder={translate("dags:search.dags")}
+ />
+ )}
<SearchBar
buttonProps={{ disabled: true }}
defaultValue={taskDisplayNamePattern ?? ""}
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
index c6069426937..11ef75674be 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
@@ -591,6 +591,22 @@ class TestGetDagRuns:
},
[DAG1_RUN1_ID],
),
+ # Test dag_id_pattern filter
+ ("~", {"dag_id_pattern": "test_dag1"}, [DAG1_RUN1_ID,
DAG1_RUN2_ID]),
+ ("~", {"dag_id_pattern": "test_dag2"}, [DAG2_RUN1_ID,
DAG2_RUN2_ID]),
+ ("~", {"dag_id_pattern": "test_%"}, [DAG1_RUN1_ID, DAG1_RUN2_ID,
DAG2_RUN1_ID, DAG2_RUN2_ID]),
+ ("~", {"dag_id_pattern": "%_dag1"}, [DAG1_RUN1_ID, DAG1_RUN2_ID]),
+ ("~", {"dag_id_pattern": "%_dag2"}, [DAG2_RUN1_ID, DAG2_RUN2_ID]),
+ ("~", {"dag_id_pattern": "test_dag_"}, [DAG1_RUN1_ID,
DAG1_RUN2_ID, DAG2_RUN1_ID, DAG2_RUN2_ID]),
+ ("~", {"dag_id_pattern": "nonexistent"}, []),
+ (
+ "~",
+ {
+ "dag_id_pattern": "test_dag1",
+ "state": DagRunState.SUCCESS.value,
+ },
+ [DAG1_RUN1_ID],
+ ),
# Test dag_version filter
(
DAG1_ID,
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 191276ea74b..0f26235088a 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
@@ -1244,17 +1244,57 @@ class TestGetTaskInstances(TestTaskInstanceEndpoint):
2,
id="test map_index filter",
),
+ pytest.param(
+ "dag_id_pattern_test", # Special marker for multi-DAG test
+ False,
+ "/dags/~/dagRuns/~/taskInstances",
+ {"dag_id_pattern": "example_python_operator"},
+ 9, # Based on test failure - example_python_operator creates
9 task instances
+ id="test dag_id_pattern exact match",
+ ),
+ pytest.param(
+ "dag_id_pattern_test", # Special marker for multi-DAG test
+ False,
+ "/dags/~/dagRuns/~/taskInstances",
+ {"dag_id_pattern": "example_%"},
+ 17, # Based on test failure - both DAGs together create 17
task instances
+ id="test dag_id_pattern wildcard prefix",
+ ),
+ pytest.param(
+ "dag_id_pattern_test", # Special marker for multi-DAG test
+ False,
+ "/dags/~/dagRuns/~/taskInstances",
+ {"dag_id_pattern": "%skip%"},
+ 8, # Based on test failure - example_skip_dag creates 8 task
instances
+ id="test dag_id_pattern wildcard contains",
+ ),
+ pytest.param(
+ "dag_id_pattern_test", # Special marker for multi-DAG test
+ False,
+ "/dags/~/dagRuns/~/taskInstances",
+ {"dag_id_pattern": "nonexistent"},
+ 0,
+ id="test dag_id_pattern no match",
+ ),
],
)
@pytest.mark.usefixtures("make_dag_with_multiple_versions")
def test_should_respond_200(
self, test_client, task_instances, update_extras, url, params,
expected_ti, session
):
- self.create_task_instances(
- session,
- update_extras=update_extras,
- task_instances=task_instances,
- )
+ # Special handling for dag_id_pattern tests that require multiple DAGs
+ if task_instances == "dag_id_pattern_test":
+ # Create task instances for multiple DAGs like the original
test_dag_id_pattern_filter
+ dag1_id = "example_python_operator"
+ dag2_id = "example_skip_dag"
+ self.create_task_instances(session, dag_id=dag1_id)
+ self.create_task_instances(session, dag_id=dag2_id)
+ else:
+ self.create_task_instances(
+ session,
+ update_extras=update_extras,
+ task_instances=task_instances,
+ )
with
mock.patch("airflow.api_fastapi.core_api.datamodels.dag_versions.DagBundlesManager"):
# Mock DagBundlesManager to avoid checking if dags-folder bundle
is configured
response = test_client.get(url, params=params)