This is an automated email from the ASF dual-hosted git repository.

jscheffl 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 7c31bb5a9a4 AIP-86: Add `deadline` to `DagResponse` (#51698)
7c31bb5a9a4 is described below

commit 7c31bb5a9a4ae92840583ab34b2956c427d5f59a
Author: Aryan Khurana <[email protected]>
AuthorDate: Sun Jun 15 09:12:16 2025 -0400

    AIP-86: Add `deadline` to `DagResponse` (#51698)
    
    * add deadline to DagResponse
    
    * add deadline to DagResponse
    
    * fix: CI test fails by adding deadline field to get_dagbag_dag_details() 
func
    
    ---------
    
    Co-authored-by: kalyanr <[email protected]>
---
 .../api_fastapi/core_api/datamodels/dags.py        |  2 +
 .../api_fastapi/core_api/datamodels/deadline.py    | 30 ++++++++
 .../api_fastapi/core_api/openapi/_private_ui.yaml  | 33 +++++++++
 .../core_api/openapi/v2-rest-api-generated.yaml    | 41 +++++++++++
 .../src/airflow/cli/commands/dag_command.py        |  1 +
 .../airflow/ui/openapi-gen/requests/schemas.gen.ts | 79 ++++++++++++++++++++++
 .../airflow/ui/openapi-gen/requests/types.gen.ts   | 15 ++++
 .../airflow/ui/src/pages/DagsList/DagCard.test.tsx |  1 +
 .../core_api/routes/public/test_dags.py            |  2 +
 .../src/airflowctl/api/datamodels/generated.py     | 13 ++++
 10 files changed, 217 insertions(+)

diff --git a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py 
b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py
index c7d3c5b4b90..1801d03df78 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/dags.py
@@ -35,6 +35,7 @@ from pydantic import (
 from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel
 from airflow.api_fastapi.core_api.datamodels.dag_tags import DagTagResponse
 from airflow.api_fastapi.core_api.datamodels.dag_versions import 
DagVersionResponse
+from airflow.api_fastapi.core_api.datamodels.deadline import 
DeadlineAlertResponse
 from airflow.configuration import conf
 from airflow.models.dag_version import DagVersion
 
@@ -67,6 +68,7 @@ class DAGResponse(BaseModel):
     relative_fileloc: str | None
     fileloc: str
     description: str | None
+    deadline: list[DeadlineAlertResponse] | None
     timetable_summary: str | None
     timetable_description: str | None
     tags: list[DagTagResponse]
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/deadline.py 
b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/deadline.py
new file mode 100644
index 00000000000..704c218208e
--- /dev/null
+++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/deadline.py
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+from datetime import timedelta
+
+from airflow.api_fastapi.core_api.base import BaseModel
+
+
+class DeadlineAlertResponse(BaseModel):
+    """Deadline alert serializer for responses."""
+
+    reference: str
+    interval: timedelta
+    callback: str
+    callback_kwargs: dict | None = None
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 920263e8f20..660580cbe84 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
@@ -1090,6 +1090,13 @@ components:
           - type: string
           - type: 'null'
           title: Description
+        deadline:
+          anyOf:
+          - items:
+              $ref: '#/components/schemas/DeadlineAlertResponse'
+            type: array
+          - type: 'null'
+          title: Deadline
         timetable_summary:
           anyOf:
           - type: string
@@ -1180,6 +1187,7 @@ components:
       - relative_fileloc
       - fileloc
       - description
+      - deadline
       - timetable_summary
       - timetable_description
       - tags
@@ -1319,6 +1327,31 @@ components:
       - queued_dag_count
       title: DashboardDagStatsResponse
       description: Dashboard DAG Stats serializer for responses.
+    DeadlineAlertResponse:
+      properties:
+        reference:
+          type: string
+          title: Reference
+        interval:
+          type: string
+          format: duration
+          title: Interval
+        callback:
+          type: string
+          title: Callback
+        callback_kwargs:
+          anyOf:
+          - additionalProperties: true
+            type: object
+          - type: 'null'
+          title: Callback Kwargs
+      type: object
+      required:
+      - reference
+      - interval
+      - callback
+      title: DeadlineAlertResponse
+      description: Deadline alert serializer for responses.
     EdgeResponse:
       properties:
         source_id:
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 582807ad74b..12b0edf60ec 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
@@ -8171,6 +8171,13 @@ components:
           - type: string
           - type: 'null'
           title: Description
+        deadline:
+          anyOf:
+          - items:
+              $ref: '#/components/schemas/DeadlineAlertResponse'
+            type: array
+          - type: 'null'
+          title: Deadline
         timetable_summary:
           anyOf:
           - type: string
@@ -8338,6 +8345,7 @@ components:
       - relative_fileloc
       - fileloc
       - description
+      - deadline
       - timetable_summary
       - timetable_description
       - tags
@@ -8429,6 +8437,13 @@ components:
           - type: string
           - type: 'null'
           title: Description
+        deadline:
+          anyOf:
+          - items:
+              $ref: '#/components/schemas/DeadlineAlertResponse'
+            type: array
+          - type: 'null'
+          title: Deadline
         timetable_summary:
           anyOf:
           - type: string
@@ -8508,6 +8523,7 @@ components:
       - relative_fileloc
       - fileloc
       - description
+      - deadline
       - timetable_summary
       - timetable_description
       - tags
@@ -9120,6 +9136,31 @@ components:
         This is the set of allowable values for the ``warning_type`` field
 
         in the DagWarning model.'
+    DeadlineAlertResponse:
+      properties:
+        reference:
+          type: string
+          title: Reference
+        interval:
+          type: string
+          format: duration
+          title: Interval
+        callback:
+          type: string
+          title: Callback
+        callback_kwargs:
+          anyOf:
+          - additionalProperties: true
+            type: object
+          - type: 'null'
+          title: Callback Kwargs
+      type: object
+      required:
+      - reference
+      - interval
+      - callback
+      title: DeadlineAlertResponse
+      description: Deadline alert serializer for responses.
     DryRunBackfillCollectionResponse:
       properties:
         backfills:
diff --git a/airflow-core/src/airflow/cli/commands/dag_command.py 
b/airflow-core/src/airflow/cli/commands/dag_command.py
index 3fd3f29f8f4..20b98bb6de1 100644
--- a/airflow-core/src/airflow/cli/commands/dag_command.py
+++ b/airflow-core/src/airflow/cli/commands/dag_command.py
@@ -252,6 +252,7 @@ def _get_dagbag_dag_details(dag: DAG) -> dict:
         "next_dagrun_data_interval_end": None,
         "next_dagrun_logical_date": None,
         "next_dagrun_run_after": None,
+        "deadline": None,
     }
 
 
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts 
b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
index 56bb0fe4f1b..0521c2b9f1f 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
@@ -1677,6 +1677,20 @@ export const $DAGDetailsResponse = {
       ],
       title: "Description",
     },
+    deadline: {
+      anyOf: [
+        {
+          items: {
+            $ref: "#/components/schemas/DeadlineAlertResponse",
+          },
+          type: "array",
+        },
+        {
+          type: "null",
+        },
+      ],
+      title: "Deadline",
+    },
     timetable_summary: {
       anyOf: [
         {
@@ -1979,6 +1993,7 @@ export const $DAGDetailsResponse = {
     "relative_fileloc",
     "fileloc",
     "description",
+    "deadline",
     "timetable_summary",
     "timetable_description",
     "tags",
@@ -2117,6 +2132,20 @@ export const $DAGResponse = {
       ],
       title: "Description",
     },
+    deadline: {
+      anyOf: [
+        {
+          items: {
+            $ref: "#/components/schemas/DeadlineAlertResponse",
+          },
+          type: "array",
+        },
+        {
+          type: "null",
+        },
+      ],
+      title: "Deadline",
+    },
     timetable_summary: {
       anyOf: [
         {
@@ -2248,6 +2277,7 @@ export const $DAGResponse = {
     "relative_fileloc",
     "fileloc",
     "description",
+    "deadline",
     "timetable_summary",
     "timetable_description",
     "tags",
@@ -3150,6 +3180,40 @@ This is the set of allowable values for the 
\`\`warning_type\`\` field
 in the DagWarning model.`,
 } as const;
 
+export const $DeadlineAlertResponse = {
+  properties: {
+    reference: {
+      type: "string",
+      title: "Reference",
+    },
+    interval: {
+      type: "string",
+      format: "duration",
+      title: "Interval",
+    },
+    callback: {
+      type: "string",
+      title: "Callback",
+    },
+    callback_kwargs: {
+      anyOf: [
+        {
+          additionalProperties: true,
+          type: "object",
+        },
+        {
+          type: "null",
+        },
+      ],
+      title: "Callback Kwargs",
+    },
+  },
+  type: "object",
+  required: ["reference", "interval", "callback"],
+  title: "DeadlineAlertResponse",
+  description: "Deadline alert serializer for responses.",
+} as const;
+
 export const $DryRunBackfillCollectionResponse = {
   properties: {
     backfills: {
@@ -6608,6 +6672,20 @@ export const $DAGWithLatestDagRunsResponse = {
       ],
       title: "Description",
     },
+    deadline: {
+      anyOf: [
+        {
+          items: {
+            $ref: "#/components/schemas/DeadlineAlertResponse",
+          },
+          type: "array",
+        },
+        {
+          type: "null",
+        },
+      ],
+      title: "Deadline",
+    },
     timetable_summary: {
       anyOf: [
         {
@@ -6758,6 +6836,7 @@ export const $DAGWithLatestDagRunsResponse = {
     "relative_fileloc",
     "fileloc",
     "description",
+    "deadline",
     "timetable_summary",
     "timetable_description",
     "tags",
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 79a67a37f8d..d18d17afd5e 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
@@ -497,6 +497,7 @@ export type DAGDetailsResponse = {
   relative_fileloc: string | null;
   fileloc: string;
   description: string | null;
+  deadline: Array<DeadlineAlertResponse> | null;
   timetable_summary: string | null;
   timetable_description: string | null;
   tags: Array<DagTagResponse>;
@@ -568,6 +569,7 @@ export type DAGResponse = {
   relative_fileloc: string | null;
   fileloc: string;
   description: string | null;
+  deadline: Array<DeadlineAlertResponse> | null;
   timetable_summary: string | null;
   timetable_description: string | null;
   tags: Array<DagTagResponse>;
@@ -818,6 +820,18 @@ export type DagVersionResponse = {
  */
 export type DagWarningType = "asset conflict" | "non-existent pool";
 
+/**
+ * Deadline alert serializer for responses.
+ */
+export type DeadlineAlertResponse = {
+  reference: string;
+  interval: string;
+  callback: string;
+  callback_kwargs?: {
+    [key: string]: unknown;
+  } | null;
+};
+
 /**
  * Backfill collection serializer for responses in dry-run mode.
  */
@@ -1654,6 +1668,7 @@ export type DAGWithLatestDagRunsResponse = {
   relative_fileloc: string | null;
   fileloc: string;
   description: string | null;
+  deadline: Array<DeadlineAlertResponse> | null;
   timetable_summary: string | null;
   timetable_description: string | null;
   tags: Array<DagTagResponse>;
diff --git a/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx 
b/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx
index f62769c3cab..d95e4466be5 100644
--- a/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/DagsList/DagCard.test.tsx
@@ -33,6 +33,7 @@ const mockDag = {
   bundle_version: "1",
   dag_display_name: "nested_groups",
   dag_id: "nested_groups",
+  deadline: null,
   description: null,
   file_token: 
"Ii9maWxlcy9kYWdzL25lc3RlZF90YXNrX2dyb3Vwcy5weSI.G3EkdxmDUDQsVb7AIZww1TSGlFE",
   fileloc: "/files/dags/nested_task_groups.py",
diff --git 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
index ebf17f55885..4af37668482 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
@@ -439,6 +439,7 @@ class TestDagDetails(TestDagEndpoint):
             },
             "description": None,
             "doc_md": "details",
+            "deadline": None,
             "end_date": None,
             "fileloc": __file__,
             "file_token": file_token,
@@ -527,6 +528,7 @@ class TestGetDag(TestDagEndpoint):
             "is_stale": False,
             "owners": ["airflow"],
             "timetable_summary": None,
+            "deadline": None,
             "tags": [],
             "has_task_concurrency_limits": True,
             "next_dagrun_data_interval_start": None,
diff --git a/airflow-ctl/src/airflowctl/api/datamodels/generated.py 
b/airflow-ctl/src/airflowctl/api/datamodels/generated.py
index 330b2a91f72..4d082b884f7 100644
--- a/airflow-ctl/src/airflowctl/api/datamodels/generated.py
+++ b/airflow-ctl/src/airflowctl/api/datamodels/generated.py
@@ -468,6 +468,17 @@ class DagWarningType(str, Enum):
     NON_EXISTENT_POOL = "non-existent pool"
 
 
+class DeadlineAlertResponse(BaseModel):
+    """
+    Deadline alert serializer for responses.
+    """
+
+    reference: Annotated[str, Field(title="Reference")]
+    interval: Annotated[timedelta, Field(title="Interval")]
+    callback: Annotated[str, Field(title="Callback")]
+    callback_kwargs: Annotated[dict[str, Any] | None, Field(title="Callback 
Kwargs")] = None
+
+
 class DryRunBackfillResponse(BaseModel):
     """
     Backfill serializer for responses in dry-run mode.
@@ -1215,6 +1226,7 @@ class DAGDetailsResponse(BaseModel):
     relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")] = 
None
     fileloc: Annotated[str, Field(title="Fileloc")]
     description: Annotated[str | None, Field(title="Description")] = None
+    deadline: Annotated[list[DeadlineAlertResponse] | None, 
Field(title="Deadline")] = None
     timetable_summary: Annotated[str | None, Field(title="Timetable Summary")] 
= None
     timetable_description: Annotated[str | None, Field(title="Timetable 
Description")] = None
     tags: Annotated[list[DagTagResponse], Field(title="Tags")]
@@ -1271,6 +1283,7 @@ class DAGResponse(BaseModel):
     relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")] = 
None
     fileloc: Annotated[str, Field(title="Fileloc")]
     description: Annotated[str | None, Field(title="Description")] = None
+    deadline: Annotated[list[DeadlineAlertResponse] | None, 
Field(title="Deadline")] = None
     timetable_summary: Annotated[str | None, Field(title="Timetable Summary")] 
= None
     timetable_description: Annotated[str | None, Field(title="Timetable 
Description")] = None
     tags: Annotated[list[DagTagResponse], Field(title="Tags")]

Reply via email to