From aea042288208b221b5857391006464695c8bc277 Mon Sep 17 00:00:00 2001 From: kalyanr Date: Wed, 29 Jan 2025 22:05:43 +0530 Subject: [PATCH 1/6] use extra=forbid --- airflow/api_fastapi/core_api/base.py | 10 ++ .../core_api/openapi/v1-generated.yaml | 103 ++++++++++++++++++ .../managers/simple/openapi/v1-generated.yaml | 2 + .../ui/openapi-gen/requests/schemas.gen.ts | 103 ++++++++++++++++++ 4 files changed, 218 insertions(+) diff --git a/airflow/api_fastapi/core_api/base.py b/airflow/api_fastapi/core_api/base.py index 52df0e6fea5de..977cbe4ea6684 100644 --- a/airflow/api_fastapi/core_api/base.py +++ b/airflow/api_fastapi/core_api/base.py @@ -26,4 +26,14 @@ class BaseModel(PydanticBaseModel): :meta private: """ + model_config = ConfigDict(from_attributes=True, populate_by_name=True, extra="forbid") + + +class ResponseBaseModel(BaseModel): + """ + Base pydantic model for REST API. + + :meta private: + """ + model_config = ConfigDict(from_attributes=True) diff --git a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml index 62df27b568ecd..535e050dfce24 100644 --- a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml +++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml @@ -6566,6 +6566,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - asset_aliases @@ -6583,6 +6584,7 @@ components: group: type: string title: Group + additionalProperties: false type: object required: - id @@ -6600,6 +6602,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - assets @@ -6616,6 +6619,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - asset_events @@ -6677,6 +6681,7 @@ components: type: string format: date-time title: Timestamp + additionalProperties: false type: object required: - id @@ -6728,6 +6733,7 @@ components: $ref: '#/components/schemas/AssetAliasResponse' type: array title: Aliases + additionalProperties: false type: object required: - id @@ -6751,6 +6757,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - backfills @@ -6785,6 +6792,7 @@ components: type: integer title: Max Active Runs default: 10 + additionalProperties: false type: object required: - dag_id @@ -6833,6 +6841,7 @@ components: type: string format: date-time title: Updated At + additionalProperties: false type: object required: - id @@ -6855,6 +6864,7 @@ components: - type: string - type: 'null' title: Status + additionalProperties: false type: object required: - status @@ -6900,6 +6910,7 @@ components: description: A list of errors encountered during the operation, each containing details about the issue. default: [] + additionalProperties: false type: object title: BulkActionResponse description: 'Serializer for individual bulk action responses. @@ -6922,6 +6933,7 @@ components: - $ref: '#/components/schemas/BulkDeleteAction_ConnectionBody_' type: array title: Actions + additionalProperties: false type: object required: - actions @@ -6936,6 +6948,7 @@ components: - $ref: '#/components/schemas/BulkDeleteAction_PoolBody_' type: array title: Actions + additionalProperties: false type: object required: - actions @@ -6950,6 +6963,7 @@ components: - $ref: '#/components/schemas/BulkDeleteAction_VariableBody_' type: array title: Actions + additionalProperties: false type: object required: - actions @@ -6968,6 +6982,7 @@ components: action_on_existence: $ref: '#/components/schemas/BulkActionOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -6987,6 +7002,7 @@ components: action_on_existence: $ref: '#/components/schemas/BulkActionOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7006,6 +7022,7 @@ components: action_on_existence: $ref: '#/components/schemas/BulkActionOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7025,6 +7042,7 @@ components: action_on_non_existence: $ref: '#/components/schemas/BulkActionNotOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7044,6 +7062,7 @@ components: action_on_non_existence: $ref: '#/components/schemas/BulkActionNotOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7063,6 +7082,7 @@ components: action_on_non_existence: $ref: '#/components/schemas/BulkActionNotOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7088,6 +7108,7 @@ components: - type: 'null' description: Details of the bulk delete operation, including successful keys and errors. + additionalProperties: false type: object title: BulkResponse description: 'Serializer for responses to bulk entity operations. @@ -7115,6 +7136,7 @@ components: action_on_non_existence: $ref: '#/components/schemas/BulkActionNotOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7134,6 +7156,7 @@ components: action_on_non_existence: $ref: '#/components/schemas/BulkActionNotOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7153,6 +7176,7 @@ components: action_on_non_existence: $ref: '#/components/schemas/BulkActionNotOnExistence' default: fail + additionalProperties: false type: object required: - action @@ -7223,6 +7247,7 @@ components: type: boolean title: Include Past default: false + additionalProperties: false type: object title: ClearTaskInstancesBody description: Request body for Clear Task Instances endpoint. @@ -7233,6 +7258,7 @@ components: $ref: '#/components/schemas/ConfigSection' type: array title: Sections + additionalProperties: false type: object required: - sections @@ -7253,6 +7279,7 @@ components: maxItems: 2 minItems: 2 title: Value + additionalProperties: false type: object required: - key @@ -7355,6 +7382,7 @@ components: $ref: '#/components/schemas/ConfigOption' type: array title: Options + additionalProperties: false type: object required: - name @@ -7406,6 +7434,7 @@ components: - type: string - type: 'null' title: Extra + additionalProperties: false type: object required: - connection_id @@ -7422,6 +7451,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - connections @@ -7471,6 +7501,7 @@ components: - type: string - type: 'null' title: Extra + additionalProperties: false type: object required: - connection_id @@ -7492,6 +7523,7 @@ components: message: type: string title: Message + additionalProperties: false type: object required: - status @@ -7522,6 +7554,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - dags @@ -7700,6 +7733,7 @@ components: title: Concurrency description: Return max_active_tasks as concurrency. readOnly: true + additionalProperties: false type: object required: - dag_id @@ -7745,6 +7779,7 @@ components: is_paused: type: boolean title: Is Paused + additionalProperties: false type: object required: - is_paused @@ -7855,6 +7890,7 @@ components: title: File Token description: Return file token. readOnly: true + additionalProperties: false type: object required: - dag_id @@ -7892,6 +7928,7 @@ components: type: boolean title: Only Failed default: false + additionalProperties: false type: object title: DAGRunClearBody description: DAG Run serializer for clear endpoint body. @@ -7905,6 +7942,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - dag_runs @@ -7923,6 +7961,7 @@ components: maxLength: 1000 - type: 'null' title: Note + additionalProperties: false type: object title: DAGRunPatchBody description: DAG Run Serializer for PATCH requests. @@ -8001,6 +8040,7 @@ components: - type: string - type: 'null' title: Note + additionalProperties: false type: object required: - dag_run_id @@ -8034,6 +8074,7 @@ components: failed: type: integer title: Failed + additionalProperties: false type: object required: - queued @@ -8056,6 +8097,7 @@ components: asset_triggered: type: integer title: Asset Triggered + additionalProperties: false type: object required: - backfill @@ -8133,6 +8175,7 @@ components: format: date-time - type: 'null' title: End Date Lte + additionalProperties: false type: object title: DAGRunsBatchBody description: List DAG Runs body for batch endpoint. @@ -8151,6 +8194,7 @@ components: - type: integer - type: 'null' title: Version Number + additionalProperties: false type: object required: - content @@ -8168,6 +8212,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - tags @@ -8184,6 +8229,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - dag_warnings @@ -8204,6 +8250,7 @@ components: type: string format: date-time title: Timestamp + additionalProperties: false type: object required: - dag_id @@ -8222,6 +8269,7 @@ components: $ref: '#/components/schemas/DAGWithLatestDagRunsResponse' type: array title: Dags + additionalProperties: false type: object required: - total_entries @@ -8338,6 +8386,7 @@ components: title: File Token description: Return file token. readOnly: true + additionalProperties: false type: object required: - dag_id @@ -8378,6 +8427,7 @@ components: - type: string - type: 'null' title: Latest Dag Processor Heartbeat + additionalProperties: false type: object required: - status @@ -8417,6 +8467,7 @@ components: type: string format: date-time title: Data Interval End + additionalProperties: false type: object required: - run_id @@ -8480,6 +8531,7 @@ components: type: string format: date-time title: Updated At + additionalProperties: false type: object required: - dag_id @@ -8497,6 +8549,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - dags @@ -8513,6 +8566,7 @@ components: $ref: '#/components/schemas/DagStatsStateResponse' type: array title: Stats + additionalProperties: false type: object required: - dag_id @@ -8526,6 +8580,7 @@ components: count: type: integer title: Count + additionalProperties: false type: object required: - state @@ -8540,6 +8595,7 @@ components: dag_id: type: string title: Dag Id + additionalProperties: false type: object required: - name @@ -8568,6 +8624,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - backfills @@ -8580,6 +8637,7 @@ components: type: string format: date-time title: Logical Date + additionalProperties: false type: object required: - logical_date @@ -8608,6 +8666,7 @@ components: - type: boolean - type: 'null' title: Is Source Asset + additionalProperties: false type: object required: - source_id @@ -8624,6 +8683,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - event_logs @@ -8683,6 +8743,7 @@ components: - type: string - type: 'null' title: Extra + additionalProperties: false type: object required: - event_log_id @@ -8898,6 +8959,7 @@ components: anyOf: - $ref: '#/components/schemas/DagProcessorInfoResponse' - type: 'null' + additionalProperties: false type: object required: - metadatabase @@ -8913,6 +8975,7 @@ components: $ref: '#/components/schemas/DAGRunStates' task_instance_states: $ref: '#/components/schemas/TaskInstanceStateCount' + additionalProperties: false type: object required: - dag_run_types @@ -8930,6 +8993,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - import_errors @@ -8954,6 +9018,7 @@ components: stack_trace: type: string title: Stack Trace + additionalProperties: false type: object required: - import_error_id @@ -8973,6 +9038,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - jobs @@ -9033,6 +9099,7 @@ components: - type: string - type: 'null' title: Unixname + additionalProperties: false type: object required: - id @@ -9105,6 +9172,7 @@ components: - and-gate - type: 'null' title: Asset Condition Type + additionalProperties: false type: object required: - id @@ -9140,6 +9208,7 @@ components: type: boolean title: Include Past default: false + additionalProperties: false type: object title: PatchTaskInstanceBody description: Request body for Clear Task Instances endpoint. @@ -9153,6 +9222,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - plugins @@ -9212,6 +9282,7 @@ components: type: string type: array title: Timetables + additionalProperties: false type: object required: - name @@ -9245,6 +9316,7 @@ components: type: boolean title: Include Deferred default: false + additionalProperties: false type: object required: - name @@ -9261,6 +9333,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - pools @@ -9289,6 +9362,7 @@ components: - type: boolean - type: 'null' title: Include Deferred + additionalProperties: false type: object title: PoolPatchBody description: Pool serializer for patch bodies. @@ -9326,6 +9400,7 @@ components: deferred_slots: type: integer title: Deferred Slots + additionalProperties: false type: object required: - name @@ -9350,6 +9425,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - providers @@ -9367,6 +9443,7 @@ components: version: type: string title: Version + additionalProperties: false type: object required: - package_name @@ -9384,6 +9461,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - queued_events @@ -9402,6 +9480,7 @@ components: type: string format: date-time title: Created At + additionalProperties: false type: object required: - dag_id @@ -9432,6 +9511,7 @@ components: - type: string - type: 'null' title: Latest Scheduler Heartbeat + additionalProperties: false type: object required: - status @@ -9458,6 +9538,7 @@ components: - RL - TB title: Arrange + additionalProperties: false type: object required: - edges @@ -9475,6 +9556,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - tasks @@ -9488,6 +9570,7 @@ components: $ref: '#/components/schemas/TaskDependencyResponse' type: array title: Dependencies + additionalProperties: false type: object required: - dependencies @@ -9501,6 +9584,7 @@ components: reason: type: string title: Reason + additionalProperties: false type: object required: - name @@ -9517,6 +9601,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - task_instances @@ -9533,6 +9618,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - task_instances @@ -9633,6 +9719,7 @@ components: executor_config: type: string title: Executor Config + additionalProperties: false type: object required: - task_id @@ -9782,6 +9869,7 @@ components: anyOf: - $ref: '#/components/schemas/JobResponse' - type: 'null' + additionalProperties: false type: object required: - id @@ -9875,6 +9963,7 @@ components: deferred: type: integer title: Deferred + additionalProperties: false type: object required: - no_status @@ -10006,6 +10095,7 @@ components: - type: string - type: 'null' title: Order By + additionalProperties: false type: object title: TaskInstancesBatchBody description: Task Instance body for get batch. @@ -10041,6 +10131,7 @@ components: type: string format: date-time title: Updated At + additionalProperties: false type: object required: - dag_id @@ -10186,6 +10277,7 @@ components: title: Extra Links description: Extract and return extra_links. readOnly: true + additionalProperties: false type: object required: - task_id @@ -10266,6 +10358,7 @@ components: - type: string - type: 'null' title: Note + additionalProperties: false type: object title: TriggerDAGRunPostBody description: Trigger DAG Run Serializer for POST body. @@ -10289,6 +10382,7 @@ components: - type: integer - type: 'null' title: Triggerer Id + additionalProperties: false type: object required: - id @@ -10310,6 +10404,7 @@ components: - type: string - type: 'null' title: Latest Triggerer Heartbeat + additionalProperties: false type: object required: - status @@ -10351,6 +10446,7 @@ components: - type: string - type: 'null' title: Description + additionalProperties: false type: object required: - key @@ -10367,6 +10463,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - variables @@ -10389,6 +10486,7 @@ components: is_encrypted: type: boolean title: Is Encrypted + additionalProperties: false type: object required: - key @@ -10407,6 +10505,7 @@ components: - type: string - type: 'null' title: Git Version + additionalProperties: false type: object required: - version @@ -10423,6 +10522,7 @@ components: total_entries: type: integer title: Total Entries + additionalProperties: false type: object required: - xcom_entries @@ -10454,6 +10554,7 @@ components: run_id: type: string title: Run Id + additionalProperties: false type: object required: - key @@ -10492,6 +10593,7 @@ components: title: Run Id value: title: Value + additionalProperties: false type: object required: - key @@ -10534,6 +10636,7 @@ components: - type: string - type: 'null' title: Value + additionalProperties: false type: object required: - key diff --git a/airflow/auth/managers/simple/openapi/v1-generated.yaml b/airflow/auth/managers/simple/openapi/v1-generated.yaml index 4ae5c70876149..d8103ad7e0b56 100644 --- a/airflow/auth/managers/simple/openapi/v1-generated.yaml +++ b/airflow/auth/managers/simple/openapi/v1-generated.yaml @@ -75,6 +75,7 @@ components: password: type: string title: Password + additionalProperties: false type: object required: - username @@ -86,6 +87,7 @@ components: jwt_token: type: string title: Jwt Token + additionalProperties: false type: object required: - jwt_token diff --git a/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow/ui/openapi-gen/requests/schemas.gen.ts index 170b977beb0ed..deb1d09a406ac 100644 --- a/airflow/ui/openapi-gen/requests/schemas.gen.ts +++ b/airflow/ui/openapi-gen/requests/schemas.gen.ts @@ -103,6 +103,7 @@ export const $AssetAliasCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["asset_aliases", "total_entries"], title: "AssetAliasCollectionResponse", @@ -124,6 +125,7 @@ export const $AssetAliasResponse = { title: "Group", }, }, + additionalProperties: false, type: "object", required: ["id", "name", "group"], title: "AssetAliasResponse", @@ -144,6 +146,7 @@ export const $AssetCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["assets", "total_entries"], title: "AssetCollectionResponse", @@ -164,6 +167,7 @@ export const $AssetEventCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["asset_events", "total_entries"], title: "AssetEventCollectionResponse", @@ -274,6 +278,7 @@ export const $AssetEventResponse = { title: "Timestamp", }, }, + additionalProperties: false, type: "object", required: ["id", "asset_id", "source_map_index", "created_dagruns", "timestamp"], title: "AssetEventResponse", @@ -341,6 +346,7 @@ export const $AssetResponse = { title: "Aliases", }, }, + additionalProperties: false, type: "object", required: [ "id", @@ -371,6 +377,7 @@ export const $BackfillCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["backfills", "total_entries"], title: "BackfillCollectionResponse", @@ -413,6 +420,7 @@ export const $BackfillPostBody = { default: 10, }, }, + additionalProperties: false, type: "object", required: ["dag_id", "from_date", "to_date"], title: "BackfillPostBody", @@ -477,6 +485,7 @@ export const $BackfillResponse = { title: "Updated At", }, }, + additionalProperties: false, type: "object", required: [ "id", @@ -509,6 +518,7 @@ export const $BaseInfoResponse = { title: "Status", }, }, + additionalProperties: false, type: "object", required: ["status"], title: "BaseInfoResponse", @@ -558,6 +568,7 @@ export const $BulkActionResponse = { default: [], }, }, + additionalProperties: false, type: "object", title: "BulkActionResponse", description: `Serializer for individual bulk action responses. @@ -587,6 +598,7 @@ export const $BulkBody_ConnectionBody_ = { title: "Actions", }, }, + additionalProperties: false, type: "object", required: ["actions"], title: "BulkBody[ConnectionBody]", @@ -612,6 +624,7 @@ export const $BulkBody_PoolBody_ = { title: "Actions", }, }, + additionalProperties: false, type: "object", required: ["actions"], title: "BulkBody[PoolBody]", @@ -637,6 +650,7 @@ export const $BulkBody_VariableBody_ = { title: "Actions", }, }, + additionalProperties: false, type: "object", required: ["actions"], title: "BulkBody[VariableBody]", @@ -661,6 +675,7 @@ export const $BulkCreateAction_ConnectionBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkCreateAction[ConnectionBody]", @@ -685,6 +700,7 @@ export const $BulkCreateAction_PoolBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkCreateAction[PoolBody]", @@ -709,6 +725,7 @@ export const $BulkCreateAction_VariableBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkCreateAction[VariableBody]", @@ -733,6 +750,7 @@ export const $BulkDeleteAction_ConnectionBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkDeleteAction[ConnectionBody]", @@ -757,6 +775,7 @@ export const $BulkDeleteAction_PoolBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkDeleteAction[PoolBody]", @@ -781,6 +800,7 @@ export const $BulkDeleteAction_VariableBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkDeleteAction[VariableBody]", @@ -822,6 +842,7 @@ export const $BulkResponse = { description: "Details of the bulk delete operation, including successful keys and errors.", }, }, + additionalProperties: false, type: "object", title: "BulkResponse", description: `Serializer for responses to bulk entity operations. @@ -850,6 +871,7 @@ export const $BulkUpdateAction_ConnectionBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkUpdateAction[ConnectionBody]", @@ -874,6 +896,7 @@ export const $BulkUpdateAction_PoolBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkUpdateAction[PoolBody]", @@ -898,6 +921,7 @@ export const $BulkUpdateAction_VariableBody_ = { default: "fail", }, }, + additionalProperties: false, type: "object", required: ["action", "entities"], title: "BulkUpdateAction[VariableBody]", @@ -1012,6 +1036,7 @@ export const $ClearTaskInstancesBody = { default: false, }, }, + additionalProperties: false, type: "object", title: "ClearTaskInstancesBody", description: "Request body for Clear Task Instances endpoint.", @@ -1027,6 +1052,7 @@ export const $Config = { title: "Sections", }, }, + additionalProperties: false, type: "object", required: ["sections"], title: "Config", @@ -1061,6 +1087,7 @@ export const $ConfigOption = { title: "Value", }, }, + additionalProperties: false, type: "object", required: ["key", "value"], title: "ConfigOption", @@ -1191,6 +1218,7 @@ export const $ConfigSection = { title: "Options", }, }, + additionalProperties: false, type: "object", required: ["name", "options"], title: "ConfigSection", @@ -1287,6 +1315,7 @@ export const $ConnectionBody = { title: "Extra", }, }, + additionalProperties: false, type: "object", required: ["connection_id", "conn_type"], title: "ConnectionBody", @@ -1307,6 +1336,7 @@ export const $ConnectionCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["connections", "total_entries"], title: "ConnectionCollectionResponse", @@ -1401,6 +1431,7 @@ export const $ConnectionResponse = { title: "Extra", }, }, + additionalProperties: false, type: "object", required: [ "connection_id", @@ -1428,6 +1459,7 @@ export const $ConnectionTestResponse = { title: "Message", }, }, + additionalProperties: false, type: "object", required: ["status", "message"], title: "ConnectionTestResponse", @@ -1466,6 +1498,7 @@ export const $DAGCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["dags", "total_entries"], title: "DAGCollectionResponse", @@ -1789,6 +1822,7 @@ export const $DAGDetailsResponse = { readOnly: true, }, }, + additionalProperties: false, type: "object", required: [ "dag_id", @@ -1839,6 +1873,7 @@ export const $DAGPatchBody = { title: "Is Paused", }, }, + additionalProperties: false, type: "object", required: ["is_paused"], title: "DAGPatchBody", @@ -2031,6 +2066,7 @@ export const $DAGResponse = { readOnly: true, }, }, + additionalProperties: false, type: "object", required: [ "dag_id", @@ -2074,6 +2110,7 @@ export const $DAGRunClearBody = { default: false, }, }, + additionalProperties: false, type: "object", title: "DAGRunClearBody", description: "DAG Run serializer for clear endpoint body.", @@ -2093,6 +2130,7 @@ export const $DAGRunCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["dag_runs", "total_entries"], title: "DAGRunCollectionResponse", @@ -2124,6 +2162,7 @@ export const $DAGRunPatchBody = { title: "Note", }, }, + additionalProperties: false, type: "object", title: "DAGRunPatchBody", description: "DAG Run Serializer for PATCH requests.", @@ -2259,6 +2298,7 @@ export const $DAGRunResponse = { title: "Note", }, }, + additionalProperties: false, type: "object", required: [ "dag_run_id", @@ -2300,6 +2340,7 @@ export const $DAGRunStates = { title: "Failed", }, }, + additionalProperties: false, type: "object", required: ["queued", "running", "success", "failed"], title: "DAGRunStates", @@ -2325,6 +2366,7 @@ export const $DAGRunTypes = { title: "Asset Triggered", }, }, + additionalProperties: false, type: "object", required: ["backfill", "scheduled", "manual", "asset_triggered"], title: "DAGRunTypes", @@ -2464,6 +2506,7 @@ export const $DAGRunsBatchBody = { title: "End Date Lte", }, }, + additionalProperties: false, type: "object", title: "DAGRunsBatchBody", description: "List DAG Runs body for batch endpoint.", @@ -2498,6 +2541,7 @@ export const $DAGSourceResponse = { title: "Version Number", }, }, + additionalProperties: false, type: "object", required: ["content", "dag_id", "version_number"], title: "DAGSourceResponse", @@ -2518,6 +2562,7 @@ export const $DAGTagCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["tags", "total_entries"], title: "DAGTagCollectionResponse", @@ -2538,6 +2583,7 @@ export const $DAGWarningCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["dag_warnings", "total_entries"], title: "DAGWarningCollectionResponse", @@ -2563,6 +2609,7 @@ export const $DAGWarningResponse = { title: "Timestamp", }, }, + additionalProperties: false, type: "object", required: ["dag_id", "warning_type", "message", "timestamp"], title: "DAGWarningResponse", @@ -2583,6 +2630,7 @@ export const $DAGWithLatestDagRunsCollectionResponse = { title: "Dags", }, }, + additionalProperties: false, type: "object", required: ["total_entries", "dags"], title: "DAGWithLatestDagRunsCollectionResponse", @@ -2782,6 +2830,7 @@ export const $DAGWithLatestDagRunsResponse = { readOnly: true, }, }, + additionalProperties: false, type: "object", required: [ "dag_id", @@ -2838,6 +2887,7 @@ export const $DagProcessorInfoResponse = { title: "Latest Dag Processor Heartbeat", }, }, + additionalProperties: false, type: "object", required: ["status", "latest_dag_processor_heartbeat"], title: "DagProcessorInfoResponse", @@ -2891,6 +2941,7 @@ export const $DagRunAssetReference = { title: "Data Interval End", }, }, + additionalProperties: false, type: "object", required: [ "run_id", @@ -2948,6 +2999,7 @@ export const $DagScheduleAssetReference = { title: "Updated At", }, }, + additionalProperties: false, type: "object", required: ["dag_id", "created_at", "updated_at"], title: "DagScheduleAssetReference", @@ -2968,6 +3020,7 @@ export const $DagStatsCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["dags", "total_entries"], title: "DagStatsCollectionResponse", @@ -2988,6 +3041,7 @@ export const $DagStatsResponse = { title: "Stats", }, }, + additionalProperties: false, type: "object", required: ["dag_id", "stats"], title: "DagStatsResponse", @@ -3004,6 +3058,7 @@ export const $DagStatsStateResponse = { title: "Count", }, }, + additionalProperties: false, type: "object", required: ["state", "count"], title: "DagStatsStateResponse", @@ -3021,6 +3076,7 @@ export const $DagTagResponse = { title: "Dag Id", }, }, + additionalProperties: false, type: "object", required: ["name", "dag_id"], title: "DagTagResponse", @@ -3051,6 +3107,7 @@ export const $DryRunBackfillCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["backfills", "total_entries"], title: "DryRunBackfillCollectionResponse", @@ -3065,6 +3122,7 @@ export const $DryRunBackfillResponse = { title: "Logical Date", }, }, + additionalProperties: false, type: "object", required: ["logical_date"], title: "DryRunBackfillResponse", @@ -3115,6 +3173,7 @@ export const $EdgeResponse = { title: "Is Source Asset", }, }, + additionalProperties: false, type: "object", required: ["source_id", "target_id"], title: "EdgeResponse", @@ -3135,6 +3194,7 @@ export const $EventLogCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["event_logs", "total_entries"], title: "EventLogCollectionResponse", @@ -3246,6 +3306,7 @@ export const $EventLogResponse = { title: "Extra", }, }, + additionalProperties: false, type: "object", required: [ "event_log_id", @@ -3597,6 +3658,7 @@ export const $HealthInfoResponse = { ], }, }, + additionalProperties: false, type: "object", required: ["metadatabase", "scheduler", "triggerer"], title: "HealthInfoResponse", @@ -3615,6 +3677,7 @@ export const $HistoricalMetricDataResponse = { $ref: "#/components/schemas/TaskInstanceStateCount", }, }, + additionalProperties: false, type: "object", required: ["dag_run_types", "dag_run_states", "task_instance_states"], title: "HistoricalMetricDataResponse", @@ -3635,6 +3698,7 @@ export const $ImportErrorCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["import_errors", "total_entries"], title: "ImportErrorCollectionResponse", @@ -3665,6 +3729,7 @@ export const $ImportErrorResponse = { title: "Stack Trace", }, }, + additionalProperties: false, type: "object", required: ["import_error_id", "timestamp", "filename", "bundle_name", "stack_trace"], title: "ImportErrorResponse", @@ -3685,6 +3750,7 @@ export const $JobCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["jobs", "total_entries"], title: "JobCollectionResponse", @@ -3801,6 +3867,7 @@ export const $JobResponse = { title: "Unixname", }, }, + additionalProperties: false, type: "object", required: [ "id", @@ -3905,6 +3972,7 @@ export const $NodeResponse = { title: "Asset Condition Type", }, }, + additionalProperties: false, type: "object", required: ["id", "label", "type"], title: "NodeResponse", @@ -3956,6 +4024,7 @@ export const $PatchTaskInstanceBody = { default: false, }, }, + additionalProperties: false, type: "object", title: "PatchTaskInstanceBody", description: "Request body for Clear Task Instances endpoint.", @@ -3975,6 +4044,7 @@ export const $PluginCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["plugins", "total_entries"], title: "PluginCollectionResponse", @@ -4055,6 +4125,7 @@ export const $PluginResponse = { title: "Timetables", }, }, + additionalProperties: false, type: "object", required: [ "name", @@ -4101,6 +4172,7 @@ export const $PoolBody = { default: false, }, }, + additionalProperties: false, type: "object", required: ["name", "slots"], title: "PoolBody", @@ -4121,6 +4193,7 @@ export const $PoolCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["pools", "total_entries"], title: "PoolCollectionResponse", @@ -4174,6 +4247,7 @@ export const $PoolPatchBody = { title: "Include Deferred", }, }, + additionalProperties: false, type: "object", title: "PoolPatchBody", description: "Pool serializer for patch bodies.", @@ -4229,6 +4303,7 @@ export const $PoolResponse = { title: "Deferred Slots", }, }, + additionalProperties: false, type: "object", required: [ "name", @@ -4260,6 +4335,7 @@ export const $ProviderCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["providers", "total_entries"], title: "ProviderCollectionResponse", @@ -4281,6 +4357,7 @@ export const $ProviderResponse = { title: "Version", }, }, + additionalProperties: false, type: "object", required: ["package_name", "description", "version"], title: "ProviderResponse", @@ -4301,6 +4378,7 @@ export const $QueuedEventCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["queued_events", "total_entries"], title: "QueuedEventCollectionResponse", @@ -4323,6 +4401,7 @@ export const $QueuedEventResponse = { title: "Created At", }, }, + additionalProperties: false, type: "object", required: ["dag_id", "asset_id", "created_at"], title: "QueuedEventResponse", @@ -4363,6 +4442,7 @@ export const $SchedulerInfoResponse = { title: "Latest Scheduler Heartbeat", }, }, + additionalProperties: false, type: "object", required: ["status", "latest_scheduler_heartbeat"], title: "SchedulerInfoResponse", @@ -4391,6 +4471,7 @@ export const $StructureDataResponse = { title: "Arrange", }, }, + additionalProperties: false, type: "object", required: ["edges", "nodes", "arrange"], title: "StructureDataResponse", @@ -4411,6 +4492,7 @@ export const $TaskCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["tasks", "total_entries"], title: "TaskCollectionResponse", @@ -4427,6 +4509,7 @@ export const $TaskDependencyCollectionResponse = { title: "Dependencies", }, }, + additionalProperties: false, type: "object", required: ["dependencies"], title: "TaskDependencyCollectionResponse", @@ -4444,6 +4527,7 @@ export const $TaskDependencyResponse = { title: "Reason", }, }, + additionalProperties: false, type: "object", required: ["name", "reason"], title: "TaskDependencyResponse", @@ -4464,6 +4548,7 @@ export const $TaskInstanceCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["task_instances", "total_entries"], title: "TaskInstanceCollectionResponse", @@ -4484,6 +4569,7 @@ export const $TaskInstanceHistoryCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["task_instances", "total_entries"], title: "TaskInstanceHistoryCollectionResponse", @@ -4667,6 +4753,7 @@ export const $TaskInstanceHistoryResponse = { title: "Executor Config", }, }, + additionalProperties: false, type: "object", required: [ "task_id", @@ -4929,6 +5016,7 @@ export const $TaskInstanceResponse = { ], }, }, + additionalProperties: false, type: "object", required: [ "id", @@ -5041,6 +5129,7 @@ export const $TaskInstanceStateCount = { title: "Deferred", }, }, + additionalProperties: false, type: "object", required: [ "no_status", @@ -5286,6 +5375,7 @@ export const $TaskInstancesBatchBody = { title: "Order By", }, }, + additionalProperties: false, type: "object", title: "TaskInstancesBatchBody", description: "Task Instance body for get batch.", @@ -5336,6 +5426,7 @@ export const $TaskOutletAssetReference = { title: "Updated At", }, }, + additionalProperties: false, type: "object", required: ["dag_id", "task_id", "created_at", "updated_at"], title: "TaskOutletAssetReference", @@ -5625,6 +5716,7 @@ export const $TaskResponse = { readOnly: true, }, }, + additionalProperties: false, type: "object", required: [ "task_id", @@ -5738,6 +5830,7 @@ export const $TriggerDAGRunPostBody = { title: "Note", }, }, + additionalProperties: false, type: "object", title: "TriggerDAGRunPostBody", description: "Trigger DAG Run Serializer for POST body.", @@ -5774,6 +5867,7 @@ export const $TriggerResponse = { title: "Triggerer Id", }, }, + additionalProperties: false, type: "object", required: ["id", "classpath", "kwargs", "created_date", "triggerer_id"], title: "TriggerResponse", @@ -5805,6 +5899,7 @@ export const $TriggererInfoResponse = { title: "Latest Triggerer Heartbeat", }, }, + additionalProperties: false, type: "object", required: ["status", "latest_triggerer_heartbeat"], title: "TriggererInfoResponse", @@ -5864,6 +5959,7 @@ export const $VariableBody = { title: "Description", }, }, + additionalProperties: false, type: "object", required: ["key", "value"], title: "VariableBody", @@ -5884,6 +5980,7 @@ export const $VariableCollectionResponse = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["variables", "total_entries"], title: "VariableCollectionResponse", @@ -5916,6 +6013,7 @@ export const $VariableResponse = { title: "Is Encrypted", }, }, + additionalProperties: false, type: "object", required: ["key", "value", "description", "is_encrypted"], title: "VariableResponse", @@ -5940,6 +6038,7 @@ export const $VersionInfo = { title: "Git Version", }, }, + additionalProperties: false, type: "object", required: ["version", "git_version"], title: "VersionInfo", @@ -5960,6 +6059,7 @@ export const $XComCollection = { title: "Total Entries", }, }, + additionalProperties: false, type: "object", required: ["xcom_entries", "total_entries"], title: "XComCollection", @@ -5999,6 +6099,7 @@ export const $XComResponse = { title: "Run Id", }, }, + additionalProperties: false, type: "object", required: ["key", "timestamp", "logical_date", "map_index", "task_id", "dag_id", "run_id"], title: "XComResponse", @@ -6041,6 +6142,7 @@ export const $XComResponseNative = { title: "Value", }, }, + additionalProperties: false, type: "object", required: ["key", "timestamp", "logical_date", "map_index", "task_id", "dag_id", "run_id", "value"], title: "XComResponseNative", @@ -6091,6 +6193,7 @@ export const $XComResponseString = { title: "Value", }, }, + additionalProperties: false, type: "object", required: ["key", "timestamp", "logical_date", "map_index", "task_id", "dag_id", "run_id", "value"], title: "XComResponseString", From 7ce209c88cc158b4b5e79ff208ef06ffd3332881 Mon Sep 17 00:00:00 2001 From: kalyanr Date: Wed, 29 Jan 2025 22:13:41 +0530 Subject: [PATCH 2/6] fix backfill test --- tests/api_fastapi/core_api/routes/public/test_backfills.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/api_fastapi/core_api/routes/public/test_backfills.py b/tests/api_fastapi/core_api/routes/public/test_backfills.py index 1836bae3ac7a1..1eeae8b667566 100644 --- a/tests/api_fastapi/core_api/routes/public/test_backfills.py +++ b/tests/api_fastapi/core_api/routes/public/test_backfills.py @@ -425,7 +425,6 @@ def test_create_backfill_dry_run_with_depends_on_past( "max_active_runs": max_active_runs, "run_backwards": run_backwards, "dag_run_conf": {"param1": "val1", "param2": True}, - "dry_run": False, "reprocess_behavior": repro_act, } response = test_client.post( From 2718a2c3ed669204089fdc112fea46fe4beb7008 Mon Sep 17 00:00:00 2001 From: kalyanr Date: Wed, 29 Jan 2025 22:43:14 +0530 Subject: [PATCH 3/6] use Response model to fix plugin test failures --- airflow/api_fastapi/core_api/base.py | 4 ++-- airflow/api_fastapi/core_api/datamodels/plugins.py | 6 +++--- airflow/api_fastapi/core_api/openapi/v1-generated.yaml | 2 -- airflow/ui/openapi-gen/requests/schemas.gen.ts | 2 -- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/airflow/api_fastapi/core_api/base.py b/airflow/api_fastapi/core_api/base.py index 977cbe4ea6684..258f7b1491b1b 100644 --- a/airflow/api_fastapi/core_api/base.py +++ b/airflow/api_fastapi/core_api/base.py @@ -29,11 +29,11 @@ class BaseModel(PydanticBaseModel): model_config = ConfigDict(from_attributes=True, populate_by_name=True, extra="forbid") -class ResponseBaseModel(BaseModel): +class ResponseBaseModel(PydanticBaseModel): """ Base pydantic model for REST API. :meta private: """ - model_config = ConfigDict(from_attributes=True) + model_config = ConfigDict(from_attributes=True, populate_by_name=True) diff --git a/airflow/api_fastapi/core_api/datamodels/plugins.py b/airflow/api_fastapi/core_api/datamodels/plugins.py index d36e5faf85156..e00ad23f38b00 100644 --- a/airflow/api_fastapi/core_api/datamodels/plugins.py +++ b/airflow/api_fastapi/core_api/datamodels/plugins.py @@ -21,7 +21,7 @@ from pydantic import BeforeValidator, ConfigDict, field_validator -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, ResponseBaseModel from airflow.plugins_manager import AirflowPluginSource @@ -60,7 +60,7 @@ class AppBuilderMenuItemResponse(BaseModel): category: str | None = None -class PluginResponse(BaseModel): +class PluginResponse(ResponseBaseModel): """Plugin serializer.""" name: str @@ -83,7 +83,7 @@ def convert_source(cls, data: Any) -> Any: return data -class PluginCollectionResponse(BaseModel): +class PluginCollectionResponse(ResponseBaseModel): """Plugin Collection serializer.""" plugins: list[PluginResponse] diff --git a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml index 535e050dfce24..c0004771ca180 100644 --- a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml +++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml @@ -9222,7 +9222,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - plugins @@ -9282,7 +9281,6 @@ components: type: string type: array title: Timetables - additionalProperties: false type: object required: - name diff --git a/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow/ui/openapi-gen/requests/schemas.gen.ts index deb1d09a406ac..eef3480f67e77 100644 --- a/airflow/ui/openapi-gen/requests/schemas.gen.ts +++ b/airflow/ui/openapi-gen/requests/schemas.gen.ts @@ -4044,7 +4044,6 @@ export const $PluginCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["plugins", "total_entries"], title: "PluginCollectionResponse", @@ -4125,7 +4124,6 @@ export const $PluginResponse = { title: "Timetables", }, }, - additionalProperties: false, type: "object", required: [ "name", From fe00dcccbef2bc8fdc1f6882824fa46f4f3861fa Mon Sep 17 00:00:00 2001 From: kalyanr Date: Wed, 29 Jan 2025 23:51:03 +0530 Subject: [PATCH 4/6] use BaseModel and StrictBaseModel --- airflow/api_fastapi/core_api/base.py | 6 +- .../api_fastapi/core_api/datamodels/assets.py | 10 +-- .../core_api/datamodels/backfills.py | 12 +-- .../api_fastapi/core_api/datamodels/common.py | 6 +- .../api_fastapi/core_api/datamodels/config.py | 8 +- .../core_api/datamodels/connections.py | 4 +- .../core_api/datamodels/dag_run.py | 10 +-- .../api_fastapi/core_api/datamodels/dags.py | 4 +- .../core_api/datamodels/plugins.py | 6 +- .../api_fastapi/core_api/datamodels/pools.py | 8 +- .../core_api/datamodels/task_instances.py | 8 +- .../core_api/datamodels/variables.py | 4 +- .../api_fastapi/core_api/datamodels/xcom.py | 4 +- .../core_api/openapi/v1-generated.yaml | 73 +------------------ .../core_api/routes/public/xcom.py | 6 +- .../execution_api/datamodels/taskinstance.py | 26 +++---- .../execution_api/datamodels/token.py | 4 +- .../execution_api/datamodels/variable.py | 4 +- .../auth/managers/simple/datamodels/login.py | 4 +- .../managers/simple/openapi/v1-generated.yaml | 1 - airflow/ui/openapi-gen/queries/prefetch.ts | 2 +- airflow/ui/openapi-gen/queries/queries.ts | 2 +- airflow/ui/openapi-gen/queries/suspense.ts | 2 +- .../ui/openapi-gen/requests/schemas.gen.ts | 71 +----------------- .../ui/openapi-gen/requests/services.gen.ts | 2 +- airflow/ui/openapi-gen/requests/types.gen.ts | 8 +- 26 files changed, 82 insertions(+), 213 deletions(-) diff --git a/airflow/api_fastapi/core_api/base.py b/airflow/api_fastapi/core_api/base.py index 258f7b1491b1b..3f4972b9b389b 100644 --- a/airflow/api_fastapi/core_api/base.py +++ b/airflow/api_fastapi/core_api/base.py @@ -26,14 +26,14 @@ class BaseModel(PydanticBaseModel): :meta private: """ - model_config = ConfigDict(from_attributes=True, populate_by_name=True, extra="forbid") + model_config = ConfigDict(from_attributes=True, populate_by_name=True) -class ResponseBaseModel(PydanticBaseModel): +class StrictBaseModel(BaseModel): """ Base pydantic model for REST API. :meta private: """ - model_config = ConfigDict(from_attributes=True, populate_by_name=True) + model_config = ConfigDict(from_attributes=True, populate_by_name=True, extra="forbid") diff --git a/airflow/api_fastapi/core_api/datamodels/assets.py b/airflow/api_fastapi/core_api/datamodels/assets.py index c7b7bec034c06..fd8f7cef2d415 100644 --- a/airflow/api_fastapi/core_api/datamodels/assets.py +++ b/airflow/api_fastapi/core_api/datamodels/assets.py @@ -21,11 +21,11 @@ from pydantic import Field, field_validator -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.utils.log.secrets_masker import redact -class DagScheduleAssetReference(BaseModel): +class DagScheduleAssetReference(StrictBaseModel): """DAG schedule reference serializer for assets.""" dag_id: str @@ -33,7 +33,7 @@ class DagScheduleAssetReference(BaseModel): updated_at: datetime -class TaskOutletAssetReference(BaseModel): +class TaskOutletAssetReference(StrictBaseModel): """Task outlet reference serializer for assets.""" dag_id: str @@ -84,7 +84,7 @@ class AssetAliasCollectionResponse(BaseModel): total_entries: int -class DagRunAssetReference(BaseModel): +class DagRunAssetReference(StrictBaseModel): """DAGRun serializer for asset responses.""" run_id: str @@ -141,7 +141,7 @@ class QueuedEventCollectionResponse(BaseModel): total_entries: int -class CreateAssetEventsBody(BaseModel): +class CreateAssetEventsBody(StrictBaseModel): """Create asset events request.""" asset_id: int diff --git a/airflow/api_fastapi/core_api/datamodels/backfills.py b/airflow/api_fastapi/core_api/datamodels/backfills.py index e36e50ea3b8d7..6721515ee7113 100644 --- a/airflow/api_fastapi/core_api/datamodels/backfills.py +++ b/airflow/api_fastapi/core_api/datamodels/backfills.py @@ -19,11 +19,11 @@ from datetime import datetime -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import StrictBaseModel from airflow.models.backfill import ReprocessBehavior -class BackfillPostBody(BaseModel): +class BackfillPostBody(StrictBaseModel): """Object used for create backfill request.""" dag_id: str @@ -35,7 +35,7 @@ class BackfillPostBody(BaseModel): max_active_runs: int = 10 -class BackfillResponse(BaseModel): +class BackfillResponse(StrictBaseModel): """Base serializer for Backfill.""" id: int @@ -51,20 +51,20 @@ class BackfillResponse(BaseModel): updated_at: datetime -class BackfillCollectionResponse(BaseModel): +class BackfillCollectionResponse(StrictBaseModel): """Backfill Collection serializer for responses.""" backfills: list[BackfillResponse] total_entries: int -class DryRunBackfillResponse(BaseModel): +class DryRunBackfillResponse(StrictBaseModel): """Backfill serializer for responses in dry-run mode.""" logical_date: datetime -class DryRunBackfillCollectionResponse(BaseModel): +class DryRunBackfillCollectionResponse(StrictBaseModel): """Backfill collection serializer for responses in dry-run mode.""" backfills: list[DryRunBackfillResponse] diff --git a/airflow/api_fastapi/core_api/datamodels/common.py b/airflow/api_fastapi/core_api/datamodels/common.py index 4af5356f2ed3a..3c7a04255c963 100644 --- a/airflow/api_fastapi/core_api/datamodels/common.py +++ b/airflow/api_fastapi/core_api/datamodels/common.py @@ -27,7 +27,7 @@ from pydantic import Discriminator, Field, Tag -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel # Common Bulk Data Models T = TypeVar("T") @@ -57,7 +57,7 @@ class BulkActionNotOnExistence(enum.Enum): SKIP = "skip" -class BulkBaseAction(BaseModel, Generic[T]): +class BulkBaseAction(StrictBaseModel, Generic[T]): """Base class for bulk actions.""" action: BulkAction = Field(..., description="The action to be performed on the entities.") @@ -88,7 +88,7 @@ def _action_discriminator(action: Any) -> str: return BulkAction(action["action"]).value -class BulkBody(BaseModel, Generic[T]): +class BulkBody(StrictBaseModel, Generic[T]): """Serializer for bulk entity operations.""" actions: list[ diff --git a/airflow/api_fastapi/core_api/datamodels/config.py b/airflow/api_fastapi/core_api/datamodels/config.py index c16aa98093fb1..42a327431ceed 100644 --- a/airflow/api_fastapi/core_api/datamodels/config.py +++ b/airflow/api_fastapi/core_api/datamodels/config.py @@ -16,10 +16,10 @@ # under the License. from __future__ import annotations -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import StrictBaseModel -class ConfigOption(BaseModel): +class ConfigOption(StrictBaseModel): """Config option.""" key: str @@ -32,7 +32,7 @@ def text_format(self): return f"{self.key} = {self.value}" -class ConfigSection(BaseModel): +class ConfigSection(StrictBaseModel): """Config Section Schema.""" name: str @@ -53,7 +53,7 @@ def text_format(self): return f"[{self.name}]\n" + "\n".join(option.text_format for option in self.options) + "\n" -class Config(BaseModel): +class Config(StrictBaseModel): """List of config sections with their options.""" sections: list[ConfigSection] diff --git a/airflow/api_fastapi/core_api/datamodels/connections.py b/airflow/api_fastapi/core_api/datamodels/connections.py index 00d075bc4ace4..4650e1354dc1e 100644 --- a/airflow/api_fastapi/core_api/datamodels/connections.py +++ b/airflow/api_fastapi/core_api/datamodels/connections.py @@ -22,7 +22,7 @@ from pydantic import Field, field_validator from pydantic_core.core_schema import ValidationInfo -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.utils.log.secrets_masker import redact @@ -76,7 +76,7 @@ class ConnectionTestResponse(BaseModel): # Request Models -class ConnectionBody(BaseModel): +class ConnectionBody(StrictBaseModel): """Connection Serializer for requests body.""" connection_id: str = Field(serialization_alias="conn_id", max_length=200, pattern=r"^[\w.-]+$") diff --git a/airflow/api_fastapi/core_api/datamodels/dag_run.py b/airflow/api_fastapi/core_api/datamodels/dag_run.py index 48c92d2a83cb0..78e0254f62240 100644 --- a/airflow/api_fastapi/core_api/datamodels/dag_run.py +++ b/airflow/api_fastapi/core_api/datamodels/dag_run.py @@ -22,7 +22,7 @@ from pydantic import AwareDatetime, Field, NonNegativeInt, computed_field, model_validator -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.models import DagRun from airflow.utils import timezone from airflow.utils.state import DagRunState @@ -37,14 +37,14 @@ class DAGRunPatchStates(str, Enum): FAILED = DagRunState.FAILED -class DAGRunPatchBody(BaseModel): +class DAGRunPatchBody(StrictBaseModel): """DAG Run Serializer for PATCH requests.""" state: DAGRunPatchStates | None = None note: str | None = Field(None, max_length=1000) -class DAGRunClearBody(BaseModel): +class DAGRunClearBody(StrictBaseModel): """DAG Run serializer for clear endpoint body.""" dry_run: bool = True @@ -78,7 +78,7 @@ class DAGRunCollectionResponse(BaseModel): total_entries: int -class TriggerDAGRunPostBody(BaseModel): +class TriggerDAGRunPostBody(StrictBaseModel): """Trigger DAG Run Serializer for POST body.""" dag_run_id: str | None = None @@ -109,7 +109,7 @@ def logical_date(self) -> datetime: return timezone.utcnow() -class DAGRunsBatchBody(BaseModel): +class DAGRunsBatchBody(StrictBaseModel): """List DAG Runs body for batch endpoint.""" order_by: str | None = None diff --git a/airflow/api_fastapi/core_api/datamodels/dags.py b/airflow/api_fastapi/core_api/datamodels/dags.py index 30399b42f8d12..504a41683232c 100644 --- a/airflow/api_fastapi/core_api/datamodels/dags.py +++ b/airflow/api_fastapi/core_api/datamodels/dags.py @@ -31,7 +31,7 @@ field_validator, ) -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.api_fastapi.core_api.datamodels.dag_tags import DagTagResponse from airflow.configuration import conf @@ -92,7 +92,7 @@ def file_token(self) -> str: return serializer.dumps(self.fileloc) -class DAGPatchBody(BaseModel): +class DAGPatchBody(StrictBaseModel): """Dag Serializer for updatable bodies.""" is_paused: bool diff --git a/airflow/api_fastapi/core_api/datamodels/plugins.py b/airflow/api_fastapi/core_api/datamodels/plugins.py index e00ad23f38b00..d36e5faf85156 100644 --- a/airflow/api_fastapi/core_api/datamodels/plugins.py +++ b/airflow/api_fastapi/core_api/datamodels/plugins.py @@ -21,7 +21,7 @@ from pydantic import BeforeValidator, ConfigDict, field_validator -from airflow.api_fastapi.core_api.base import BaseModel, ResponseBaseModel +from airflow.api_fastapi.core_api.base import BaseModel from airflow.plugins_manager import AirflowPluginSource @@ -60,7 +60,7 @@ class AppBuilderMenuItemResponse(BaseModel): category: str | None = None -class PluginResponse(ResponseBaseModel): +class PluginResponse(BaseModel): """Plugin serializer.""" name: str @@ -83,7 +83,7 @@ def convert_source(cls, data: Any) -> Any: return data -class PluginCollectionResponse(ResponseBaseModel): +class PluginCollectionResponse(BaseModel): """Plugin Collection serializer.""" plugins: list[PluginResponse] diff --git a/airflow/api_fastapi/core_api/datamodels/pools.py b/airflow/api_fastapi/core_api/datamodels/pools.py index 0040c49a1efda..2763e9160494e 100644 --- a/airflow/api_fastapi/core_api/datamodels/pools.py +++ b/airflow/api_fastapi/core_api/datamodels/pools.py @@ -21,7 +21,7 @@ from pydantic import BeforeValidator, ConfigDict, Field -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel def _call_function(function: Callable[[], int]) -> int: @@ -53,14 +53,14 @@ class PoolResponse(BasePool): deferred_slots: Annotated[int, BeforeValidator(_call_function)] -class PoolCollectionResponse(BaseModel): +class PoolCollectionResponse(StrictBaseModel): """Pool Collection serializer for responses.""" pools: list[PoolResponse] total_entries: int -class PoolPatchBody(BaseModel): +class PoolPatchBody(StrictBaseModel): """Pool serializer for patch bodies.""" model_config = ConfigDict(populate_by_name=True, from_attributes=True) @@ -71,7 +71,7 @@ class PoolPatchBody(BaseModel): include_deferred: bool | None = None -class PoolBody(BasePool): +class PoolBody(StrictBaseModel, BasePool): """Pool serializer for post bodies.""" pool: str = Field(alias="name", max_length=256) diff --git a/airflow/api_fastapi/core_api/datamodels/task_instances.py b/airflow/api_fastapi/core_api/datamodels/task_instances.py index 7cecb96ca42ce..d9c87b972ba9c 100644 --- a/airflow/api_fastapi/core_api/datamodels/task_instances.py +++ b/airflow/api_fastapi/core_api/datamodels/task_instances.py @@ -32,7 +32,7 @@ model_validator, ) -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.api_fastapi.core_api.datamodels.job import JobResponse from airflow.api_fastapi.core_api.datamodels.trigger import TriggerResponse from airflow.utils.state import TaskInstanceState @@ -97,7 +97,7 @@ class TaskDependencyCollectionResponse(BaseModel): dependencies: list[TaskDependencyResponse] -class TaskInstancesBatchBody(BaseModel): +class TaskInstancesBatchBody(StrictBaseModel): """Task Instance body for get batch.""" dag_ids: list[str] | None = None @@ -159,7 +159,7 @@ class TaskInstanceHistoryCollectionResponse(BaseModel): total_entries: int -class ClearTaskInstancesBody(BaseModel): +class ClearTaskInstancesBody(StrictBaseModel): """Request body for Clear Task Instances endpoint.""" dry_run: bool = True @@ -195,7 +195,7 @@ def validate_model(cls, data: Any) -> Any: return data -class PatchTaskInstanceBody(BaseModel): +class PatchTaskInstanceBody(StrictBaseModel): """Request body for Clear Task Instances endpoint.""" new_state: TaskInstanceState | None = None diff --git a/airflow/api_fastapi/core_api/datamodels/variables.py b/airflow/api_fastapi/core_api/datamodels/variables.py index 8307809bc5f5b..82cfdbb130523 100644 --- a/airflow/api_fastapi/core_api/datamodels/variables.py +++ b/airflow/api_fastapi/core_api/datamodels/variables.py @@ -21,7 +21,7 @@ from pydantic import ConfigDict, Field, model_validator -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.models.base import ID_LEN from airflow.typing_compat import Self from airflow.utils.log.secrets_masker import redact @@ -52,7 +52,7 @@ def redact_val(self) -> Self: return self -class VariableBody(BaseModel): +class VariableBody(StrictBaseModel): """Variable serializer for bodies.""" key: str = Field(max_length=ID_LEN) diff --git a/airflow/api_fastapi/core_api/datamodels/xcom.py b/airflow/api_fastapi/core_api/datamodels/xcom.py index 3a819b317d760..b63db3ff87d15 100644 --- a/airflow/api_fastapi/core_api/datamodels/xcom.py +++ b/airflow/api_fastapi/core_api/datamodels/xcom.py @@ -52,8 +52,8 @@ def value_to_string(cls, v): return str(v) if v is not None else None -class XComCollection(BaseModel): - """List of XCom items.""" +class XComCollectionResponse(BaseModel): + """XCom Collection serializer for responses.""" xcom_entries: list[XComResponse] total_entries: int diff --git a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml index c0004771ca180..90726483bcff1 100644 --- a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml +++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml @@ -4426,7 +4426,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/XComCollection' + $ref: '#/components/schemas/XComCollectionResponse' '401': content: application/json: @@ -6566,7 +6566,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - asset_aliases @@ -6584,7 +6583,6 @@ components: group: type: string title: Group - additionalProperties: false type: object required: - id @@ -6602,7 +6600,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - assets @@ -6619,7 +6616,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - asset_events @@ -6681,7 +6677,6 @@ components: type: string format: date-time title: Timestamp - additionalProperties: false type: object required: - id @@ -6733,7 +6728,6 @@ components: $ref: '#/components/schemas/AssetAliasResponse' type: array title: Aliases - additionalProperties: false type: object required: - id @@ -6864,7 +6858,6 @@ components: - type: string - type: 'null' title: Status - additionalProperties: false type: object required: - status @@ -6910,7 +6903,6 @@ components: description: A list of errors encountered during the operation, each containing details about the issue. default: [] - additionalProperties: false type: object title: BulkActionResponse description: 'Serializer for individual bulk action responses. @@ -7108,7 +7100,6 @@ components: - type: 'null' description: Details of the bulk delete operation, including successful keys and errors. - additionalProperties: false type: object title: BulkResponse description: 'Serializer for responses to bulk entity operations. @@ -7451,7 +7442,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - connections @@ -7501,7 +7491,6 @@ components: - type: string - type: 'null' title: Extra - additionalProperties: false type: object required: - connection_id @@ -7523,7 +7512,6 @@ components: message: type: string title: Message - additionalProperties: false type: object required: - status @@ -7554,7 +7542,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - dags @@ -7733,7 +7720,6 @@ components: title: Concurrency description: Return max_active_tasks as concurrency. readOnly: true - additionalProperties: false type: object required: - dag_id @@ -7890,7 +7876,6 @@ components: title: File Token description: Return file token. readOnly: true - additionalProperties: false type: object required: - dag_id @@ -7942,7 +7927,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - dag_runs @@ -8040,7 +8024,6 @@ components: - type: string - type: 'null' title: Note - additionalProperties: false type: object required: - dag_run_id @@ -8074,7 +8057,6 @@ components: failed: type: integer title: Failed - additionalProperties: false type: object required: - queued @@ -8097,7 +8079,6 @@ components: asset_triggered: type: integer title: Asset Triggered - additionalProperties: false type: object required: - backfill @@ -8194,7 +8175,6 @@ components: - type: integer - type: 'null' title: Version Number - additionalProperties: false type: object required: - content @@ -8212,7 +8192,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - tags @@ -8229,7 +8208,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - dag_warnings @@ -8250,7 +8228,6 @@ components: type: string format: date-time title: Timestamp - additionalProperties: false type: object required: - dag_id @@ -8269,7 +8246,6 @@ components: $ref: '#/components/schemas/DAGWithLatestDagRunsResponse' type: array title: Dags - additionalProperties: false type: object required: - total_entries @@ -8386,7 +8362,6 @@ components: title: File Token description: Return file token. readOnly: true - additionalProperties: false type: object required: - dag_id @@ -8427,7 +8402,6 @@ components: - type: string - type: 'null' title: Latest Dag Processor Heartbeat - additionalProperties: false type: object required: - status @@ -8549,7 +8523,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - dags @@ -8566,7 +8539,6 @@ components: $ref: '#/components/schemas/DagStatsStateResponse' type: array title: Stats - additionalProperties: false type: object required: - dag_id @@ -8580,7 +8552,6 @@ components: count: type: integer title: Count - additionalProperties: false type: object required: - state @@ -8595,7 +8566,6 @@ components: dag_id: type: string title: Dag Id - additionalProperties: false type: object required: - name @@ -8666,7 +8636,6 @@ components: - type: boolean - type: 'null' title: Is Source Asset - additionalProperties: false type: object required: - source_id @@ -8683,7 +8652,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - event_logs @@ -8743,7 +8711,6 @@ components: - type: string - type: 'null' title: Extra - additionalProperties: false type: object required: - event_log_id @@ -8959,7 +8926,6 @@ components: anyOf: - $ref: '#/components/schemas/DagProcessorInfoResponse' - type: 'null' - additionalProperties: false type: object required: - metadatabase @@ -8975,7 +8941,6 @@ components: $ref: '#/components/schemas/DAGRunStates' task_instance_states: $ref: '#/components/schemas/TaskInstanceStateCount' - additionalProperties: false type: object required: - dag_run_types @@ -8993,7 +8958,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - import_errors @@ -9018,7 +8982,6 @@ components: stack_trace: type: string title: Stack Trace - additionalProperties: false type: object required: - import_error_id @@ -9038,7 +9001,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - jobs @@ -9099,7 +9061,6 @@ components: - type: string - type: 'null' title: Unixname - additionalProperties: false type: object required: - id @@ -9172,7 +9133,6 @@ components: - and-gate - type: 'null' title: Asset Condition Type - additionalProperties: false type: object required: - id @@ -9398,7 +9358,6 @@ components: deferred_slots: type: integer title: Deferred Slots - additionalProperties: false type: object required: - name @@ -9423,7 +9382,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - providers @@ -9441,7 +9399,6 @@ components: version: type: string title: Version - additionalProperties: false type: object required: - package_name @@ -9459,7 +9416,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - queued_events @@ -9478,7 +9434,6 @@ components: type: string format: date-time title: Created At - additionalProperties: false type: object required: - dag_id @@ -9509,7 +9464,6 @@ components: - type: string - type: 'null' title: Latest Scheduler Heartbeat - additionalProperties: false type: object required: - status @@ -9536,7 +9490,6 @@ components: - RL - TB title: Arrange - additionalProperties: false type: object required: - edges @@ -9554,7 +9507,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - tasks @@ -9568,7 +9520,6 @@ components: $ref: '#/components/schemas/TaskDependencyResponse' type: array title: Dependencies - additionalProperties: false type: object required: - dependencies @@ -9582,7 +9533,6 @@ components: reason: type: string title: Reason - additionalProperties: false type: object required: - name @@ -9599,7 +9549,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - task_instances @@ -9616,7 +9565,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - task_instances @@ -9717,7 +9665,6 @@ components: executor_config: type: string title: Executor Config - additionalProperties: false type: object required: - task_id @@ -9867,7 +9814,6 @@ components: anyOf: - $ref: '#/components/schemas/JobResponse' - type: 'null' - additionalProperties: false type: object required: - id @@ -9961,7 +9907,6 @@ components: deferred: type: integer title: Deferred - additionalProperties: false type: object required: - no_status @@ -10275,7 +10220,6 @@ components: title: Extra Links description: Extract and return extra_links. readOnly: true - additionalProperties: false type: object required: - task_id @@ -10380,7 +10324,6 @@ components: - type: integer - type: 'null' title: Triggerer Id - additionalProperties: false type: object required: - id @@ -10402,7 +10345,6 @@ components: - type: string - type: 'null' title: Latest Triggerer Heartbeat - additionalProperties: false type: object required: - status @@ -10461,7 +10403,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - variables @@ -10484,7 +10425,6 @@ components: is_encrypted: type: boolean title: Is Encrypted - additionalProperties: false type: object required: - key @@ -10503,14 +10443,13 @@ components: - type: string - type: 'null' title: Git Version - additionalProperties: false type: object required: - version - git_version title: VersionInfo description: Version information serializer for responses. - XComCollection: + XComCollectionResponse: properties: xcom_entries: items: @@ -10520,13 +10459,12 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - xcom_entries - total_entries - title: XComCollection - description: List of XCom items. + title: XComCollectionResponse + description: XCom Collection serializer for responses. XComResponse: properties: key: @@ -10552,7 +10490,6 @@ components: run_id: type: string title: Run Id - additionalProperties: false type: object required: - key @@ -10591,7 +10528,6 @@ components: title: Run Id value: title: Value - additionalProperties: false type: object required: - key @@ -10634,7 +10570,6 @@ components: - type: string - type: 'null' title: Value - additionalProperties: false type: object required: - key diff --git a/airflow/api_fastapi/core_api/routes/public/xcom.py b/airflow/api_fastapi/core_api/routes/public/xcom.py index 524d0722d1caa..b8fa6456e570d 100644 --- a/airflow/api_fastapi/core_api/routes/public/xcom.py +++ b/airflow/api_fastapi/core_api/routes/public/xcom.py @@ -26,7 +26,7 @@ from airflow.api_fastapi.common.parameters import QueryLimit, QueryOffset from airflow.api_fastapi.common.router import AirflowRouter from airflow.api_fastapi.core_api.datamodels.xcom import ( - XComCollection, + XComCollectionResponse, XComResponseNative, XComResponseString, ) @@ -112,7 +112,7 @@ def get_xcom_entries( session: SessionDep, xcom_key: Annotated[str | None, Query()] = None, map_index: Annotated[int | None, Query(ge=-1)] = None, -) -> XComCollection: +) -> XComCollectionResponse: """ Get all XCom entries. @@ -140,4 +140,4 @@ def get_xcom_entries( ) query = query.order_by(XCom.dag_id, XCom.task_id, XCom.run_id, XCom.map_index, XCom.key) xcoms = session.scalars(query) - return XComCollection(xcom_entries=xcoms, total_entries=total_entries) + return XComCollectionResponse(xcom_entries=xcoms, total_entries=total_entries) diff --git a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py b/airflow/api_fastapi/execution_api/datamodels/taskinstance.py index 6cc82259cf758..f0a50acdb7294 100644 --- a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py +++ b/airflow/api_fastapi/execution_api/datamodels/taskinstance.py @@ -32,7 +32,7 @@ ) from airflow.api_fastapi.common.types import UtcDateTime -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import StrictBaseModel from airflow.api_fastapi.execution_api.datamodels.asset import AssetProfile from airflow.api_fastapi.execution_api.datamodels.connection import ConnectionResponse from airflow.api_fastapi.execution_api.datamodels.variable import VariableResponse @@ -42,7 +42,7 @@ AwareDatetimeAdapter = TypeAdapter(AwareDatetime) -class TIEnterRunningPayload(BaseModel): +class TIEnterRunningPayload(StrictBaseModel): """Schema for updating TaskInstance to 'RUNNING' state with minimal required fields.""" state: Annotated[ @@ -60,7 +60,7 @@ class TIEnterRunningPayload(BaseModel): """When the task started executing""" -class TITerminalStatePayload(BaseModel): +class TITerminalStatePayload(StrictBaseModel): """Schema for updating TaskInstance to a terminal state except SUCCESS state.""" state: Literal[ @@ -74,7 +74,7 @@ class TITerminalStatePayload(BaseModel): """When the task completed executing""" -class TISuccessStatePayload(BaseModel): +class TISuccessStatePayload(StrictBaseModel): """Schema for updating TaskInstance to success state.""" state: Annotated[ @@ -96,13 +96,13 @@ class TISuccessStatePayload(BaseModel): outlet_events: Annotated[list[Any], Field(default_factory=list)] -class TITargetStatePayload(BaseModel): +class TITargetStatePayload(StrictBaseModel): """Schema for updating TaskInstance to a target state, excluding terminal and running states.""" state: IntermediateTIState -class TIDeferredStatePayload(BaseModel): +class TIDeferredStatePayload(StrictBaseModel): """Schema for updating TaskInstance to a deferred state.""" state: Annotated[ @@ -128,7 +128,7 @@ def validate_moment(cls, v): return v -class TIRescheduleStatePayload(BaseModel): +class TIRescheduleStatePayload(StrictBaseModel): """Schema for updating TaskInstance to a up_for_reschedule state.""" state: Annotated[ @@ -146,7 +146,7 @@ class TIRescheduleStatePayload(BaseModel): end_date: UtcDateTime -def ti_state_discriminator(v: dict[str, str] | BaseModel) -> str: +def ti_state_discriminator(v: dict[str, str] | StrictBaseModel) -> str: """ Determine the discriminator key for TaskInstance state transitions. @@ -185,7 +185,7 @@ def ti_state_discriminator(v: dict[str, str] | BaseModel) -> str: ] -class TIHeartbeatInfo(BaseModel): +class TIHeartbeatInfo(StrictBaseModel): """Schema for TaskInstance heartbeat endpoint.""" hostname: str @@ -194,7 +194,7 @@ class TIHeartbeatInfo(BaseModel): # This model is not used in the API, but it is included in generated OpenAPI schema # for use in the client SDKs. -class TaskInstance(BaseModel): +class TaskInstance(StrictBaseModel): """Schema for TaskInstance model with minimal required fields needed for Runtime.""" id: uuid.UUID @@ -207,7 +207,7 @@ class TaskInstance(BaseModel): hostname: str | None = None -class DagRun(BaseModel): +class DagRun(StrictBaseModel): """Schema for DagRun model with minimal required fields needed for Runtime.""" # TODO: `dag_id` and `run_id` are duplicated from TaskInstance @@ -226,7 +226,7 @@ class DagRun(BaseModel): external_trigger: bool = False -class TIRunContext(BaseModel): +class TIRunContext(StrictBaseModel): """Response schema for TaskInstance run context.""" dag_run: DagRun @@ -242,7 +242,7 @@ class TIRunContext(BaseModel): """Connections that can be accessed by the task instance.""" -class PrevSuccessfulDagRunResponse(BaseModel): +class PrevSuccessfulDagRunResponse(StrictBaseModel): """Schema for response with previous successful DagRun information for Task Template Context.""" data_interval_start: UtcDateTime | None = None diff --git a/airflow/api_fastapi/execution_api/datamodels/token.py b/airflow/api_fastapi/execution_api/datamodels/token.py index 568fdcf592a8a..1886fdaceee70 100644 --- a/airflow/api_fastapi/execution_api/datamodels/token.py +++ b/airflow/api_fastapi/execution_api/datamodels/token.py @@ -17,11 +17,11 @@ from __future__ import annotations -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import StrictBaseModel # TODO: This is a placeholder for Task Identity Token schema. -class TIToken(BaseModel): +class TIToken(StrictBaseModel): """Task Identity Token.""" ti_key: str diff --git a/airflow/api_fastapi/execution_api/datamodels/variable.py b/airflow/api_fastapi/execution_api/datamodels/variable.py index 6c597524763aa..73361908a810f 100644 --- a/airflow/api_fastapi/execution_api/datamodels/variable.py +++ b/airflow/api_fastapi/execution_api/datamodels/variable.py @@ -19,7 +19,7 @@ from pydantic import Field -from airflow.api_fastapi.core_api.base import BaseModel, ConfigDict +from airflow.api_fastapi.core_api.base import BaseModel, ConfigDict, StrictBaseModel class VariableResponse(BaseModel): @@ -29,7 +29,7 @@ class VariableResponse(BaseModel): val: str | None = Field(alias="value") -class VariablePostBody(BaseModel): +class VariablePostBody(StrictBaseModel): """Request body schema for creating variables.""" model_config = ConfigDict(extra="forbid") diff --git a/airflow/auth/managers/simple/datamodels/login.py b/airflow/auth/managers/simple/datamodels/login.py index 9d8eef55d23ba..a32f65045deb5 100644 --- a/airflow/auth/managers/simple/datamodels/login.py +++ b/airflow/auth/managers/simple/datamodels/login.py @@ -19,10 +19,10 @@ from pydantic import Field -from airflow.api_fastapi.core_api.base import BaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel -class LoginResponse(BaseModel): +class LoginResponse(StrictBaseModel): """Login serializer for responses.""" jwt_token: str diff --git a/airflow/auth/managers/simple/openapi/v1-generated.yaml b/airflow/auth/managers/simple/openapi/v1-generated.yaml index d8103ad7e0b56..3ea91823ccde0 100644 --- a/airflow/auth/managers/simple/openapi/v1-generated.yaml +++ b/airflow/auth/managers/simple/openapi/v1-generated.yaml @@ -75,7 +75,6 @@ components: password: type: string title: Password - additionalProperties: false type: object required: - username diff --git a/airflow/ui/openapi-gen/queries/prefetch.ts b/airflow/ui/openapi-gen/queries/prefetch.ts index 63a949aca94e6..b40c3243b0ded 100644 --- a/airflow/ui/openapi-gen/queries/prefetch.ts +++ b/airflow/ui/openapi-gen/queries/prefetch.ts @@ -2123,7 +2123,7 @@ export const prefetchUseXcomServiceGetXcomEntry = ( * @param data.mapIndex * @param data.limit * @param data.offset - * @returns XComCollection Successful Response + * @returns XComCollectionResponse Successful Response * @throws ApiError */ export const prefetchUseXcomServiceGetXcomEntries = ( diff --git a/airflow/ui/openapi-gen/queries/queries.ts b/airflow/ui/openapi-gen/queries/queries.ts index c4d201767e17d..04905e188e495 100644 --- a/airflow/ui/openapi-gen/queries/queries.ts +++ b/airflow/ui/openapi-gen/queries/queries.ts @@ -2503,7 +2503,7 @@ export const useXcomServiceGetXcomEntry = < * @param data.mapIndex * @param data.limit * @param data.offset - * @returns XComCollection Successful Response + * @returns XComCollectionResponse Successful Response * @throws ApiError */ export const useXcomServiceGetXcomEntries = < diff --git a/airflow/ui/openapi-gen/queries/suspense.ts b/airflow/ui/openapi-gen/queries/suspense.ts index d2f3bfc937c72..63beafe117da2 100644 --- a/airflow/ui/openapi-gen/queries/suspense.ts +++ b/airflow/ui/openapi-gen/queries/suspense.ts @@ -2482,7 +2482,7 @@ export const useXcomServiceGetXcomEntrySuspense = < * @param data.mapIndex * @param data.limit * @param data.offset - * @returns XComCollection Successful Response + * @returns XComCollectionResponse Successful Response * @throws ApiError */ export const useXcomServiceGetXcomEntriesSuspense = < diff --git a/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow/ui/openapi-gen/requests/schemas.gen.ts index eef3480f67e77..6b8fc0fd9d1d8 100644 --- a/airflow/ui/openapi-gen/requests/schemas.gen.ts +++ b/airflow/ui/openapi-gen/requests/schemas.gen.ts @@ -103,7 +103,6 @@ export const $AssetAliasCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["asset_aliases", "total_entries"], title: "AssetAliasCollectionResponse", @@ -125,7 +124,6 @@ export const $AssetAliasResponse = { title: "Group", }, }, - additionalProperties: false, type: "object", required: ["id", "name", "group"], title: "AssetAliasResponse", @@ -146,7 +144,6 @@ export const $AssetCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["assets", "total_entries"], title: "AssetCollectionResponse", @@ -167,7 +164,6 @@ export const $AssetEventCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["asset_events", "total_entries"], title: "AssetEventCollectionResponse", @@ -278,7 +274,6 @@ export const $AssetEventResponse = { title: "Timestamp", }, }, - additionalProperties: false, type: "object", required: ["id", "asset_id", "source_map_index", "created_dagruns", "timestamp"], title: "AssetEventResponse", @@ -346,7 +341,6 @@ export const $AssetResponse = { title: "Aliases", }, }, - additionalProperties: false, type: "object", required: [ "id", @@ -518,7 +512,6 @@ export const $BaseInfoResponse = { title: "Status", }, }, - additionalProperties: false, type: "object", required: ["status"], title: "BaseInfoResponse", @@ -568,7 +561,6 @@ export const $BulkActionResponse = { default: [], }, }, - additionalProperties: false, type: "object", title: "BulkActionResponse", description: `Serializer for individual bulk action responses. @@ -842,7 +834,6 @@ export const $BulkResponse = { description: "Details of the bulk delete operation, including successful keys and errors.", }, }, - additionalProperties: false, type: "object", title: "BulkResponse", description: `Serializer for responses to bulk entity operations. @@ -1336,7 +1327,6 @@ export const $ConnectionCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["connections", "total_entries"], title: "ConnectionCollectionResponse", @@ -1431,7 +1421,6 @@ export const $ConnectionResponse = { title: "Extra", }, }, - additionalProperties: false, type: "object", required: [ "connection_id", @@ -1459,7 +1448,6 @@ export const $ConnectionTestResponse = { title: "Message", }, }, - additionalProperties: false, type: "object", required: ["status", "message"], title: "ConnectionTestResponse", @@ -1498,7 +1486,6 @@ export const $DAGCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["dags", "total_entries"], title: "DAGCollectionResponse", @@ -1822,7 +1809,6 @@ export const $DAGDetailsResponse = { readOnly: true, }, }, - additionalProperties: false, type: "object", required: [ "dag_id", @@ -2066,7 +2052,6 @@ export const $DAGResponse = { readOnly: true, }, }, - additionalProperties: false, type: "object", required: [ "dag_id", @@ -2130,7 +2115,6 @@ export const $DAGRunCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["dag_runs", "total_entries"], title: "DAGRunCollectionResponse", @@ -2298,7 +2282,6 @@ export const $DAGRunResponse = { title: "Note", }, }, - additionalProperties: false, type: "object", required: [ "dag_run_id", @@ -2340,7 +2323,6 @@ export const $DAGRunStates = { title: "Failed", }, }, - additionalProperties: false, type: "object", required: ["queued", "running", "success", "failed"], title: "DAGRunStates", @@ -2366,7 +2348,6 @@ export const $DAGRunTypes = { title: "Asset Triggered", }, }, - additionalProperties: false, type: "object", required: ["backfill", "scheduled", "manual", "asset_triggered"], title: "DAGRunTypes", @@ -2541,7 +2522,6 @@ export const $DAGSourceResponse = { title: "Version Number", }, }, - additionalProperties: false, type: "object", required: ["content", "dag_id", "version_number"], title: "DAGSourceResponse", @@ -2562,7 +2542,6 @@ export const $DAGTagCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["tags", "total_entries"], title: "DAGTagCollectionResponse", @@ -2583,7 +2562,6 @@ export const $DAGWarningCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["dag_warnings", "total_entries"], title: "DAGWarningCollectionResponse", @@ -2609,7 +2587,6 @@ export const $DAGWarningResponse = { title: "Timestamp", }, }, - additionalProperties: false, type: "object", required: ["dag_id", "warning_type", "message", "timestamp"], title: "DAGWarningResponse", @@ -2630,7 +2607,6 @@ export const $DAGWithLatestDagRunsCollectionResponse = { title: "Dags", }, }, - additionalProperties: false, type: "object", required: ["total_entries", "dags"], title: "DAGWithLatestDagRunsCollectionResponse", @@ -2830,7 +2806,6 @@ export const $DAGWithLatestDagRunsResponse = { readOnly: true, }, }, - additionalProperties: false, type: "object", required: [ "dag_id", @@ -2887,7 +2862,6 @@ export const $DagProcessorInfoResponse = { title: "Latest Dag Processor Heartbeat", }, }, - additionalProperties: false, type: "object", required: ["status", "latest_dag_processor_heartbeat"], title: "DagProcessorInfoResponse", @@ -3020,7 +2994,6 @@ export const $DagStatsCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["dags", "total_entries"], title: "DagStatsCollectionResponse", @@ -3041,7 +3014,6 @@ export const $DagStatsResponse = { title: "Stats", }, }, - additionalProperties: false, type: "object", required: ["dag_id", "stats"], title: "DagStatsResponse", @@ -3058,7 +3030,6 @@ export const $DagStatsStateResponse = { title: "Count", }, }, - additionalProperties: false, type: "object", required: ["state", "count"], title: "DagStatsStateResponse", @@ -3076,7 +3047,6 @@ export const $DagTagResponse = { title: "Dag Id", }, }, - additionalProperties: false, type: "object", required: ["name", "dag_id"], title: "DagTagResponse", @@ -3173,7 +3143,6 @@ export const $EdgeResponse = { title: "Is Source Asset", }, }, - additionalProperties: false, type: "object", required: ["source_id", "target_id"], title: "EdgeResponse", @@ -3194,7 +3163,6 @@ export const $EventLogCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["event_logs", "total_entries"], title: "EventLogCollectionResponse", @@ -3306,7 +3274,6 @@ export const $EventLogResponse = { title: "Extra", }, }, - additionalProperties: false, type: "object", required: [ "event_log_id", @@ -3658,7 +3625,6 @@ export const $HealthInfoResponse = { ], }, }, - additionalProperties: false, type: "object", required: ["metadatabase", "scheduler", "triggerer"], title: "HealthInfoResponse", @@ -3677,7 +3643,6 @@ export const $HistoricalMetricDataResponse = { $ref: "#/components/schemas/TaskInstanceStateCount", }, }, - additionalProperties: false, type: "object", required: ["dag_run_types", "dag_run_states", "task_instance_states"], title: "HistoricalMetricDataResponse", @@ -3698,7 +3663,6 @@ export const $ImportErrorCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["import_errors", "total_entries"], title: "ImportErrorCollectionResponse", @@ -3729,7 +3693,6 @@ export const $ImportErrorResponse = { title: "Stack Trace", }, }, - additionalProperties: false, type: "object", required: ["import_error_id", "timestamp", "filename", "bundle_name", "stack_trace"], title: "ImportErrorResponse", @@ -3750,7 +3713,6 @@ export const $JobCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["jobs", "total_entries"], title: "JobCollectionResponse", @@ -3867,7 +3829,6 @@ export const $JobResponse = { title: "Unixname", }, }, - additionalProperties: false, type: "object", required: [ "id", @@ -3972,7 +3933,6 @@ export const $NodeResponse = { title: "Asset Condition Type", }, }, - additionalProperties: false, type: "object", required: ["id", "label", "type"], title: "NodeResponse", @@ -4301,7 +4261,6 @@ export const $PoolResponse = { title: "Deferred Slots", }, }, - additionalProperties: false, type: "object", required: [ "name", @@ -4333,7 +4292,6 @@ export const $ProviderCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["providers", "total_entries"], title: "ProviderCollectionResponse", @@ -4355,7 +4313,6 @@ export const $ProviderResponse = { title: "Version", }, }, - additionalProperties: false, type: "object", required: ["package_name", "description", "version"], title: "ProviderResponse", @@ -4376,7 +4333,6 @@ export const $QueuedEventCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["queued_events", "total_entries"], title: "QueuedEventCollectionResponse", @@ -4399,7 +4355,6 @@ export const $QueuedEventResponse = { title: "Created At", }, }, - additionalProperties: false, type: "object", required: ["dag_id", "asset_id", "created_at"], title: "QueuedEventResponse", @@ -4440,7 +4395,6 @@ export const $SchedulerInfoResponse = { title: "Latest Scheduler Heartbeat", }, }, - additionalProperties: false, type: "object", required: ["status", "latest_scheduler_heartbeat"], title: "SchedulerInfoResponse", @@ -4469,7 +4423,6 @@ export const $StructureDataResponse = { title: "Arrange", }, }, - additionalProperties: false, type: "object", required: ["edges", "nodes", "arrange"], title: "StructureDataResponse", @@ -4490,7 +4443,6 @@ export const $TaskCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["tasks", "total_entries"], title: "TaskCollectionResponse", @@ -4507,7 +4459,6 @@ export const $TaskDependencyCollectionResponse = { title: "Dependencies", }, }, - additionalProperties: false, type: "object", required: ["dependencies"], title: "TaskDependencyCollectionResponse", @@ -4525,7 +4476,6 @@ export const $TaskDependencyResponse = { title: "Reason", }, }, - additionalProperties: false, type: "object", required: ["name", "reason"], title: "TaskDependencyResponse", @@ -4546,7 +4496,6 @@ export const $TaskInstanceCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["task_instances", "total_entries"], title: "TaskInstanceCollectionResponse", @@ -4567,7 +4516,6 @@ export const $TaskInstanceHistoryCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["task_instances", "total_entries"], title: "TaskInstanceHistoryCollectionResponse", @@ -4751,7 +4699,6 @@ export const $TaskInstanceHistoryResponse = { title: "Executor Config", }, }, - additionalProperties: false, type: "object", required: [ "task_id", @@ -5014,7 +4961,6 @@ export const $TaskInstanceResponse = { ], }, }, - additionalProperties: false, type: "object", required: [ "id", @@ -5127,7 +5073,6 @@ export const $TaskInstanceStateCount = { title: "Deferred", }, }, - additionalProperties: false, type: "object", required: [ "no_status", @@ -5714,7 +5659,6 @@ export const $TaskResponse = { readOnly: true, }, }, - additionalProperties: false, type: "object", required: [ "task_id", @@ -5865,7 +5809,6 @@ export const $TriggerResponse = { title: "Triggerer Id", }, }, - additionalProperties: false, type: "object", required: ["id", "classpath", "kwargs", "created_date", "triggerer_id"], title: "TriggerResponse", @@ -5897,7 +5840,6 @@ export const $TriggererInfoResponse = { title: "Latest Triggerer Heartbeat", }, }, - additionalProperties: false, type: "object", required: ["status", "latest_triggerer_heartbeat"], title: "TriggererInfoResponse", @@ -5978,7 +5920,6 @@ export const $VariableCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["variables", "total_entries"], title: "VariableCollectionResponse", @@ -6011,7 +5952,6 @@ export const $VariableResponse = { title: "Is Encrypted", }, }, - additionalProperties: false, type: "object", required: ["key", "value", "description", "is_encrypted"], title: "VariableResponse", @@ -6036,14 +5976,13 @@ export const $VersionInfo = { title: "Git Version", }, }, - additionalProperties: false, type: "object", required: ["version", "git_version"], title: "VersionInfo", description: "Version information serializer for responses.", } as const; -export const $XComCollection = { +export const $XComCollectionResponse = { properties: { xcom_entries: { items: { @@ -6057,11 +5996,10 @@ export const $XComCollection = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["xcom_entries", "total_entries"], - title: "XComCollection", - description: "List of XCom items.", + title: "XComCollectionResponse", + description: "XCom Collection serializer for responses.", } as const; export const $XComResponse = { @@ -6097,7 +6035,6 @@ export const $XComResponse = { title: "Run Id", }, }, - additionalProperties: false, type: "object", required: ["key", "timestamp", "logical_date", "map_index", "task_id", "dag_id", "run_id"], title: "XComResponse", @@ -6140,7 +6077,6 @@ export const $XComResponseNative = { title: "Value", }, }, - additionalProperties: false, type: "object", required: ["key", "timestamp", "logical_date", "map_index", "task_id", "dag_id", "run_id", "value"], title: "XComResponseNative", @@ -6191,7 +6127,6 @@ export const $XComResponseString = { title: "Value", }, }, - additionalProperties: false, type: "object", required: ["key", "timestamp", "logical_date", "map_index", "task_id", "dag_id", "run_id", "value"], title: "XComResponseString", diff --git a/airflow/ui/openapi-gen/requests/services.gen.ts b/airflow/ui/openapi-gen/requests/services.gen.ts index bf6e528da11ed..0e3c33dba9d65 100644 --- a/airflow/ui/openapi-gen/requests/services.gen.ts +++ b/airflow/ui/openapi-gen/requests/services.gen.ts @@ -2978,7 +2978,7 @@ export class XcomService { * @param data.mapIndex * @param data.limit * @param data.offset - * @returns XComCollection Successful Response + * @returns XComCollectionResponse Successful Response * @throws ApiError */ public static getXcomEntries(data: GetXcomEntriesData): CancelablePromise { diff --git a/airflow/ui/openapi-gen/requests/types.gen.ts b/airflow/ui/openapi-gen/requests/types.gen.ts index 6ff1a083ec6e8..3db3e1ea2ecf1 100644 --- a/airflow/ui/openapi-gen/requests/types.gen.ts +++ b/airflow/ui/openapi-gen/requests/types.gen.ts @@ -1469,9 +1469,9 @@ export type VersionInfo = { }; /** - * List of XCom items. + * XCom Collection serializer for responses. */ -export type XComCollection = { +export type XComCollectionResponse = { xcom_entries: Array; total_entries: number; }; @@ -2300,7 +2300,7 @@ export type GetXcomEntriesData = { xcomKey?: string | null; }; -export type GetXcomEntriesResponse = XComCollection; +export type GetXcomEntriesResponse = XComCollectionResponse; export type GetTasksData = { dagId: string; @@ -4698,7 +4698,7 @@ export type $OpenApiTs = { /** * Successful Response */ - 200: XComCollection; + 200: XComCollectionResponse; /** * Bad Request */ From f1ffc47cb990066d5cca65fb9e5554357e5453c4 Mon Sep 17 00:00:00 2001 From: kalyanr Date: Thu, 30 Jan 2025 17:06:22 +0530 Subject: [PATCH 5/6] fix --- airflow/api_fastapi/core_api/datamodels/backfills.py | 10 +++++----- airflow/api_fastapi/core_api/datamodels/pools.py | 4 ++-- airflow/api_fastapi/core_api/openapi/v1-generated.yaml | 5 ----- .../execution_api/datamodels/taskinstance.py | 6 +++--- airflow/api_fastapi/execution_api/datamodels/token.py | 4 ++-- airflow/auth/managers/simple/datamodels/login.py | 4 ++-- airflow/auth/managers/simple/openapi/v1-generated.yaml | 2 +- airflow/ui/openapi-gen/requests/schemas.gen.ts | 5 ----- 8 files changed, 15 insertions(+), 25 deletions(-) diff --git a/airflow/api_fastapi/core_api/datamodels/backfills.py b/airflow/api_fastapi/core_api/datamodels/backfills.py index 6721515ee7113..c74a7e2020313 100644 --- a/airflow/api_fastapi/core_api/datamodels/backfills.py +++ b/airflow/api_fastapi/core_api/datamodels/backfills.py @@ -19,7 +19,7 @@ from datetime import datetime -from airflow.api_fastapi.core_api.base import StrictBaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.models.backfill import ReprocessBehavior @@ -35,7 +35,7 @@ class BackfillPostBody(StrictBaseModel): max_active_runs: int = 10 -class BackfillResponse(StrictBaseModel): +class BackfillResponse(BaseModel): """Base serializer for Backfill.""" id: int @@ -51,20 +51,20 @@ class BackfillResponse(StrictBaseModel): updated_at: datetime -class BackfillCollectionResponse(StrictBaseModel): +class BackfillCollectionResponse(BaseModel): """Backfill Collection serializer for responses.""" backfills: list[BackfillResponse] total_entries: int -class DryRunBackfillResponse(StrictBaseModel): +class DryRunBackfillResponse(BaseModel): """Backfill serializer for responses in dry-run mode.""" logical_date: datetime -class DryRunBackfillCollectionResponse(StrictBaseModel): +class DryRunBackfillCollectionResponse(BaseModel): """Backfill collection serializer for responses in dry-run mode.""" backfills: list[DryRunBackfillResponse] diff --git a/airflow/api_fastapi/core_api/datamodels/pools.py b/airflow/api_fastapi/core_api/datamodels/pools.py index 2763e9160494e..096e357dfaf1d 100644 --- a/airflow/api_fastapi/core_api/datamodels/pools.py +++ b/airflow/api_fastapi/core_api/datamodels/pools.py @@ -53,7 +53,7 @@ class PoolResponse(BasePool): deferred_slots: Annotated[int, BeforeValidator(_call_function)] -class PoolCollectionResponse(StrictBaseModel): +class PoolCollectionResponse(BaseModel): """Pool Collection serializer for responses.""" pools: list[PoolResponse] @@ -71,7 +71,7 @@ class PoolPatchBody(StrictBaseModel): include_deferred: bool | None = None -class PoolBody(StrictBaseModel, BasePool): +class PoolBody(BasePool, StrictBaseModel): """Pool serializer for post bodies.""" pool: str = Field(alias="name", max_length=256) diff --git a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml index 90726483bcff1..4ffef0ab838cc 100644 --- a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml +++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml @@ -6751,7 +6751,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - backfills @@ -6835,7 +6834,6 @@ components: type: string format: date-time title: Updated At - additionalProperties: false type: object required: - id @@ -8594,7 +8592,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - backfills @@ -8607,7 +8604,6 @@ components: type: string format: date-time title: Logical Date - additionalProperties: false type: object required: - logical_date @@ -9291,7 +9287,6 @@ components: total_entries: type: integer title: Total Entries - additionalProperties: false type: object required: - pools diff --git a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py b/airflow/api_fastapi/execution_api/datamodels/taskinstance.py index f0a50acdb7294..abb2f6fa23c0a 100644 --- a/airflow/api_fastapi/execution_api/datamodels/taskinstance.py +++ b/airflow/api_fastapi/execution_api/datamodels/taskinstance.py @@ -32,7 +32,7 @@ ) from airflow.api_fastapi.common.types import UtcDateTime -from airflow.api_fastapi.core_api.base import StrictBaseModel +from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel from airflow.api_fastapi.execution_api.datamodels.asset import AssetProfile from airflow.api_fastapi.execution_api.datamodels.connection import ConnectionResponse from airflow.api_fastapi.execution_api.datamodels.variable import VariableResponse @@ -226,7 +226,7 @@ class DagRun(StrictBaseModel): external_trigger: bool = False -class TIRunContext(StrictBaseModel): +class TIRunContext(BaseModel): """Response schema for TaskInstance run context.""" dag_run: DagRun @@ -242,7 +242,7 @@ class TIRunContext(StrictBaseModel): """Connections that can be accessed by the task instance.""" -class PrevSuccessfulDagRunResponse(StrictBaseModel): +class PrevSuccessfulDagRunResponse(BaseModel): """Schema for response with previous successful DagRun information for Task Template Context.""" data_interval_start: UtcDateTime | None = None diff --git a/airflow/api_fastapi/execution_api/datamodels/token.py b/airflow/api_fastapi/execution_api/datamodels/token.py index 1886fdaceee70..568fdcf592a8a 100644 --- a/airflow/api_fastapi/execution_api/datamodels/token.py +++ b/airflow/api_fastapi/execution_api/datamodels/token.py @@ -17,11 +17,11 @@ from __future__ import annotations -from airflow.api_fastapi.core_api.base import StrictBaseModel +from airflow.api_fastapi.core_api.base import BaseModel # TODO: This is a placeholder for Task Identity Token schema. -class TIToken(StrictBaseModel): +class TIToken(BaseModel): """Task Identity Token.""" ti_key: str diff --git a/airflow/auth/managers/simple/datamodels/login.py b/airflow/auth/managers/simple/datamodels/login.py index a32f65045deb5..ff4883625eccd 100644 --- a/airflow/auth/managers/simple/datamodels/login.py +++ b/airflow/auth/managers/simple/datamodels/login.py @@ -22,13 +22,13 @@ from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel -class LoginResponse(StrictBaseModel): +class LoginResponse(BaseModel): """Login serializer for responses.""" jwt_token: str -class LoginBody(BaseModel): +class LoginBody(StrictBaseModel): """Login serializer for post bodies.""" username: str = Field() diff --git a/airflow/auth/managers/simple/openapi/v1-generated.yaml b/airflow/auth/managers/simple/openapi/v1-generated.yaml index 3ea91823ccde0..d0efc68864d17 100644 --- a/airflow/auth/managers/simple/openapi/v1-generated.yaml +++ b/airflow/auth/managers/simple/openapi/v1-generated.yaml @@ -75,6 +75,7 @@ components: password: type: string title: Password + additionalProperties: false type: object required: - username @@ -86,7 +87,6 @@ components: jwt_token: type: string title: Jwt Token - additionalProperties: false type: object required: - jwt_token diff --git a/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow/ui/openapi-gen/requests/schemas.gen.ts index 6b8fc0fd9d1d8..8b30ecc9c1ec0 100644 --- a/airflow/ui/openapi-gen/requests/schemas.gen.ts +++ b/airflow/ui/openapi-gen/requests/schemas.gen.ts @@ -371,7 +371,6 @@ export const $BackfillCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["backfills", "total_entries"], title: "BackfillCollectionResponse", @@ -479,7 +478,6 @@ export const $BackfillResponse = { title: "Updated At", }, }, - additionalProperties: false, type: "object", required: [ "id", @@ -3077,7 +3075,6 @@ export const $DryRunBackfillCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["backfills", "total_entries"], title: "DryRunBackfillCollectionResponse", @@ -3092,7 +3089,6 @@ export const $DryRunBackfillResponse = { title: "Logical Date", }, }, - additionalProperties: false, type: "object", required: ["logical_date"], title: "DryRunBackfillResponse", @@ -4151,7 +4147,6 @@ export const $PoolCollectionResponse = { title: "Total Entries", }, }, - additionalProperties: false, type: "object", required: ["pools", "total_entries"], title: "PoolCollectionResponse", From 79b41de351bde1e22471aec751bcd919f87b9e7b Mon Sep 17 00:00:00 2001 From: kalyanr Date: Thu, 30 Jan 2025 17:28:26 +0530 Subject: [PATCH 6/6] update docstring --- airflow/api_fastapi/core_api/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/airflow/api_fastapi/core_api/base.py b/airflow/api_fastapi/core_api/base.py index 3f4972b9b389b..d88ec1757eb60 100644 --- a/airflow/api_fastapi/core_api/base.py +++ b/airflow/api_fastapi/core_api/base.py @@ -31,7 +31,9 @@ class BaseModel(PydanticBaseModel): class StrictBaseModel(BaseModel): """ - Base pydantic model for REST API. + StrictBaseModel is a base Pydantic model for REST API that does not allow any extra fields. + + Use this class for models that should not have any extra fields in the payload. :meta private: """