This is an automated email from the ASF dual-hosted git repository.
kaxilnaik pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 39a16c0c4d9 Reorganize ``api_fastapi`` folder into apps (#43062)
39a16c0c4d9 is described below
commit 39a16c0c4d90ca374e0b025d8b64cf911d555f24
Author: Kaxil Naik <[email protected]>
AuthorDate: Wed Oct 16 13:37:36 2024 +0100
Reorganize ``api_fastapi`` folder into apps (#43062)
---
.pre-commit-config.yaml | 2 +-
airflow/api_fastapi/app.py | 79 ++--------------------
airflow/api_fastapi/{db => common}/__init__.py | 0
.../api_fastapi/{openapi => common/db}/__init__.py | 0
airflow/api_fastapi/{ => common}/db/common.py | 2 +-
airflow/api_fastapi/{ => common}/db/dags.py | 0
airflow/api_fastapi/{ => common}/parameters.py | 0
airflow/api_fastapi/{routes => common}/router.py | 0
.../api_fastapi/{routes => core_api}/__init__.py | 0
airflow/api_fastapi/{ => core_api}/app.py | 61 ++---------------
.../{serializers => core_api/openapi}/__init__.py | 0
.../{ => core_api}/openapi/exceptions.py | 0
.../{ => core_api}/openapi/v1-generated.yaml | 2 +-
.../api_fastapi/core_api}/routes/__init__.py | 0
.../{ => core_api}/routes/public/__init__.py | 12 ++--
.../{ => core_api}/routes/public/connections.py | 13 ++--
.../{ => core_api}/routes/public/dag_run.py | 8 +--
.../{ => core_api}/routes/public/dags.py | 12 ++--
.../{ => core_api}/routes/public/monitor.py | 4 +-
.../{ => core_api}/routes/public/variables.py | 8 +--
.../{ => core_api}/routes/ui/__init__.py | 6 +-
.../api_fastapi/{ => core_api}/routes/ui/assets.py | 4 +-
.../{ => core_api}/routes/ui/dashboard.py | 10 +--
.../api_fastapi/core_api/serializers}/__init__.py | 0
.../{ => core_api}/serializers/connections.py | 0
.../{ => core_api}/serializers/dag_run.py | 0
.../api_fastapi/{ => core_api}/serializers/dags.py | 0
.../{ => core_api}/serializers/dashboard.py | 0
.../{ => core_api}/serializers/monitor.py | 0
.../{ => core_api}/serializers/variables.py | 0
airflow/ui/package.json | 2 +-
contributing-docs/17_adding_api_endpoints.rst | 6 +-
.../in_container/run_update_fastapi_api_spec.py | 2 +-
.../{routes/ui => core_api}/__init__.py | 0
.../api_fastapi/core_api/routes}/__init__.py | 0
.../core_api/routes/public}/__init__.py | 0
.../routes/public/test_connections.py | 0
.../{ => core_api}/routes/public/test_dag_run.py | 0
.../{ => core_api}/routes/public/test_dags.py | 4 +-
.../{ => core_api}/routes/public/test_monitor.py | 0
.../{ => core_api}/routes/public/test_variables.py | 0
.../api_fastapi/core_api/routes/ui}/__init__.py | 0
.../{ => core_api}/routes/ui/test_assets.py | 0
.../{ => core_api}/routes/ui/test_dashboard.py | 0
44 files changed, 62 insertions(+), 175 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index fe4315fafc2..467f0e44d80 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -136,7 +136,7 @@ repos:
- --fuzzy-match-generates-todo
- id: insert-license
name: Add license for all YAML files except Helm templates
- exclude:
^\.github/.*$|^.*/.*_vendor/|^chart/templates/.*|.*/reproducible_build.yaml$|^airflow/api_fastapi/openapi/v1-generated.yaml$|^.*/pnpm-lock.yaml$
+ exclude:
^\.github/.*$|^.*/.*_vendor/|^chart/templates/.*|.*/reproducible_build.yaml$|^airflow/api_fastapi/core_api/openapi/v1-generated.yaml$|^.*/pnpm-lock.yaml$
types: [yaml]
files: \.ya?ml$
args:
diff --git a/airflow/api_fastapi/app.py b/airflow/api_fastapi/app.py
index 912b8496dd6..ffe13bec0fa 100644
--- a/airflow/api_fastapi/app.py
+++ b/airflow/api_fastapi/app.py
@@ -17,40 +17,25 @@
from __future__ import annotations
import logging
-import os
-from pathlib import Path
-from typing import cast
-from fastapi import FastAPI, Request
+from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
-from fastapi.responses import HTMLResponse
-from fastapi.staticfiles import StaticFiles
-from fastapi.templating import Jinja2Templates
-from airflow.settings import AIRFLOW_PATH
-from airflow.www.extensions.init_dagbag import get_dag_bag
+from airflow.api_fastapi.core_api.app import init_dag_bag, init_plugins,
init_views
log = logging.getLogger(__name__)
app: FastAPI | None = None
-def init_dag_bag(app: FastAPI) -> None:
- """
- Create global DagBag for the FastAPI application.
-
- To access it use ``request.app.state.dag_bag``.
- """
- app.state.dag_bag = get_dag_bag()
-
-
-def create_app() -> FastAPI:
+def create_app(apps: list[str] | None = None) -> FastAPI:
from airflow.configuration import conf
app = FastAPI(
+ title="Airflow API",
description="Airflow API. All endpoints located under ``/public`` can
be used safely, are stable and backward compatible. "
"Endpoints located under ``/ui`` are dedicated to the UI and are
subject to breaking change "
- "depending on the need of the frontend. Users should not rely on those
but use the public ones instead."
+ "depending on the need of the frontend. Users should not rely on those
but use the public ones instead.",
)
init_dag_bag(app)
@@ -75,60 +60,6 @@ def create_app() -> FastAPI:
return app
-def init_views(app: FastAPI) -> None:
- """Init views by registering the different routers."""
- from airflow.api_fastapi.routes.public import public_router
- from airflow.api_fastapi.routes.ui import ui_router
-
- app.include_router(ui_router)
- app.include_router(public_router)
-
- dev_mode = os.environ.get("DEV_MODE", False) == "true"
-
- directory = Path(AIRFLOW_PATH) / ("airflow/ui/dev" if dev_mode else
"airflow/ui/dist")
-
- # During python tests or when the backend is run without having the
frontend build
- # those directories might not exist. App should not fail initializing in
those scenarios.
- Path(directory).mkdir(exist_ok=True)
-
- templates = Jinja2Templates(directory=directory)
-
- app.mount(
- "/static",
- StaticFiles(
- directory=directory,
- html=True,
- ),
- name="webapp_static_folder",
- )
-
- @app.get("/webapp/{rest_of_path:path}", response_class=HTMLResponse,
include_in_schema=False)
- def webapp(request: Request, rest_of_path: str):
- return templates.TemplateResponse("/index.html", {"request": request},
media_type="text/html")
-
-
-def init_plugins(app: FastAPI) -> None:
- """Integrate FastAPI app plugins."""
- from airflow import plugins_manager
-
- plugins_manager.initialize_fastapi_plugins()
-
- # After calling initialize_fastapi_plugins, fastapi_apps cannot be None
anymore.
- for subapp_dict in cast(list, plugins_manager.fastapi_apps):
- name = subapp_dict.get("name")
- subapp = subapp_dict.get("app")
- if subapp is None:
- log.error("'app' key is missing for the fastapi app: %s", name)
- continue
- url_prefix = subapp_dict.get("url_prefix")
- if url_prefix is None:
- log.error("'url_prefix' key is missing for the fastapi app: %s",
name)
- continue
-
- log.debug("Adding subapplication %s under prefix %s", name, url_prefix)
- app.mount(url_prefix, subapp)
-
-
def cached_app(config=None, testing=False) -> FastAPI:
"""Return cached instance of Airflow UI app."""
global app
diff --git a/airflow/api_fastapi/db/__init__.py
b/airflow/api_fastapi/common/__init__.py
similarity index 100%
copy from airflow/api_fastapi/db/__init__.py
copy to airflow/api_fastapi/common/__init__.py
diff --git a/airflow/api_fastapi/openapi/__init__.py
b/airflow/api_fastapi/common/db/__init__.py
similarity index 100%
rename from airflow/api_fastapi/openapi/__init__.py
rename to airflow/api_fastapi/common/db/__init__.py
diff --git a/airflow/api_fastapi/db/common.py
b/airflow/api_fastapi/common/db/common.py
similarity index 97%
rename from airflow/api_fastapi/db/common.py
rename to airflow/api_fastapi/common/db/common.py
index f611eaa64f0..3feb3ba5995 100644
--- a/airflow/api_fastapi/db/common.py
+++ b/airflow/api_fastapi/common/db/common.py
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
from sqlalchemy.orm import Session
from sqlalchemy.sql import Select
- from airflow.api_fastapi.parameters import BaseParam
+ from airflow.api_fastapi.common.parameters import BaseParam
async def get_session() -> Session:
diff --git a/airflow/api_fastapi/db/dags.py
b/airflow/api_fastapi/common/db/dags.py
similarity index 100%
rename from airflow/api_fastapi/db/dags.py
rename to airflow/api_fastapi/common/db/dags.py
diff --git a/airflow/api_fastapi/parameters.py
b/airflow/api_fastapi/common/parameters.py
similarity index 100%
rename from airflow/api_fastapi/parameters.py
rename to airflow/api_fastapi/common/parameters.py
diff --git a/airflow/api_fastapi/routes/router.py
b/airflow/api_fastapi/common/router.py
similarity index 100%
rename from airflow/api_fastapi/routes/router.py
rename to airflow/api_fastapi/common/router.py
diff --git a/airflow/api_fastapi/routes/__init__.py
b/airflow/api_fastapi/core_api/__init__.py
similarity index 100%
rename from airflow/api_fastapi/routes/__init__.py
rename to airflow/api_fastapi/core_api/__init__.py
diff --git a/airflow/api_fastapi/app.py b/airflow/api_fastapi/core_api/app.py
similarity index 64%
copy from airflow/api_fastapi/app.py
copy to airflow/api_fastapi/core_api/app.py
index 912b8496dd6..f47a33227f3 100644
--- a/airflow/api_fastapi/app.py
+++ b/airflow/api_fastapi/core_api/app.py
@@ -21,19 +21,17 @@ import os
from pathlib import Path
from typing import cast
-from fastapi import FastAPI, Request
-from fastapi.middleware.cors import CORSMiddleware
-from fastapi.responses import HTMLResponse
-from fastapi.staticfiles import StaticFiles
-from fastapi.templating import Jinja2Templates
+from fastapi import FastAPI
+from starlette.requests import Request
+from starlette.responses import HTMLResponse
+from starlette.staticfiles import StaticFiles
+from starlette.templating import Jinja2Templates
from airflow.settings import AIRFLOW_PATH
from airflow.www.extensions.init_dagbag import get_dag_bag
log = logging.getLogger(__name__)
-app: FastAPI | None = None
-
def init_dag_bag(app: FastAPI) -> None:
"""
@@ -44,41 +42,10 @@ def init_dag_bag(app: FastAPI) -> None:
app.state.dag_bag = get_dag_bag()
-def create_app() -> FastAPI:
- from airflow.configuration import conf
-
- app = FastAPI(
- description="Airflow API. All endpoints located under ``/public`` can
be used safely, are stable and backward compatible. "
- "Endpoints located under ``/ui`` are dedicated to the UI and are
subject to breaking change "
- "depending on the need of the frontend. Users should not rely on those
but use the public ones instead."
- )
-
- init_dag_bag(app)
-
- init_views(app)
-
- init_plugins(app)
-
- allow_origins = conf.getlist("api", "access_control_allow_origins")
- allow_methods = conf.getlist("api", "access_control_allow_methods")
- allow_headers = conf.getlist("api", "access_control_allow_headers")
-
- if allow_origins or allow_methods or allow_headers:
- app.add_middleware(
- CORSMiddleware,
- allow_origins=allow_origins,
- allow_credentials=True,
- allow_methods=allow_methods,
- allow_headers=allow_headers,
- )
-
- return app
-
-
def init_views(app: FastAPI) -> None:
"""Init views by registering the different routers."""
- from airflow.api_fastapi.routes.public import public_router
- from airflow.api_fastapi.routes.ui import ui_router
+ from airflow.api_fastapi.core_api.routes.public import public_router
+ from airflow.api_fastapi.core_api.routes.ui import ui_router
app.include_router(ui_router)
app.include_router(public_router)
@@ -127,17 +94,3 @@ def init_plugins(app: FastAPI) -> None:
log.debug("Adding subapplication %s under prefix %s", name, url_prefix)
app.mount(url_prefix, subapp)
-
-
-def cached_app(config=None, testing=False) -> FastAPI:
- """Return cached instance of Airflow UI app."""
- global app
- if not app:
- app = create_app()
- return app
-
-
-def purge_cached_app() -> None:
- """Remove the cached version of the app in global state."""
- global app
- app = None
diff --git a/airflow/api_fastapi/serializers/__init__.py
b/airflow/api_fastapi/core_api/openapi/__init__.py
similarity index 100%
rename from airflow/api_fastapi/serializers/__init__.py
rename to airflow/api_fastapi/core_api/openapi/__init__.py
diff --git a/airflow/api_fastapi/openapi/exceptions.py
b/airflow/api_fastapi/core_api/openapi/exceptions.py
similarity index 100%
rename from airflow/api_fastapi/openapi/exceptions.py
rename to airflow/api_fastapi/core_api/openapi/exceptions.py
diff --git a/airflow/api_fastapi/openapi/v1-generated.yaml
b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
similarity index 99%
rename from airflow/api_fastapi/openapi/v1-generated.yaml
rename to airflow/api_fastapi/core_api/openapi/v1-generated.yaml
index 4b028c315f3..d7ee6340c66 100644
--- a/airflow/api_fastapi/openapi/v1-generated.yaml
+++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
@@ -1,6 +1,6 @@
openapi: 3.1.0
info:
- title: FastAPI
+ title: Airflow API
description: Airflow API. All endpoints located under ``/public`` can be
used safely,
are stable and backward compatible. Endpoints located under ``/ui`` are
dedicated
to the UI and are subject to breaking change depending on the need of the
frontend.
diff --git a/tests/api_fastapi/routes/__init__.py
b/airflow/api_fastapi/core_api/routes/__init__.py
similarity index 100%
rename from tests/api_fastapi/routes/__init__.py
rename to airflow/api_fastapi/core_api/routes/__init__.py
diff --git a/airflow/api_fastapi/routes/public/__init__.py
b/airflow/api_fastapi/core_api/routes/public/__init__.py
similarity index 70%
rename from airflow/api_fastapi/routes/public/__init__.py
rename to airflow/api_fastapi/core_api/routes/public/__init__.py
index 01a9b7f2396..3d43a7bbb0e 100644
--- a/airflow/api_fastapi/routes/public/__init__.py
+++ b/airflow/api_fastapi/core_api/routes/public/__init__.py
@@ -17,12 +17,12 @@
from __future__ import annotations
-from airflow.api_fastapi.routes.public.connections import connections_router
-from airflow.api_fastapi.routes.public.dag_run import dag_run_router
-from airflow.api_fastapi.routes.public.dags import dags_router
-from airflow.api_fastapi.routes.public.monitor import monitor_router
-from airflow.api_fastapi.routes.public.variables import variables_router
-from airflow.api_fastapi.routes.router import AirflowRouter
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.routes.public.connections import
connections_router
+from airflow.api_fastapi.core_api.routes.public.dag_run import dag_run_router
+from airflow.api_fastapi.core_api.routes.public.dags import dags_router
+from airflow.api_fastapi.core_api.routes.public.monitor import monitor_router
+from airflow.api_fastapi.core_api.routes.public.variables import
variables_router
public_router = AirflowRouter(prefix="/public")
diff --git a/airflow/api_fastapi/routes/public/connections.py
b/airflow/api_fastapi/core_api/routes/public/connections.py
similarity index 87%
rename from airflow/api_fastapi/routes/public/connections.py
rename to airflow/api_fastapi/core_api/routes/public/connections.py
index 76684835cf4..60898d2a63a 100644
--- a/airflow/api_fastapi/routes/public/connections.py
+++ b/airflow/api_fastapi/core_api/routes/public/connections.py
@@ -21,11 +21,14 @@ from sqlalchemy import select
from sqlalchemy.orm import Session
from typing_extensions import Annotated
-from airflow.api_fastapi.db.common import get_session, paginated_select
-from airflow.api_fastapi.openapi.exceptions import
create_openapi_http_exception_doc
-from airflow.api_fastapi.parameters import QueryLimit, QueryOffset, SortParam
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.connections import
ConnectionCollectionResponse, ConnectionResponse
+from airflow.api_fastapi.common.db.common import get_session, paginated_select
+from airflow.api_fastapi.common.parameters import QueryLimit, QueryOffset,
SortParam
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.connections import (
+ ConnectionCollectionResponse,
+ ConnectionResponse,
+)
from airflow.models import Connection
connections_router = AirflowRouter(tags=["Connection"], prefix="/connections")
diff --git a/airflow/api_fastapi/routes/public/dag_run.py
b/airflow/api_fastapi/core_api/routes/public/dag_run.py
similarity index 88%
rename from airflow/api_fastapi/routes/public/dag_run.py
rename to airflow/api_fastapi/core_api/routes/public/dag_run.py
index 62e4d97a829..035d1b7fd7d 100644
--- a/airflow/api_fastapi/routes/public/dag_run.py
+++ b/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -22,10 +22,10 @@ from sqlalchemy import select
from sqlalchemy.orm import Session
from typing_extensions import Annotated
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.openapi.exceptions import
create_openapi_http_exception_doc
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.dag_run import DAGRunResponse
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.dag_run import DAGRunResponse
from airflow.models import DagRun
dag_run_router = AirflowRouter(tags=["DagRun"],
prefix="/dags/{dag_id}/dagRuns")
diff --git a/airflow/api_fastapi/routes/public/dags.py
b/airflow/api_fastapi/core_api/routes/public/dags.py
similarity index 94%
rename from airflow/api_fastapi/routes/public/dags.py
rename to airflow/api_fastapi/core_api/routes/public/dags.py
index d2b608e0517..81293211fc9 100644
--- a/airflow/api_fastapi/routes/public/dags.py
+++ b/airflow/api_fastapi/core_api/routes/public/dags.py
@@ -23,13 +23,12 @@ from sqlalchemy.orm import Session
from typing_extensions import Annotated
from airflow.api.common import delete_dag as delete_dag_module
-from airflow.api_fastapi.db.common import (
+from airflow.api_fastapi.common.db.common import (
get_session,
paginated_select,
)
-from airflow.api_fastapi.db.dags import dags_select_with_latest_dag_run
-from airflow.api_fastapi.openapi.exceptions import
create_openapi_http_exception_doc
-from airflow.api_fastapi.parameters import (
+from airflow.api_fastapi.common.db.dags import dags_select_with_latest_dag_run
+from airflow.api_fastapi.common.parameters import (
QueryDagDisplayNamePatternSearch,
QueryDagIdPatternSearch,
QueryDagIdPatternSearchWithNone,
@@ -42,8 +41,9 @@ from airflow.api_fastapi.parameters import (
QueryTagsFilter,
SortParam,
)
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.dags import (
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.dags import (
DAGCollectionResponse,
DAGDetailsResponse,
DAGPatchBody,
diff --git a/airflow/api_fastapi/routes/public/monitor.py
b/airflow/api_fastapi/core_api/routes/public/monitor.py
similarity index 89%
rename from airflow/api_fastapi/routes/public/monitor.py
rename to airflow/api_fastapi/core_api/routes/public/monitor.py
index 30e8f1330a5..e5d746e15c2 100644
--- a/airflow/api_fastapi/routes/public/monitor.py
+++ b/airflow/api_fastapi/core_api/routes/public/monitor.py
@@ -18,8 +18,8 @@
from __future__ import annotations
from airflow.api.common.airflow_health import get_airflow_health
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.monitor import HealthInfoSchema
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.serializers.monitor import HealthInfoSchema
monitor_router = AirflowRouter(tags=["Monitor"], prefix="/monitor")
diff --git a/airflow/api_fastapi/routes/public/variables.py
b/airflow/api_fastapi/core_api/routes/public/variables.py
similarity index 92%
rename from airflow/api_fastapi/routes/public/variables.py
rename to airflow/api_fastapi/core_api/routes/public/variables.py
index 61cd84c7004..3a46c519c92 100644
--- a/airflow/api_fastapi/routes/public/variables.py
+++ b/airflow/api_fastapi/core_api/routes/public/variables.py
@@ -21,10 +21,10 @@ from sqlalchemy import select
from sqlalchemy.orm import Session
from typing_extensions import Annotated
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.openapi.exceptions import
create_openapi_http_exception_doc
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.serializers.variables import VariableBody,
VariableResponse
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.openapi.exceptions import
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.variables import VariableBody,
VariableResponse
from airflow.models.variable import Variable
variables_router = AirflowRouter(tags=["Variable"], prefix="/variables")
diff --git a/airflow/api_fastapi/routes/ui/__init__.py
b/airflow/api_fastapi/core_api/routes/ui/__init__.py
similarity index 81%
rename from airflow/api_fastapi/routes/ui/__init__.py
rename to airflow/api_fastapi/core_api/routes/ui/__init__.py
index 2087549c98e..9cd16fcdd16 100644
--- a/airflow/api_fastapi/routes/ui/__init__.py
+++ b/airflow/api_fastapi/core_api/routes/ui/__init__.py
@@ -16,9 +16,9 @@
# under the License.
from __future__ import annotations
-from airflow.api_fastapi.routes.router import AirflowRouter
-from airflow.api_fastapi.routes.ui.assets import assets_router
-from airflow.api_fastapi.routes.ui.dashboard import dashboard_router
+from airflow.api_fastapi.common.router import AirflowRouter
+from airflow.api_fastapi.core_api.routes.ui.assets import assets_router
+from airflow.api_fastapi.core_api.routes.ui.dashboard import dashboard_router
ui_router = AirflowRouter(prefix="/ui")
diff --git a/airflow/api_fastapi/routes/ui/assets.py
b/airflow/api_fastapi/core_api/routes/ui/assets.py
similarity index 96%
rename from airflow/api_fastapi/routes/ui/assets.py
rename to airflow/api_fastapi/core_api/routes/ui/assets.py
index 31406b1b94d..b8a17c73984 100644
--- a/airflow/api_fastapi/routes/ui/assets.py
+++ b/airflow/api_fastapi/core_api/routes/ui/assets.py
@@ -22,8 +22,8 @@ from sqlalchemy import and_, func, select
from sqlalchemy.orm import Session
from typing_extensions import Annotated
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.routes.router import AirflowRouter
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
from airflow.models import DagModel
from airflow.models.asset import AssetDagRunQueue, AssetEvent, AssetModel,
DagScheduleAssetReference
diff --git a/airflow/api_fastapi/routes/ui/dashboard.py
b/airflow/api_fastapi/core_api/routes/ui/dashboard.py
similarity index 90%
rename from airflow/api_fastapi/routes/ui/dashboard.py
rename to airflow/api_fastapi/core_api/routes/ui/dashboard.py
index e7cec5fbf0e..e101ca78be7 100644
--- a/airflow/api_fastapi/routes/ui/dashboard.py
+++ b/airflow/api_fastapi/core_api/routes/ui/dashboard.py
@@ -23,17 +23,17 @@ from sqlalchemy import func, select
from sqlalchemy.orm import Session
from typing_extensions import Annotated
-from airflow.api_fastapi.openapi.exceptions import
create_openapi_http_exception_doc
-from airflow.api_fastapi.parameters import DateTimeQuery
-from airflow.api_fastapi.serializers.dashboard import
HistoricalMetricDataResponse
+from airflow.api_fastapi.common.parameters import DateTimeQuery
+from airflow.api_fastapi.core_api.openapi.exceptions import
create_openapi_http_exception_doc
+from airflow.api_fastapi.core_api.serializers.dashboard import
HistoricalMetricDataResponse
from airflow.models.dagrun import DagRun, DagRunType
from airflow.models.taskinstance import TaskInstance
from airflow.utils.state import DagRunState, TaskInstanceState
if TYPE_CHECKING:
from sqlalchemy.orm import Session
-from airflow.api_fastapi.db.common import get_session
-from airflow.api_fastapi.routes.router import AirflowRouter
+from airflow.api_fastapi.common.db.common import get_session
+from airflow.api_fastapi.common.router import AirflowRouter
from airflow.utils import timezone
dashboard_router = AirflowRouter(tags=["Dashboard"])
diff --git a/tests/api_fastapi/routes/public/__init__.py
b/airflow/api_fastapi/core_api/serializers/__init__.py
similarity index 100%
rename from tests/api_fastapi/routes/public/__init__.py
rename to airflow/api_fastapi/core_api/serializers/__init__.py
diff --git a/airflow/api_fastapi/serializers/connections.py
b/airflow/api_fastapi/core_api/serializers/connections.py
similarity index 100%
rename from airflow/api_fastapi/serializers/connections.py
rename to airflow/api_fastapi/core_api/serializers/connections.py
diff --git a/airflow/api_fastapi/serializers/dag_run.py
b/airflow/api_fastapi/core_api/serializers/dag_run.py
similarity index 100%
rename from airflow/api_fastapi/serializers/dag_run.py
rename to airflow/api_fastapi/core_api/serializers/dag_run.py
diff --git a/airflow/api_fastapi/serializers/dags.py
b/airflow/api_fastapi/core_api/serializers/dags.py
similarity index 100%
rename from airflow/api_fastapi/serializers/dags.py
rename to airflow/api_fastapi/core_api/serializers/dags.py
diff --git a/airflow/api_fastapi/serializers/dashboard.py
b/airflow/api_fastapi/core_api/serializers/dashboard.py
similarity index 100%
rename from airflow/api_fastapi/serializers/dashboard.py
rename to airflow/api_fastapi/core_api/serializers/dashboard.py
diff --git a/airflow/api_fastapi/serializers/monitor.py
b/airflow/api_fastapi/core_api/serializers/monitor.py
similarity index 100%
rename from airflow/api_fastapi/serializers/monitor.py
rename to airflow/api_fastapi/core_api/serializers/monitor.py
diff --git a/airflow/api_fastapi/serializers/variables.py
b/airflow/api_fastapi/core_api/serializers/variables.py
similarity index 100%
rename from airflow/api_fastapi/serializers/variables.py
rename to airflow/api_fastapi/core_api/serializers/variables.py
diff --git a/airflow/ui/package.json b/airflow/ui/package.json
index a7cf90bb573..c54c9af5bb2 100644
--- a/airflow/ui/package.json
+++ b/airflow/ui/package.json
@@ -11,7 +11,7 @@
"lint:fix": "eslint --fix && tsc --p tsconfig.app.json",
"format": "pnpm prettier --write .",
"preview": "vite preview",
- "codegen": "openapi-rq -i \"../api_fastapi/openapi/v1-generated.yaml\" -c
axios --format prettier -o openapi-gen --operationId",
+ "codegen": "openapi-rq -i
\"../api_fastapi/core_api/openapi/v1-generated.yaml\" -c axios --format
prettier -o openapi-gen --operationId",
"test": "vitest run",
"coverage": "vitest run --coverage"
},
diff --git a/contributing-docs/17_adding_api_endpoints.rst
b/contributing-docs/17_adding_api_endpoints.rst
index 2a9ef9af7b0..05dccc72f18 100644
--- a/contributing-docs/17_adding_api_endpoints.rst
+++ b/contributing-docs/17_adding_api_endpoints.rst
@@ -26,7 +26,7 @@ This documentation outlines the steps required to add a new
API endpoint in Apac
Introduction
------------
-The source code for the RestAPI is located under ``api_fastapi``. Endpoints
are located under ``api_fastapi/views`` and contains different types of
endpoints. The main two are ``public`` and ``ui``.
+The source code for the RestAPI is located under ``api_fastapi/core_api``.
Endpoints are located under ``api_fastapi/core_api/routes`` and contains
different types of endpoints. The main two are ``public`` and ``ui``.
Public endpoints are part of the public API, standardized, well documented and
most importantly backward compatible. UI endpoints are custom endpoints made
for the frontend that do not respect backward compatibility i.e they can be
adapted at any time for UI needs.
When adding an endpoint you should try as much as possible to make it reusable
by the community, have a stable design in mind, standardized and therefore part
of the public API. If this is not possible because the data types are too
specific or subject to frequent change
then adding it to the UI endpoints is more suitable.
@@ -35,7 +35,7 @@ then adding it to the UI endpoints is more suitable.
Step 1: Implement the Endpoint Logic
------------------------------------
1. Considering the details above decide whether your endpoints should be part
of the ``public`` or ``ui`` interface.
-1. Navigate to the appropriate views directory in ``api_fastapi/views``.
+1. Navigate to the appropriate routes directory in
``api_fastapi/core_api/routes``.
2. Register a new route for your endpoint with the appropriate HTTP method,
query params, permissions, body type, etc.
3. Specify the appropriate Pydantic type in the return type annotation.
@@ -62,7 +62,7 @@ Step 2: Add tests for your Endpoints
------------------------------------
1. Verify manually with a local API that the endpoint behaves as expected.
2. Go to the test folder and initialize new tests.
-3. Implements extensives tests to validate query param, permissions, error
handling etc.
+3. Implements extensive tests to validate query param, permissions, error
handling etc.
Step 3: Documentation
diff --git a/scripts/in_container/run_update_fastapi_api_spec.py
b/scripts/in_container/run_update_fastapi_api_spec.py
index 5d31b0bee3f..b66587f7203 100644
--- a/scripts/in_container/run_update_fastapi_api_spec.py
+++ b/scripts/in_container/run_update_fastapi_api_spec.py
@@ -23,7 +23,7 @@ from airflow.api_fastapi.app import create_app
app = create_app()
-OPENAPI_SPEC_FILE = "airflow/api_fastapi/openapi/v1-generated.yaml"
+OPENAPI_SPEC_FILE = "airflow/api_fastapi/core_api/openapi/v1-generated.yaml"
# The persisted openapi spec will list all endpoints (public and ui), this
diff --git a/tests/api_fastapi/routes/ui/__init__.py
b/tests/api_fastapi/core_api/__init__.py
similarity index 100%
rename from tests/api_fastapi/routes/ui/__init__.py
rename to tests/api_fastapi/core_api/__init__.py
diff --git a/airflow/api_fastapi/db/__init__.py
b/tests/api_fastapi/core_api/routes/__init__.py
similarity index 100%
copy from airflow/api_fastapi/db/__init__.py
copy to tests/api_fastapi/core_api/routes/__init__.py
diff --git a/airflow/api_fastapi/db/__init__.py
b/tests/api_fastapi/core_api/routes/public/__init__.py
similarity index 100%
copy from airflow/api_fastapi/db/__init__.py
copy to tests/api_fastapi/core_api/routes/public/__init__.py
diff --git a/tests/api_fastapi/routes/public/test_connections.py
b/tests/api_fastapi/core_api/routes/public/test_connections.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_connections.py
rename to tests/api_fastapi/core_api/routes/public/test_connections.py
diff --git a/tests/api_fastapi/routes/public/test_dag_run.py
b/tests/api_fastapi/core_api/routes/public/test_dag_run.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_dag_run.py
rename to tests/api_fastapi/core_api/routes/public/test_dag_run.py
diff --git a/tests/api_fastapi/routes/public/test_dags.py
b/tests/api_fastapi/core_api/routes/public/test_dags.py
similarity index 98%
rename from tests/api_fastapi/routes/public/test_dags.py
rename to tests/api_fastapi/core_api/routes/public/test_dags.py
index 99ac939406f..1055000f425 100644
--- a/tests/api_fastapi/routes/public/test_dags.py
+++ b/tests/api_fastapi/core_api/routes/public/test_dags.py
@@ -293,7 +293,7 @@ class TestDagDetails(TestDagEndpoint):
"description": None,
"doc_md": "details",
"end_date": None,
- "fileloc":
"/opt/airflow/tests/api_fastapi/routes/public/test_dags.py",
+ "fileloc":
"/opt/airflow/tests/api_fastapi/core_api/routes/public/test_dags.py",
"file_token": file_token,
"has_import_errors": False,
"has_task_concurrency_limits": True,
@@ -358,7 +358,7 @@ class TestGetDag(TestDagEndpoint):
"dag_id": dag_id,
"dag_display_name": dag_display_name,
"description": None,
- "fileloc":
"/opt/airflow/tests/api_fastapi/routes/public/test_dags.py",
+ "fileloc":
"/opt/airflow/tests/api_fastapi/core_api/routes/public/test_dags.py",
"file_token": file_token,
"is_paused": False,
"is_active": True,
diff --git a/tests/api_fastapi/routes/public/test_monitor.py
b/tests/api_fastapi/core_api/routes/public/test_monitor.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_monitor.py
rename to tests/api_fastapi/core_api/routes/public/test_monitor.py
diff --git a/tests/api_fastapi/routes/public/test_variables.py
b/tests/api_fastapi/core_api/routes/public/test_variables.py
similarity index 100%
rename from tests/api_fastapi/routes/public/test_variables.py
rename to tests/api_fastapi/core_api/routes/public/test_variables.py
diff --git a/airflow/api_fastapi/db/__init__.py
b/tests/api_fastapi/core_api/routes/ui/__init__.py
similarity index 100%
rename from airflow/api_fastapi/db/__init__.py
rename to tests/api_fastapi/core_api/routes/ui/__init__.py
diff --git a/tests/api_fastapi/routes/ui/test_assets.py
b/tests/api_fastapi/core_api/routes/ui/test_assets.py
similarity index 100%
rename from tests/api_fastapi/routes/ui/test_assets.py
rename to tests/api_fastapi/core_api/routes/ui/test_assets.py
diff --git a/tests/api_fastapi/routes/ui/test_dashboard.py
b/tests/api_fastapi/core_api/routes/ui/test_dashboard.py
similarity index 100%
rename from tests/api_fastapi/routes/ui/test_dashboard.py
rename to tests/api_fastapi/core_api/routes/ui/test_dashboard.py