From 90ac7a46483d335629328685a1f0a62f0d1031c9 Mon Sep 17 00:00:00 2001 From: abhishekbhakat Date: Wed, 23 Apr 2025 09:00:50 +0000 Subject: [PATCH 1/4] Rename operation IDs for task instance endpoints to include map index for openapi spec validator --- .../api_fastapi/core_api/openapi/v1-rest-api-generated.yaml | 6 +++--- .../api_fastapi/core_api/routes/public/task_instances.py | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-rest-api-generated.yaml b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-rest-api-generated.yaml index c590ea0080bf3..eebc6ccdcb492 100644 --- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-rest-api-generated.yaml +++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-rest-api-generated.yaml @@ -4800,7 +4800,7 @@ paths: - Task Instance summary: Get Task Instance Dependencies description: Get dependencies blocking task from getting scheduled. - operationId: get_task_instance_dependencies + operationId: get_task_instance_dependencies_by_map_index security: - OAuth2PasswordBearer: [] parameters: @@ -5125,7 +5125,7 @@ paths: - Task Instance summary: Patch Task Instance description: Update a task instance. - operationId: patch_task_instance + operationId: patch_task_instance_by_map_index security: - OAuth2PasswordBearer: [] parameters: @@ -5718,7 +5718,7 @@ paths: - Task Instance summary: Patch Task Instance Dry Run description: Update a task instance dry_run mode. - operationId: patch_task_instance_dry_run + operationId: patch_task_instance_dry_run_by_map_index security: - OAuth2PasswordBearer: [] parameters: 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 540e1c49a9100..588beff1297c4 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 @@ -220,11 +220,13 @@ def get_mapped_task_instances( task_instances_prefix + "/{task_id}/dependencies", responses=create_openapi_http_exception_doc([status.HTTP_404_NOT_FOUND]), dependencies=[Depends(requires_access_dag(method="GET", access_entity=DagAccessEntity.TASK_INSTANCE))], + operation_id="get_task_instance_dependencies", ) @task_instances_router.get( task_instances_prefix + "/{task_id}/{map_index}/dependencies", responses=create_openapi_http_exception_doc([status.HTTP_404_NOT_FOUND]), dependencies=[Depends(requires_access_dag(method="GET", access_entity=DagAccessEntity.TASK_INSTANCE))], + operation_id="get_task_instance_dependencies_by_map_index", ) def get_task_instance_dependencies( dag_id: str, @@ -775,6 +777,7 @@ def _patch_ti_validate_request( [status.HTTP_404_NOT_FOUND, status.HTTP_400_BAD_REQUEST], ), dependencies=[Depends(requires_access_dag(method="PUT", access_entity=DagAccessEntity.TASK_INSTANCE))], + operation_id="patch_task_instance_dry_run", ) @task_instances_router.patch( task_instances_prefix + "/{task_id}/{map_index}/dry_run", @@ -782,6 +785,7 @@ def _patch_ti_validate_request( [status.HTTP_404_NOT_FOUND, status.HTTP_400_BAD_REQUEST], ), dependencies=[Depends(requires_access_dag(method="PUT", access_entity=DagAccessEntity.TASK_INSTANCE))], + operation_id="patch_task_instance_dry_run_by_map_index", ) def patch_task_instance_dry_run( dag_id: str, @@ -840,6 +844,7 @@ def patch_task_instance_dry_run( Depends(action_logging()), Depends(requires_access_dag(method="PUT", access_entity=DagAccessEntity.TASK_INSTANCE)), ], + operation_id="patch_task_instance", ) @task_instances_router.patch( task_instances_prefix + "/{task_id}/{map_index}", @@ -850,6 +855,7 @@ def patch_task_instance_dry_run( Depends(action_logging()), Depends(requires_access_dag(method="PUT", access_entity=DagAccessEntity.TASK_INSTANCE)), ], + operation_id="patch_task_instance_by_map_index", ) def patch_task_instance( dag_id: str, From 03b45887a6bed989fb3827a8e6587627d9819701 Mon Sep 17 00:00:00 2001 From: abhishekbhakat Date: Wed, 23 Apr 2025 09:58:54 +0000 Subject: [PATCH 2/4] refactor: Update TaskInstanceService methods and types to use map index for dependencies --- .../airflow/ui/openapi-gen/queries/common.ts | 42 +++++++++---------- .../ui/openapi-gen/queries/ensureQueryData.ts | 13 +++--- .../ui/openapi-gen/queries/prefetch.ts | 13 +++--- .../airflow/ui/openapi-gen/queries/queries.ts | 39 +++++++++-------- .../ui/openapi-gen/queries/suspense.ts | 21 ++++++---- .../ui/openapi-gen/requests/services.gen.ts | 42 +++++++++---------- .../ui/openapi-gen/requests/types.gen.ts | 30 ++++++------- 7 files changed, 106 insertions(+), 94 deletions(-) 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 ec6efb8c19d77..0095494d65f8c 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts @@ -921,16 +921,16 @@ export const UseTaskInstanceServiceGetMappedTaskInstancesKeyFn = ( }, ]), ]; -export type TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse = Awaited< - ReturnType +export type TaskInstanceServiceGetTaskInstanceDependenciesByMapIndexDefaultResponse = Awaited< + ReturnType >; -export type TaskInstanceServiceGetTaskInstanceDependenciesQueryResult< - TData = TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse, +export type TaskInstanceServiceGetTaskInstanceDependenciesByMapIndexQueryResult< + TData = TaskInstanceServiceGetTaskInstanceDependenciesByMapIndexDefaultResponse, TError = unknown, > = UseQueryResult; -export const useTaskInstanceServiceGetTaskInstanceDependenciesKey = - "TaskInstanceServiceGetTaskInstanceDependencies"; -export const UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn = ( +export const useTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKey = + "TaskInstanceServiceGetTaskInstanceDependenciesByMapIndex"; +export const UseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKeyFn = ( { dagId, dagRunId, @@ -944,19 +944,19 @@ export const UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn = ( }, queryKey?: Array, ) => [ - useTaskInstanceServiceGetTaskInstanceDependenciesKey, + useTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKey, ...(queryKey ?? [{ dagId, dagRunId, mapIndex, taskId }]), ]; -export type TaskInstanceServiceGetTaskInstanceDependencies1DefaultResponse = Awaited< - ReturnType +export type TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse = Awaited< + ReturnType >; -export type TaskInstanceServiceGetTaskInstanceDependencies1QueryResult< - TData = TaskInstanceServiceGetTaskInstanceDependencies1DefaultResponse, +export type TaskInstanceServiceGetTaskInstanceDependenciesQueryResult< + TData = TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse, TError = unknown, > = UseQueryResult; -export const useTaskInstanceServiceGetTaskInstanceDependencies1Key = - "TaskInstanceServiceGetTaskInstanceDependencies1"; -export const UseTaskInstanceServiceGetTaskInstanceDependencies1KeyFn = ( +export const useTaskInstanceServiceGetTaskInstanceDependenciesKey = + "TaskInstanceServiceGetTaskInstanceDependencies"; +export const UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn = ( { dagId, dagRunId, @@ -970,7 +970,7 @@ export const UseTaskInstanceServiceGetTaskInstanceDependencies1KeyFn = ( }, queryKey?: Array, ) => [ - useTaskInstanceServiceGetTaskInstanceDependencies1Key, + useTaskInstanceServiceGetTaskInstanceDependenciesKey, ...(queryKey ?? [{ dagId, dagRunId, mapIndex, taskId }]), ]; export type TaskInstanceServiceGetTaskInstanceTriesDefaultResponse = Awaited< @@ -1872,15 +1872,15 @@ export type DagServicePatchDagMutationResult = Awaited >; -export type TaskInstanceServicePatchTaskInstance1MutationResult = Awaited< - ReturnType +export type TaskInstanceServicePatchTaskInstanceByMapIndexMutationResult = Awaited< + ReturnType +>; +export type TaskInstanceServicePatchTaskInstanceDryRunByMapIndexMutationResult = Awaited< + ReturnType >; export type TaskInstanceServicePatchTaskInstanceDryRunMutationResult = Awaited< ReturnType >; -export type TaskInstanceServicePatchTaskInstanceDryRun1MutationResult = Awaited< - ReturnType ->; export type PoolServicePatchPoolMutationResult = Awaited>; export type PoolServiceBulkPoolsMutationResult = Awaited>; export type XcomServiceUpdateXcomEntryMutationResult = Awaited< 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 29323892621a4..3da946b8b9dd2 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts @@ -1263,7 +1263,7 @@ export const ensureUseTaskInstanceServiceGetMappedTaskInstancesData = ( * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const ensureUseTaskInstanceServiceGetTaskInstanceDependenciesData = ( +export const ensureUseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexData = ( queryClient: QueryClient, { dagId, @@ -1278,13 +1278,14 @@ export const ensureUseTaskInstanceServiceGetTaskInstanceDependenciesData = ( }, ) => queryClient.ensureQueryData({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn({ + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKeyFn({ dagId, dagRunId, mapIndex, taskId, }), - queryFn: () => TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }), + queryFn: () => + TaskInstanceService.getTaskInstanceDependenciesByMapIndex({ dagId, dagRunId, mapIndex, taskId }), }); /** * Get Task Instance Dependencies @@ -1297,7 +1298,7 @@ export const ensureUseTaskInstanceServiceGetTaskInstanceDependenciesData = ( * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const ensureUseTaskInstanceServiceGetTaskInstanceDependencies1Data = ( +export const ensureUseTaskInstanceServiceGetTaskInstanceDependenciesData = ( queryClient: QueryClient, { dagId, @@ -1312,13 +1313,13 @@ export const ensureUseTaskInstanceServiceGetTaskInstanceDependencies1Data = ( }, ) => queryClient.ensureQueryData({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependencies1KeyFn({ + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn({ dagId, dagRunId, mapIndex, taskId, }), - queryFn: () => TaskInstanceService.getTaskInstanceDependencies1({ dagId, dagRunId, mapIndex, taskId }), + queryFn: () => TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }), }); /** * Get Task Instance Tries 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 d9328eab70b69..88acd4516f5ca 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts @@ -1263,7 +1263,7 @@ export const prefetchUseTaskInstanceServiceGetMappedTaskInstances = ( * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const prefetchUseTaskInstanceServiceGetTaskInstanceDependencies = ( +export const prefetchUseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndex = ( queryClient: QueryClient, { dagId, @@ -1278,13 +1278,14 @@ export const prefetchUseTaskInstanceServiceGetTaskInstanceDependencies = ( }, ) => queryClient.prefetchQuery({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn({ + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKeyFn({ dagId, dagRunId, mapIndex, taskId, }), - queryFn: () => TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }), + queryFn: () => + TaskInstanceService.getTaskInstanceDependenciesByMapIndex({ dagId, dagRunId, mapIndex, taskId }), }); /** * Get Task Instance Dependencies @@ -1297,7 +1298,7 @@ export const prefetchUseTaskInstanceServiceGetTaskInstanceDependencies = ( * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const prefetchUseTaskInstanceServiceGetTaskInstanceDependencies1 = ( +export const prefetchUseTaskInstanceServiceGetTaskInstanceDependencies = ( queryClient: QueryClient, { dagId, @@ -1312,13 +1313,13 @@ export const prefetchUseTaskInstanceServiceGetTaskInstanceDependencies1 = ( }, ) => queryClient.prefetchQuery({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependencies1KeyFn({ + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn({ dagId, dagRunId, mapIndex, taskId, }), - queryFn: () => TaskInstanceService.getTaskInstanceDependencies1({ dagId, dagRunId, mapIndex, taskId }), + queryFn: () => TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }), }); /** * Get Task Instance Tries 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 c05706beec83f..2423f6ee47b16 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts @@ -1530,8 +1530,8 @@ export const useTaskInstanceServiceGetMappedTaskInstances = < * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServiceGetTaskInstanceDependencies = < - TData = Common.TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse, +export const useTaskInstanceServiceGetTaskInstanceDependenciesByMapIndex = < + TData = Common.TaskInstanceServiceGetTaskInstanceDependenciesByMapIndexDefaultResponse, TError = unknown, TQueryKey extends Array = unknown[], >( @@ -1550,12 +1550,17 @@ export const useTaskInstanceServiceGetTaskInstanceDependencies = < options?: Omit, "queryKey" | "queryFn">, ) => useQuery({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn( + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKeyFn( { dagId, dagRunId, mapIndex, taskId }, queryKey, ), queryFn: () => - TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }) as TData, + TaskInstanceService.getTaskInstanceDependenciesByMapIndex({ + dagId, + dagRunId, + mapIndex, + taskId, + }) as TData, ...options, }); /** @@ -1569,8 +1574,8 @@ export const useTaskInstanceServiceGetTaskInstanceDependencies = < * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServiceGetTaskInstanceDependencies1 = < - TData = Common.TaskInstanceServiceGetTaskInstanceDependencies1DefaultResponse, +export const useTaskInstanceServiceGetTaskInstanceDependencies = < + TData = Common.TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse, TError = unknown, TQueryKey extends Array = unknown[], >( @@ -1589,12 +1594,12 @@ export const useTaskInstanceServiceGetTaskInstanceDependencies1 = < options?: Omit, "queryKey" | "queryFn">, ) => useQuery({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependencies1KeyFn( + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn( { dagId, dagRunId, mapIndex, taskId }, queryKey, ), queryFn: () => - TaskInstanceService.getTaskInstanceDependencies1({ dagId, dagRunId, mapIndex, taskId }) as TData, + TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }) as TData, ...options, }); /** @@ -4062,8 +4067,8 @@ export const useTaskInstanceServicePatchTaskInstance = < * @returns TaskInstanceResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServicePatchTaskInstance1 = < - TData = Common.TaskInstanceServicePatchTaskInstance1MutationResult, +export const useTaskInstanceServicePatchTaskInstanceByMapIndex = < + TData = Common.TaskInstanceServicePatchTaskInstanceByMapIndexMutationResult, TError = unknown, TContext = unknown, >( @@ -4098,7 +4103,7 @@ export const useTaskInstanceServicePatchTaskInstance1 = < TContext >({ mutationFn: ({ dagId, dagRunId, mapIndex, requestBody, taskId, updateMask }) => - TaskInstanceService.patchTaskInstance1({ + TaskInstanceService.patchTaskInstanceByMapIndex({ dagId, dagRunId, mapIndex, @@ -4121,8 +4126,8 @@ export const useTaskInstanceServicePatchTaskInstance1 = < * @returns TaskInstanceCollectionResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServicePatchTaskInstanceDryRun = < - TData = Common.TaskInstanceServicePatchTaskInstanceDryRunMutationResult, +export const useTaskInstanceServicePatchTaskInstanceDryRunByMapIndex = < + TData = Common.TaskInstanceServicePatchTaskInstanceDryRunByMapIndexMutationResult, TError = unknown, TContext = unknown, >( @@ -4157,7 +4162,7 @@ export const useTaskInstanceServicePatchTaskInstanceDryRun = < TContext >({ mutationFn: ({ dagId, dagRunId, mapIndex, requestBody, taskId, updateMask }) => - TaskInstanceService.patchTaskInstanceDryRun({ + TaskInstanceService.patchTaskInstanceDryRunByMapIndex({ dagId, dagRunId, mapIndex, @@ -4180,8 +4185,8 @@ export const useTaskInstanceServicePatchTaskInstanceDryRun = < * @returns TaskInstanceCollectionResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServicePatchTaskInstanceDryRun1 = < - TData = Common.TaskInstanceServicePatchTaskInstanceDryRun1MutationResult, +export const useTaskInstanceServicePatchTaskInstanceDryRun = < + TData = Common.TaskInstanceServicePatchTaskInstanceDryRunMutationResult, TError = unknown, TContext = unknown, >( @@ -4216,7 +4221,7 @@ export const useTaskInstanceServicePatchTaskInstanceDryRun1 = < TContext >({ mutationFn: ({ dagId, dagRunId, mapIndex, requestBody, taskId, updateMask }) => - TaskInstanceService.patchTaskInstanceDryRun1({ + TaskInstanceService.patchTaskInstanceDryRun({ dagId, dagRunId, mapIndex, 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 3180bd87b9338..b7aa517886fcb 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts @@ -1507,8 +1507,8 @@ export const useTaskInstanceServiceGetMappedTaskInstancesSuspense = < * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServiceGetTaskInstanceDependenciesSuspense = < - TData = Common.TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse, +export const useTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexSuspense = < + TData = Common.TaskInstanceServiceGetTaskInstanceDependenciesByMapIndexDefaultResponse, TError = unknown, TQueryKey extends Array = unknown[], >( @@ -1527,12 +1527,17 @@ export const useTaskInstanceServiceGetTaskInstanceDependenciesSuspense = < options?: Omit, "queryKey" | "queryFn">, ) => useSuspenseQuery({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn( + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesByMapIndexKeyFn( { dagId, dagRunId, mapIndex, taskId }, queryKey, ), queryFn: () => - TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }) as TData, + TaskInstanceService.getTaskInstanceDependenciesByMapIndex({ + dagId, + dagRunId, + mapIndex, + taskId, + }) as TData, ...options, }); /** @@ -1546,8 +1551,8 @@ export const useTaskInstanceServiceGetTaskInstanceDependenciesSuspense = < * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ -export const useTaskInstanceServiceGetTaskInstanceDependencies1Suspense = < - TData = Common.TaskInstanceServiceGetTaskInstanceDependencies1DefaultResponse, +export const useTaskInstanceServiceGetTaskInstanceDependenciesSuspense = < + TData = Common.TaskInstanceServiceGetTaskInstanceDependenciesDefaultResponse, TError = unknown, TQueryKey extends Array = unknown[], >( @@ -1566,12 +1571,12 @@ export const useTaskInstanceServiceGetTaskInstanceDependencies1Suspense = < options?: Omit, "queryKey" | "queryFn">, ) => useSuspenseQuery({ - queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependencies1KeyFn( + queryKey: Common.UseTaskInstanceServiceGetTaskInstanceDependenciesKeyFn( { dagId, dagRunId, mapIndex, taskId }, queryKey, ), queryFn: () => - TaskInstanceService.getTaskInstanceDependencies1({ dagId, dagRunId, mapIndex, taskId }) as TData, + TaskInstanceService.getTaskInstanceDependencies({ dagId, dagRunId, mapIndex, taskId }) as TData, ...options, }); /** 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 b9c97a0812834..0b0056ed09f94 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 @@ -118,18 +118,18 @@ import type { PatchTaskInstanceResponse, GetMappedTaskInstancesData, GetMappedTaskInstancesResponse, + GetTaskInstanceDependenciesByMapIndexData, + GetTaskInstanceDependenciesByMapIndexResponse, GetTaskInstanceDependenciesData, GetTaskInstanceDependenciesResponse, - GetTaskInstanceDependencies1Data, - GetTaskInstanceDependencies1Response, GetTaskInstanceTriesData, GetTaskInstanceTriesResponse, GetMappedTaskInstanceTriesData, GetMappedTaskInstanceTriesResponse, GetMappedTaskInstanceData, GetMappedTaskInstanceResponse, - PatchTaskInstance1Data, - PatchTaskInstance1Response, + PatchTaskInstanceByMapIndexData, + PatchTaskInstanceByMapIndexResponse, GetTaskInstancesData, GetTaskInstancesResponse, GetTaskInstancesBatchData, @@ -140,10 +140,10 @@ import type { GetMappedTaskInstanceTryDetailsResponse, PostClearTaskInstancesData, PostClearTaskInstancesResponse, + PatchTaskInstanceDryRunByMapIndexData, + PatchTaskInstanceDryRunByMapIndexResponse, PatchTaskInstanceDryRunData, PatchTaskInstanceDryRunResponse, - PatchTaskInstanceDryRun1Data, - PatchTaskInstanceDryRun1Response, GetLogData, GetLogResponse, GetImportErrorData, @@ -2030,9 +2030,9 @@ export class TaskInstanceService { * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ - public static getTaskInstanceDependencies( - data: GetTaskInstanceDependenciesData, - ): CancelablePromise { + public static getTaskInstanceDependenciesByMapIndex( + data: GetTaskInstanceDependenciesByMapIndexData, + ): CancelablePromise { return __request(OpenAPI, { method: "GET", url: "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/dependencies", @@ -2062,9 +2062,9 @@ export class TaskInstanceService { * @returns TaskDependencyCollectionResponse Successful Response * @throws ApiError */ - public static getTaskInstanceDependencies1( - data: GetTaskInstanceDependencies1Data, - ): CancelablePromise { + public static getTaskInstanceDependencies( + data: GetTaskInstanceDependenciesData, + ): CancelablePromise { return __request(OpenAPI, { method: "GET", url: "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/dependencies", @@ -2195,9 +2195,9 @@ export class TaskInstanceService { * @returns TaskInstanceResponse Successful Response * @throws ApiError */ - public static patchTaskInstance1( - data: PatchTaskInstance1Data, - ): CancelablePromise { + public static patchTaskInstanceByMapIndex( + data: PatchTaskInstanceByMapIndexData, + ): CancelablePromise { return __request(OpenAPI, { method: "PATCH", url: "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}", @@ -2440,9 +2440,9 @@ export class TaskInstanceService { * @returns TaskInstanceCollectionResponse Successful Response * @throws ApiError */ - public static patchTaskInstanceDryRun( - data: PatchTaskInstanceDryRunData, - ): CancelablePromise { + public static patchTaskInstanceDryRunByMapIndex( + data: PatchTaskInstanceDryRunByMapIndexData, + ): CancelablePromise { return __request(OpenAPI, { method: "PATCH", url: "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/dry_run", @@ -2480,9 +2480,9 @@ export class TaskInstanceService { * @returns TaskInstanceCollectionResponse Successful Response * @throws ApiError */ - public static patchTaskInstanceDryRun1( - data: PatchTaskInstanceDryRun1Data, - ): CancelablePromise { + public static patchTaskInstanceDryRun( + data: PatchTaskInstanceDryRunData, + ): CancelablePromise { return __request(OpenAPI, { method: "PATCH", url: "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/dry_run", 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 6f3d2f0147b33..071fb5104a021 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 @@ -2236,23 +2236,23 @@ export type GetMappedTaskInstancesData = { export type GetMappedTaskInstancesResponse = TaskInstanceCollectionResponse; -export type GetTaskInstanceDependenciesData = { +export type GetTaskInstanceDependenciesByMapIndexData = { dagId: string; dagRunId: string; mapIndex: number; taskId: string; }; -export type GetTaskInstanceDependenciesResponse = TaskDependencyCollectionResponse; +export type GetTaskInstanceDependenciesByMapIndexResponse = TaskDependencyCollectionResponse; -export type GetTaskInstanceDependencies1Data = { +export type GetTaskInstanceDependenciesData = { dagId: string; dagRunId: string; mapIndex?: number; taskId: string; }; -export type GetTaskInstanceDependencies1Response = TaskDependencyCollectionResponse; +export type GetTaskInstanceDependenciesResponse = TaskDependencyCollectionResponse; export type GetTaskInstanceTriesData = { dagId: string; @@ -2281,7 +2281,7 @@ export type GetMappedTaskInstanceData = { export type GetMappedTaskInstanceResponse = TaskInstanceResponse; -export type PatchTaskInstance1Data = { +export type PatchTaskInstanceByMapIndexData = { dagId: string; dagRunId: string; mapIndex: number; @@ -2290,7 +2290,7 @@ export type PatchTaskInstance1Data = { updateMask?: Array | null; }; -export type PatchTaskInstance1Response = TaskInstanceResponse; +export type PatchTaskInstanceByMapIndexResponse = TaskInstanceResponse; export type GetTaskInstancesData = { dagId: string; @@ -2356,7 +2356,7 @@ export type PostClearTaskInstancesData = { export type PostClearTaskInstancesResponse = TaskInstanceCollectionResponse; -export type PatchTaskInstanceDryRunData = { +export type PatchTaskInstanceDryRunByMapIndexData = { dagId: string; dagRunId: string; mapIndex: number; @@ -2365,9 +2365,9 @@ export type PatchTaskInstanceDryRunData = { updateMask?: Array | null; }; -export type PatchTaskInstanceDryRunResponse = TaskInstanceCollectionResponse; +export type PatchTaskInstanceDryRunByMapIndexResponse = TaskInstanceCollectionResponse; -export type PatchTaskInstanceDryRun1Data = { +export type PatchTaskInstanceDryRunData = { dagId: string; dagRunId: string; mapIndex?: number; @@ -2376,7 +2376,7 @@ export type PatchTaskInstanceDryRun1Data = { updateMask?: Array | null; }; -export type PatchTaskInstanceDryRun1Response = TaskInstanceCollectionResponse; +export type PatchTaskInstanceDryRunResponse = TaskInstanceCollectionResponse; export type GetLogData = { accept?: "application/json" | "text/plain" | "*/*"; @@ -4258,7 +4258,7 @@ export type $OpenApiTs = { }; "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/dependencies": { get: { - req: GetTaskInstanceDependenciesData; + req: GetTaskInstanceDependenciesByMapIndexData; res: { /** * Successful Response @@ -4285,7 +4285,7 @@ export type $OpenApiTs = { }; "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/dependencies": { get: { - req: GetTaskInstanceDependencies1Data; + req: GetTaskInstanceDependenciesData; res: { /** * Successful Response @@ -4391,7 +4391,7 @@ export type $OpenApiTs = { }; }; patch: { - req: PatchTaskInstance1Data; + req: PatchTaskInstanceByMapIndexData; res: { /** * Successful Response @@ -4561,7 +4561,7 @@ export type $OpenApiTs = { }; "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/dry_run": { patch: { - req: PatchTaskInstanceDryRunData; + req: PatchTaskInstanceDryRunByMapIndexData; res: { /** * Successful Response @@ -4592,7 +4592,7 @@ export type $OpenApiTs = { }; "/api/v2/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/dry_run": { patch: { - req: PatchTaskInstanceDryRun1Data; + req: PatchTaskInstanceDryRunData; res: { /** * Successful Response From baf4bba9015c8a830c7c2e6b210f8411aceb99ec Mon Sep 17 00:00:00 2001 From: abhishekbhakat Date: Wed, 23 Apr 2025 18:35:25 +0000 Subject: [PATCH 3/4] Add OpenAPI validation to FastAPI spec generation script --- .pre-commit-config.yaml | 2 +- .../run_update_fastapi_api_spec.py | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 964ebe4aa099c..f7d40347eb486 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1314,7 +1314,7 @@ repos: pass_filenames: false files: ^airflow-core/src/airflow/api_fastapi/.*\.py$|^airflow-core/src/airflow/api_fastapi/auth/managers/simple/.*\.py$|^providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$ exclude: ^airflow-core/src/airflow/api_fastapi/execution_api/.* - additional_dependencies: ['rich>=12.4.4'] + additional_dependencies: ['rich>=12.4.4', 'openapi-spec-validator>=0.7.1'] - id: ts-compile-format-lint-ui name: Compile / format / lint UI description: TS types generation / ESLint / Prettier new UI files diff --git a/scripts/in_container/run_update_fastapi_api_spec.py b/scripts/in_container/run_update_fastapi_api_spec.py index 235298b48fe7b..371af1a7adedc 100755 --- a/scripts/in_container/run_update_fastapi_api_spec.py +++ b/scripts/in_container/run_update_fastapi_api_spec.py @@ -18,12 +18,14 @@ from __future__ import annotations import os +import sys from pathlib import Path from typing import TYPE_CHECKING import yaml from fastapi.openapi.utils import get_openapi from fastapi.routing import APIRoute +from openapi_spec_validator import validate_spec from airflow.api_fastapi.app import AUTH_MANAGER_FASTAPI_APP_PREFIX, create_app from airflow.api_fastapi.auth.managers.simple import __file__ as SIMPLE_AUTH_MANAGER_PATH @@ -74,13 +76,29 @@ def generate_file(app: FastAPI, file_path: Path, prefix: str = "", only_ui: bool ) +def validate_openapi_file(file_path: Path) -> bool: + with file_path.open() as f: + openapi_schema = yaml.safe_load(f) + try: + validate_spec(openapi_schema) + except Exception as e: + print(f"[ERROR] OpenAPI validation failed for {file_path}: {e}", file=sys.stderr) + return False + return True + + # Generate main application openapi spec # Set the auth manager as SAM. No need to use another one to generate fastapi spec os.environ["AIRFLOW__CORE__AUTH_MANAGER"] = ( "airflow.api_fastapi.auth.managers.simple.simple_auth_manager.SimpleAuthManager" ) generate_file(app=create_app(), file_path=OPENAPI_SPEC_FILE) +if not validate_openapi_file(OPENAPI_SPEC_FILE): + sys.exit(1) + generate_file(app=create_app(), file_path=OPENAPI_UI_SPEC_FILE, only_ui=True) +if not validate_openapi_file(OPENAPI_UI_SPEC_FILE): + sys.exit(1) # Generate simple auth manager openapi spec simple_auth_manager_app = SimpleAuthManager().get_fastapi_app() @@ -90,8 +108,12 @@ def generate_file(app: FastAPI, file_path: Path, prefix: str = "", only_ui: bool file_path=SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE, prefix=AUTH_MANAGER_FASTAPI_APP_PREFIX, ) + if not validate_openapi_file(SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE): + sys.exit(1) # Generate FAB auth manager openapi spec fab_auth_manager_app = FabAuthManager().get_fastapi_app() if fab_auth_manager_app: generate_file(app=fab_auth_manager_app, file_path=FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE) + if not validate_openapi_file(FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE): + sys.exit(1) From 143b554b810b6defa7cb9e0e0326ceea1b2febec Mon Sep 17 00:00:00 2001 From: abhishekbhakat Date: Thu, 24 Apr 2025 03:50:12 +0000 Subject: [PATCH 4/4] refactor: streamline OpenAPI validation process by removing redundant exit checks --- .../in_container/run_update_fastapi_api_spec.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/scripts/in_container/run_update_fastapi_api_spec.py b/scripts/in_container/run_update_fastapi_api_spec.py index 371af1a7adedc..8ef90a46e95bf 100755 --- a/scripts/in_container/run_update_fastapi_api_spec.py +++ b/scripts/in_container/run_update_fastapi_api_spec.py @@ -83,7 +83,7 @@ def validate_openapi_file(file_path: Path) -> bool: validate_spec(openapi_schema) except Exception as e: print(f"[ERROR] OpenAPI validation failed for {file_path}: {e}", file=sys.stderr) - return False + sys.exit(1) return True @@ -93,12 +93,10 @@ def validate_openapi_file(file_path: Path) -> bool: "airflow.api_fastapi.auth.managers.simple.simple_auth_manager.SimpleAuthManager" ) generate_file(app=create_app(), file_path=OPENAPI_SPEC_FILE) -if not validate_openapi_file(OPENAPI_SPEC_FILE): - sys.exit(1) +validate_openapi_file(OPENAPI_SPEC_FILE) generate_file(app=create_app(), file_path=OPENAPI_UI_SPEC_FILE, only_ui=True) -if not validate_openapi_file(OPENAPI_UI_SPEC_FILE): - sys.exit(1) +validate_openapi_file(OPENAPI_UI_SPEC_FILE) # Generate simple auth manager openapi spec simple_auth_manager_app = SimpleAuthManager().get_fastapi_app() @@ -108,12 +106,10 @@ def validate_openapi_file(file_path: Path) -> bool: file_path=SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE, prefix=AUTH_MANAGER_FASTAPI_APP_PREFIX, ) - if not validate_openapi_file(SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE): - sys.exit(1) + validate_openapi_file(SIMPLE_AUTH_MANAGER_OPENAPI_SPEC_FILE) # Generate FAB auth manager openapi spec fab_auth_manager_app = FabAuthManager().get_fastapi_app() if fab_auth_manager_app: generate_file(app=fab_auth_manager_app, file_path=FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE) - if not validate_openapi_file(FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE): - sys.exit(1) + validate_openapi_file(FAB_AUTH_MANAGER_OPENAPI_SPEC_FILE)