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

pierrejeambrun 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 cb4590a7486 Enforce to forbid extra fields under execution_api (#44986)
cb4590a7486 is described below

commit cb4590a748659d0c1e48aa0c9b80da5f9f2a66f9
Author: jj.lee <[email protected]>
AuthorDate: Wed Feb 5 21:53:41 2025 +0900

    Enforce to forbid extra fields under execution_api (#44986)
    
    * extra forbidden
    
    * test
    
    * gen_file
    
    * fix gen_file
    
    * rm clear_db_*
    
    * rm testcase
    
    * rm testcase # 2
---
 .../api_fastapi/execution_api/datamodels/asset.py  |  4 +--
 .../execution_api/datamodels/taskinstance.py       |  2 +-
 .../src/airflow/sdk/api/datamodels/_generated.py   | 34 ++++++++++++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/airflow/api_fastapi/execution_api/datamodels/asset.py 
b/airflow/api_fastapi/execution_api/datamodels/asset.py
index 29b260c291c..28d352aa231 100644
--- a/airflow/api_fastapi/execution_api/datamodels/asset.py
+++ b/airflow/api_fastapi/execution_api/datamodels/asset.py
@@ -17,7 +17,7 @@
 
 from __future__ import annotations
 
-from airflow.api_fastapi.core_api.base import BaseModel
+from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel
 
 
 class AssetResponse(BaseModel):
@@ -36,7 +36,7 @@ class AssetAliasResponse(BaseModel):
     group: str
 
 
-class AssetProfile(BaseModel):
+class AssetProfile(StrictBaseModel):
     """
     Profile of an Asset.
 
diff --git a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py 
b/airflow/api_fastapi/execution_api/datamodels/taskinstance.py
index c3ec79c9ddd..a4e3b1ff25f 100644
--- a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py
+++ b/airflow/api_fastapi/execution_api/datamodels/taskinstance.py
@@ -252,7 +252,7 @@ class PrevSuccessfulDagRunResponse(BaseModel):
     end_date: UtcDateTime | None = None
 
 
-class TIRuntimeCheckPayload(BaseModel):
+class TIRuntimeCheckPayload(StrictBaseModel):
     """Payload for performing Runtime checks on the TaskInstance model as 
requested by the SDK."""
 
     inlets: list[AssetProfile] | None = None
diff --git a/task_sdk/src/airflow/sdk/api/datamodels/_generated.py 
b/task_sdk/src/airflow/sdk/api/datamodels/_generated.py
index 1d6d0eb4156..8395b072f9b 100644
--- a/task_sdk/src/airflow/sdk/api/datamodels/_generated.py
+++ b/task_sdk/src/airflow/sdk/api/datamodels/_generated.py
@@ -38,6 +38,9 @@ class AssetProfile(BaseModel):
     AssetUriRef will have uri and asset_type defined.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     name: Annotated[str | None, Field(title="Name")] = None
     uri: Annotated[str | None, Field(title="Uri")] = None
     asset_type: Annotated[str, Field(title="Asset Type")]
@@ -110,6 +113,9 @@ class TIDeferredStatePayload(BaseModel):
     Schema for updating TaskInstance to a deferred state.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     state: Annotated[Literal["deferred"] | None, Field(title="State")] = 
"deferred"
     classpath: Annotated[str, Field(title="Classpath")]
     trigger_kwargs: Annotated[dict[str, Any] | None, Field(title="Trigger 
Kwargs")] = None
@@ -122,6 +128,9 @@ class TIEnterRunningPayload(BaseModel):
     Schema for updating TaskInstance to 'RUNNING' state with minimal required 
fields.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     state: Annotated[Literal["running"] | None, Field(title="State")] = 
"running"
     hostname: Annotated[str, Field(title="Hostname")]
     unixname: Annotated[str, Field(title="Unixname")]
@@ -134,6 +143,9 @@ class TIHeartbeatInfo(BaseModel):
     Schema for TaskInstance heartbeat endpoint.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     hostname: Annotated[str, Field(title="Hostname")]
     pid: Annotated[int, Field(title="Pid")]
 
@@ -143,6 +155,9 @@ class TIRescheduleStatePayload(BaseModel):
     Schema for updating TaskInstance to a up_for_reschedule state.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     state: Annotated[Literal["up_for_reschedule"] | None, 
Field(title="State")] = "up_for_reschedule"
     reschedule_date: Annotated[datetime, Field(title="Reschedule Date")]
     end_date: Annotated[datetime, Field(title="End Date")]
@@ -153,6 +168,9 @@ class TIRuntimeCheckPayload(BaseModel):
     Payload for performing Runtime checks on the TaskInstance model as 
requested by the SDK.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     inlets: Annotated[list[AssetProfile] | None, Field(title="Inlets")] = None
     outlets: Annotated[list[AssetProfile] | None, Field(title="Outlets")] = 
None
 
@@ -162,6 +180,9 @@ class TISuccessStatePayload(BaseModel):
     Schema for updating TaskInstance to success state.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     state: Annotated[Literal["success"] | None, Field(title="State")] = 
"success"
     end_date: Annotated[datetime, Field(title="End Date")]
     task_outlets: Annotated[list[AssetProfile] | None, Field(title="Task 
Outlets")] = None
@@ -173,6 +194,9 @@ class TITargetStatePayload(BaseModel):
     Schema for updating TaskInstance to a target state, excluding terminal and 
running states.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     state: IntermediateTIState
 
 
@@ -234,6 +258,9 @@ class TaskInstance(BaseModel):
     Schema for TaskInstance model with minimal required fields needed for 
Runtime.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     id: Annotated[UUID, Field(title="Id")]
     task_id: Annotated[str, Field(title="Task Id")]
     dag_id: Annotated[str, Field(title="Dag Id")]
@@ -248,6 +275,9 @@ class DagRun(BaseModel):
     Schema for DagRun model with minimal required fields needed for Runtime.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
     dag_id: Annotated[str, Field(title="Dag Id")]
     run_id: Annotated[str, Field(title="Run Id")]
     logical_date: Annotated[datetime, Field(title="Logical Date")]
@@ -280,5 +310,9 @@ class TITerminalStatePayload(BaseModel):
     Schema for updating TaskInstance to a terminal state except SUCCESS state.
     """
 
+    model_config = ConfigDict(
+        extra="forbid",
+    )
+
     state: TerminalTIState
     end_date: Annotated[datetime, Field(title="End Date")]

Reply via email to