Coverage for /home/airflow/.local/lib/python3.12/site-packages/airflow/api_fastapi/execution_api/routes/task_reschedules.py: 100%
13 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 14:22 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 14:22 +0000
1# Licensed to the Apache Software Foundation (ASF) under one
2# or more contributor license agreements. See the NOTICE file
3# distributed with this work for additional information
4# regarding copyright ownership. The ASF licenses this file
5# to you under the Apache License, Version 2.0 (the
6# "License"); you may not use this file except in compliance
7# with the License. You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing,
12# software distributed under the License is distributed on an
13# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14# KIND, either express or implied. See the License for the
15# specific language governing permissions and limitations
16# under the License.
18from __future__ import annotations
20from uuid import UUID
22from fastapi import APIRouter, Security, status
23from sqlalchemy import select
25from airflow.api_fastapi.common.db.common import SessionDep
26from airflow.api_fastapi.common.types import UtcDateTime
27from airflow.api_fastapi.execution_api.security import require_auth
28from airflow.models.taskreschedule import TaskReschedule
30router = APIRouter(
31 dependencies=[
32 # Validates that the JWT sub matches the task_instance_id path parameter.
33 Security(require_auth, scopes=["ti:self"]),
34 ],
35 responses={
36 status.HTTP_404_NOT_FOUND: {"description": "Task Instance not found"},
37 status.HTTP_401_UNAUTHORIZED: {"description": "Unauthorized"},
38 },
39)
42@router.get("/{task_instance_id}/start_date")
43def get_start_date(task_instance_id: UUID, session: SessionDep) -> UtcDateTime | None:
44 """Get the first reschedule date if found, None if no records exist."""
45 start_date = session.scalar(
46 select(TaskReschedule.start_date)
47 .where(TaskReschedule.ti_id == task_instance_id)
48 .order_by(TaskReschedule.id.asc())
49 .limit(1)
50 )
52 return start_date