This is an automated email from the ASF dual-hosted git repository.
vincbeck 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 e187961bde0 Add single endpoint to retrieve menu information (#48762)
e187961bde0 is described below
commit e187961bde09198942e09494c551c5e9ee76d275
Author: Vincent <[email protected]>
AuthorDate: Mon Apr 7 11:03:46 2025 -0400
Add single endpoint to retrieve menu information (#48762)
---
.../src/airflow/api_fastapi/common/types.py | 2 +-
.../api_fastapi/core_api/datamodels/ui/auth.py | 12 ++---
.../api_fastapi/core_api/openapi/v1-generated.yaml | 60 ++++++++++++++--------
.../airflow/api_fastapi/core_api/routes/ui/auth.py | 17 +++---
.../src/airflow/ui/openapi-gen/queries/common.ts | 14 ++---
.../ui/openapi-gen/queries/ensureQueryData.ts | 8 +--
.../src/airflow/ui/openapi-gen/queries/prefetch.ts | 8 +--
.../src/airflow/ui/openapi-gen/queries/queries.ts | 10 ++--
.../src/airflow/ui/openapi-gen/queries/suspense.ts | 10 ++--
.../airflow/ui/openapi-gen/requests/schemas.gen.ts | 58 ++++++++++++++-------
.../ui/openapi-gen/requests/services.gen.ts | 8 +--
.../airflow/ui/openapi-gen/requests/types.gen.ts | 30 +++++++----
.../airflow/ui/src/layouts/Nav/SecurityButton.tsx | 8 +--
airflow-core/src/airflow/ui/src/pages/Security.tsx | 6 +--
.../api_fastapi/core_api/routes/ui/test_auth.py | 22 +++++---
.../providers/fab/auth_manager/fab_auth_manager.py | 2 +-
.../unit/fab/auth_manager/test_fab_auth_manager.py | 7 +--
17 files changed, 166 insertions(+), 116 deletions(-)
diff --git a/airflow-core/src/airflow/api_fastapi/common/types.py
b/airflow-core/src/airflow/api_fastapi/common/types.py
index fa1a1d904ff..758c80cb676 100644
--- a/airflow-core/src/airflow/api_fastapi/common/types.py
+++ b/airflow-core/src/airflow/api_fastapi/common/types.py
@@ -87,7 +87,7 @@ class MenuItem(Enum):
"""Define all menu items defined in the menu."""
ASSETS = "Assets"
- ASSET_EVENTS = "Asset Events"
+ AUDIT_LOG = "Audit log"
CONNECTIONS = "Connections"
DAGS = "Dags"
DOCS = "Docs"
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/auth.py
b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/auth.py
index ab445be12f8..736f4ffdc06 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/auth.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/auth.py
@@ -17,18 +17,12 @@
from __future__ import annotations
+from airflow.api_fastapi.common.types import ExtraMenuItem, MenuItem
from airflow.api_fastapi.core_api.base import BaseModel
-class MenuItem(BaseModel):
- """Menu Item for responses."""
-
- text: str
- href: str
-
-
class MenuItemCollectionResponse(BaseModel):
"""Menu Item Collection serializer for responses."""
- menu_items: list[MenuItem]
- total_entries: int
+ authorized_menu_items: list[MenuItem]
+ extra_menu_items: list[ExtraMenuItem]
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
index 3170fe54bae..28129ef988b 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
+++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
@@ -7,12 +7,12 @@ info:
Users should not rely on those but use the public ones instead.
version: 0.1.0
paths:
- /ui/auth/links:
+ /ui/auth/menus:
get:
tags:
- Auth Links
- summary: Get Auth Links
- operationId: get_auth_links
+ summary: Get Auth Menus
+ operationId: get_auth_menus
responses:
'200':
description: Successful Response
@@ -9807,6 +9807,19 @@ components:
type: object
title: ExtraLinksResponse
description: Extra Links Response.
+ ExtraMenuItem:
+ properties:
+ text:
+ type: string
+ title: Text
+ href:
+ type: string
+ title: Href
+ type: object
+ required:
+ - text
+ - href
+ title: ExtraMenuItem
FastAPIAppResponse:
properties:
app:
@@ -10174,33 +10187,36 @@ components:
title: JobResponse
description: Job serializer for responses.
MenuItem:
- properties:
- text:
- type: string
- title: Text
- href:
- type: string
- title: Href
- type: object
- required:
- - text
- - href
+ type: string
+ enum:
+ - Assets
+ - Audit log
+ - Connections
+ - Dags
+ - Docs
+ - Plugins
+ - Pools
+ - Providers
+ - Variables
+ - XComs
title: MenuItem
- description: Menu Item for responses.
+ description: Define all menu items defined in the menu.
MenuItemCollectionResponse:
properties:
- menu_items:
+ authorized_menu_items:
items:
$ref: '#/components/schemas/MenuItem'
type: array
- title: Menu Items
- total_entries:
- type: integer
- title: Total Entries
+ title: Authorized Menu Items
+ extra_menu_items:
+ items:
+ $ref: '#/components/schemas/ExtraMenuItem'
+ type: array
+ title: Extra Menu Items
type: object
required:
- - menu_items
- - total_entries
+ - authorized_menu_items
+ - extra_menu_items
title: MenuItemCollectionResponse
description: Menu Item Collection serializer for responses.
NodeResponse:
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
index b93d9455d6a..f3c20a9ccef 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/auth.py
@@ -17,23 +17,24 @@
from __future__ import annotations
-from typing import cast
-
from airflow.api_fastapi.app import get_auth_manager
from airflow.api_fastapi.common.router import AirflowRouter
-from airflow.api_fastapi.core_api.datamodels.ui.auth import MenuItem,
MenuItemCollectionResponse
+from airflow.api_fastapi.core_api.datamodels.ui.auth import (
+ MenuItemCollectionResponse,
+)
from airflow.api_fastapi.core_api.security import GetUserDep
auth_router = AirflowRouter(tags=["Auth Links"])
-@auth_router.get("/auth/links")
-def get_auth_links(
+@auth_router.get("/auth/menus")
+def get_auth_menus(
user: GetUserDep,
) -> MenuItemCollectionResponse:
- menu_items = get_auth_manager().get_extra_menu_items(user=user)
+ authorized_menu_items =
get_auth_manager().get_authorized_menu_items(user=user)
+ extra_menu_items = get_auth_manager().get_extra_menu_items(user=user)
return MenuItemCollectionResponse(
- menu_items=cast("list[MenuItem]", menu_items),
- total_entries=len(menu_items),
+ authorized_menu_items=authorized_menu_items,
+ extra_menu_items=extra_menu_items,
)
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
index b3308f30f9e..b452383ad48 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -38,16 +38,16 @@ import {
} from "../requests/services.gen";
import { DagRunState, DagWarningType } from "../requests/types.gen";
-export type AuthLinksServiceGetAuthLinksDefaultResponse = Awaited<
- ReturnType<typeof AuthLinksService.getAuthLinks>
+export type AuthLinksServiceGetAuthMenusDefaultResponse = Awaited<
+ ReturnType<typeof AuthLinksService.getAuthMenus>
>;
-export type AuthLinksServiceGetAuthLinksQueryResult<
- TData = AuthLinksServiceGetAuthLinksDefaultResponse,
+export type AuthLinksServiceGetAuthMenusQueryResult<
+ TData = AuthLinksServiceGetAuthMenusDefaultResponse,
TError = unknown,
> = UseQueryResult<TData, TError>;
-export const useAuthLinksServiceGetAuthLinksKey =
"AuthLinksServiceGetAuthLinks";
-export const UseAuthLinksServiceGetAuthLinksKeyFn = (queryKey?:
Array<unknown>) => [
- useAuthLinksServiceGetAuthLinksKey,
+export const useAuthLinksServiceGetAuthMenusKey =
"AuthLinksServiceGetAuthMenus";
+export const UseAuthLinksServiceGetAuthMenusKeyFn = (queryKey?:
Array<unknown>) => [
+ useAuthLinksServiceGetAuthMenusKey,
...(queryKey ?? []),
];
export type AssetServiceNextRunAssetsDefaultResponse =
Awaited<ReturnType<typeof AssetService.nextRunAssets>>;
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
index db69e50d1c8..dbe2677a407 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -39,14 +39,14 @@ import { DagRunState, DagWarningType } from
"../requests/types.gen";
import * as Common from "./common";
/**
- * Get Auth Links
+ * Get Auth Menus
* @returns MenuItemCollectionResponse Successful Response
* @throws ApiError
*/
-export const ensureUseAuthLinksServiceGetAuthLinksData = (queryClient:
QueryClient) =>
+export const ensureUseAuthLinksServiceGetAuthMenusData = (queryClient:
QueryClient) =>
queryClient.ensureQueryData({
- queryKey: Common.UseAuthLinksServiceGetAuthLinksKeyFn(),
- queryFn: () => AuthLinksService.getAuthLinks(),
+ queryKey: Common.UseAuthLinksServiceGetAuthMenusKeyFn(),
+ queryFn: () => AuthLinksService.getAuthMenus(),
});
/**
* Next Run Assets
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
index 99d44a857e1..46637153461 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -39,14 +39,14 @@ import { DagRunState, DagWarningType } from
"../requests/types.gen";
import * as Common from "./common";
/**
- * Get Auth Links
+ * Get Auth Menus
* @returns MenuItemCollectionResponse Successful Response
* @throws ApiError
*/
-export const prefetchUseAuthLinksServiceGetAuthLinks = (queryClient:
QueryClient) =>
+export const prefetchUseAuthLinksServiceGetAuthMenus = (queryClient:
QueryClient) =>
queryClient.prefetchQuery({
- queryKey: Common.UseAuthLinksServiceGetAuthLinksKeyFn(),
- queryFn: () => AuthLinksService.getAuthLinks(),
+ queryKey: Common.UseAuthLinksServiceGetAuthMenusKeyFn(),
+ queryFn: () => AuthLinksService.getAuthMenus(),
});
/**
* Next Run Assets
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
index 9429a0b14bc..093d417dbee 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -62,12 +62,12 @@ import {
import * as Common from "./common";
/**
- * Get Auth Links
+ * Get Auth Menus
* @returns MenuItemCollectionResponse Successful Response
* @throws ApiError
*/
-export const useAuthLinksServiceGetAuthLinks = <
- TData = Common.AuthLinksServiceGetAuthLinksDefaultResponse,
+export const useAuthLinksServiceGetAuthMenus = <
+ TData = Common.AuthLinksServiceGetAuthMenusDefaultResponse,
TError = unknown,
TQueryKey extends Array<unknown> = unknown[],
>(
@@ -75,8 +75,8 @@ export const useAuthLinksServiceGetAuthLinks = <
options?: Omit<UseQueryOptions<TData, TError>, "queryKey" | "queryFn">,
) =>
useQuery<TData, TError>({
- queryKey: Common.UseAuthLinksServiceGetAuthLinksKeyFn(queryKey),
- queryFn: () => AuthLinksService.getAuthLinks() as TData,
+ queryKey: Common.UseAuthLinksServiceGetAuthMenusKeyFn(queryKey),
+ queryFn: () => AuthLinksService.getAuthMenus() as TData,
...options,
});
/**
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
index 732c28f8e37..f6edb569312 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -39,12 +39,12 @@ import { DagRunState, DagWarningType } from
"../requests/types.gen";
import * as Common from "./common";
/**
- * Get Auth Links
+ * Get Auth Menus
* @returns MenuItemCollectionResponse Successful Response
* @throws ApiError
*/
-export const useAuthLinksServiceGetAuthLinksSuspense = <
- TData = Common.AuthLinksServiceGetAuthLinksDefaultResponse,
+export const useAuthLinksServiceGetAuthMenusSuspense = <
+ TData = Common.AuthLinksServiceGetAuthMenusDefaultResponse,
TError = unknown,
TQueryKey extends Array<unknown> = unknown[],
>(
@@ -52,8 +52,8 @@ export const useAuthLinksServiceGetAuthLinksSuspense = <
options?: Omit<UseQueryOptions<TData, TError>, "queryKey" | "queryFn">,
) =>
useSuspenseQuery<TData, TError>({
- queryKey: Common.UseAuthLinksServiceGetAuthLinksKeyFn(queryKey),
- queryFn: () => AuthLinksService.getAuthLinks() as TData,
+ queryKey: Common.UseAuthLinksServiceGetAuthMenusKeyFn(queryKey),
+ queryFn: () => AuthLinksService.getAuthMenus() as TData,
...options,
});
/**
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
index 17bd82c362d..1f3aa3841ab 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
@@ -3693,6 +3693,22 @@ export const $ExtraLinksResponse = {
description: "Extra Links Response.",
} as const;
+export const $ExtraMenuItem = {
+ properties: {
+ text: {
+ type: "string",
+ title: "Text",
+ },
+ href: {
+ type: "string",
+ title: "Href",
+ },
+ },
+ type: "object",
+ required: ["text", "href"],
+ title: "ExtraMenuItem",
+} as const;
+
export const $FastAPIAppResponse = {
properties: {
app: {
@@ -4266,38 +4282,42 @@ export const $JobResponse = {
} as const;
export const $MenuItem = {
- properties: {
- text: {
- type: "string",
- title: "Text",
- },
- href: {
- type: "string",
- title: "Href",
- },
- },
- type: "object",
- required: ["text", "href"],
+ type: "string",
+ enum: [
+ "Assets",
+ "Audit log",
+ "Connections",
+ "Dags",
+ "Docs",
+ "Plugins",
+ "Pools",
+ "Providers",
+ "Variables",
+ "XComs",
+ ],
title: "MenuItem",
- description: "Menu Item for responses.",
+ description: "Define all menu items defined in the menu.",
} as const;
export const $MenuItemCollectionResponse = {
properties: {
- menu_items: {
+ authorized_menu_items: {
items: {
$ref: "#/components/schemas/MenuItem",
},
type: "array",
- title: "Menu Items",
+ title: "Authorized Menu Items",
},
- total_entries: {
- type: "integer",
- title: "Total Entries",
+ extra_menu_items: {
+ items: {
+ $ref: "#/components/schemas/ExtraMenuItem",
+ },
+ type: "array",
+ title: "Extra Menu Items",
},
},
type: "object",
- required: ["menu_items", "total_entries"],
+ required: ["authorized_menu_items", "extra_menu_items"],
title: "MenuItemCollectionResponse",
description: "Menu Item Collection serializer for responses.",
} as const;
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
index 208adb5e49e..a87ea6472f4 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
@@ -3,7 +3,7 @@ import type { CancelablePromise } from
"./core/CancelablePromise";
import { OpenAPI } from "./core/OpenAPI";
import { request as __request } from "./core/request";
import type {
- GetAuthLinksResponse,
+ GetAuthMenusResponse,
NextRunAssetsData,
NextRunAssetsResponse,
GetAssetsData,
@@ -221,14 +221,14 @@ import type {
export class AuthLinksService {
/**
- * Get Auth Links
+ * Get Auth Menus
* @returns MenuItemCollectionResponse Successful Response
* @throws ApiError
*/
- public static getAuthLinks(): CancelablePromise<GetAuthLinksResponse> {
+ public static getAuthMenus(): CancelablePromise<GetAuthMenusResponse> {
return __request(OpenAPI, {
method: "GET",
- url: "/ui/auth/links",
+ url: "/ui/auth/menus",
});
}
}
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
index 9358f5dd75d..d534ebff362 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -971,6 +971,11 @@ export type ExtraLinksResponse = {
[key: string]: string | null;
};
+export type ExtraMenuItem = {
+ text: string;
+ href: string;
+};
+
/**
* Serializer for Plugin FastAPI App responses.
*/
@@ -1111,19 +1116,26 @@ export type JobResponse = {
};
/**
- * Menu Item for responses.
+ * Define all menu items defined in the menu.
*/
-export type MenuItem = {
- text: string;
- href: string;
-};
+export type MenuItem =
+ | "Assets"
+ | "Audit log"
+ | "Connections"
+ | "Dags"
+ | "Docs"
+ | "Plugins"
+ | "Pools"
+ | "Providers"
+ | "Variables"
+ | "XComs";
/**
* Menu Item Collection serializer for responses.
*/
export type MenuItemCollectionResponse = {
- menu_items: Array<MenuItem>;
- total_entries: number;
+ authorized_menu_items: Array<MenuItem>;
+ extra_menu_items: Array<ExtraMenuItem>;
};
/**
@@ -1693,7 +1705,7 @@ export type XComUpdateBody = {
map_index?: number;
};
-export type GetAuthLinksResponse = MenuItemCollectionResponse;
+export type GetAuthMenusResponse = MenuItemCollectionResponse;
export type NextRunAssetsData = {
dagId: string;
@@ -2631,7 +2643,7 @@ export type NotFoundHandlerData = {
export type NotFoundHandlerResponse = unknown;
export type $OpenApiTs = {
- "/ui/auth/links": {
+ "/ui/auth/menus": {
get: {
res: {
/**
diff --git a/airflow-core/src/airflow/ui/src/layouts/Nav/SecurityButton.tsx
b/airflow-core/src/airflow/ui/src/layouts/Nav/SecurityButton.tsx
index cdef60a1c31..eead679a88d 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Nav/SecurityButton.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Nav/SecurityButton.tsx
@@ -19,15 +19,15 @@
import { FiLock } from "react-icons/fi";
import { Link } from "react-router-dom";
-import { useAuthLinksServiceGetAuthLinks } from "openapi/queries";
+import { useAuthLinksServiceGetAuthMenus } from "openapi/queries";
import { Menu } from "src/components/ui";
import { NavButton } from "./NavButton";
export const SecurityButton = () => {
- const { data: authLinks } = useAuthLinksServiceGetAuthLinks();
+ const { data: authLinks } = useAuthLinksServiceGetAuthMenus();
- if (authLinks?.total_entries === undefined || authLinks.total_entries < 1) {
+ if (authLinks?.extra_menu_items === undefined ||
authLinks.extra_menu_items.length < 1) {
return undefined;
}
@@ -37,7 +37,7 @@ export const SecurityButton = () => {
<NavButton icon={<FiLock size="1.75rem" />} title="Security" />
</Menu.Trigger>
<Menu.Content>
- {authLinks.menu_items.map(({ text }) => (
+ {authLinks.extra_menu_items.map(({ text }) => (
<Menu.Item asChild key={text} value={text}>
<Link aria-label={text}
to={`security/${text.toLowerCase().replace(" ", "-")}`}>
{text}
diff --git a/airflow-core/src/airflow/ui/src/pages/Security.tsx
b/airflow-core/src/airflow/ui/src/pages/Security.tsx
index 592e45c74a1..3a6061478eb 100644
--- a/airflow-core/src/airflow/ui/src/pages/Security.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Security.tsx
@@ -19,7 +19,7 @@
import { Box } from "@chakra-ui/react";
import { useParams } from "react-router-dom";
-import { useAuthLinksServiceGetAuthLinks } from "openapi/queries";
+import { useAuthLinksServiceGetAuthMenus } from "openapi/queries";
import { ProgressBar } from "src/components/ui";
import { ErrorPage } from "./Error";
@@ -27,9 +27,9 @@ import { ErrorPage } from "./Error";
export const Security = () => {
const { page } = useParams();
- const { data: authLinks, isLoading } = useAuthLinksServiceGetAuthLinks();
+ const { data: authLinks, isLoading } = useAuthLinksServiceGetAuthMenus();
- const link = authLinks?.menu_items.find((mi) =>
mi.text.toLowerCase().replace(" ", "-") === page);
+ const link = authLinks?.extra_menu_items.find((mi) =>
mi.text.toLowerCase().replace(" ", "-") === page);
if (!link) {
if (isLoading) {
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_auth.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_auth.py
index ea6d61ca05a..1b37bc4ba86 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_auth.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_auth.py
@@ -20,7 +20,8 @@ from unittest import mock
import pytest
-from airflow.api_fastapi.common.types import ExtraMenuItem
+from airflow.api_fastapi.auth.managers.simple.simple_auth_manager import
SimpleAuthManager
+from airflow.api_fastapi.common.types import ExtraMenuItem, MenuItem
pytestmark = pytest.mark.db_test
@@ -28,27 +29,32 @@ pytestmark = pytest.mark.db_test
class TestGetAuthLinks:
@mock.patch("airflow.api_fastapi.core_api.routes.ui.auth.get_auth_manager")
def test_should_response_200(self, mock_get_auth_manager, test_client):
+
mock_get_auth_manager.return_value.get_authorized_menu_items.return_value = [
+ MenuItem.VARIABLES,
+ MenuItem.CONNECTIONS,
+ ]
mock_get_auth_manager.return_value.get_extra_menu_items.return_value =
[
ExtraMenuItem(text="name1", href="path1"),
ExtraMenuItem(text="name2", href="path2"),
]
- response = test_client.get("/auth/links")
+ response = test_client.get("/auth/menus")
assert response.status_code == 200
assert response.json() == {
- "menu_items": [
+ "authorized_menu_items": ["Variables", "Connections"],
+ "extra_menu_items": [
{"text": "name1", "href": "path1"},
{"text": "name2", "href": "path2"},
],
- "total_entries": 2,
}
def test_with_unauthenticated_user(self, unauthenticated_test_client):
- response = unauthenticated_test_client.get("/auth/links")
+ response = unauthenticated_test_client.get("/auth/menus")
assert response.status_code == 401
assert response.json() == {"detail": "Not authenticated"}
- def test_with_unauthorized_user(self, unauthorized_test_client):
- response = unauthorized_test_client.get("/auth/links")
+ @mock.patch.object(SimpleAuthManager, "filter_authorized_menu_items",
return_value=[])
+ def test_with_unauthorized_user(self, _, unauthorized_test_client):
+ response = unauthorized_test_client.get("/auth/menus")
assert response.status_code == 200
- assert response.json() == {"menu_items": [], "total_entries": 0}
+ assert response.json() == {"authorized_menu_items": [],
"extra_menu_items": []}
diff --git
a/providers/fab/src/airflow/providers/fab/auth_manager/fab_auth_manager.py
b/providers/fab/src/airflow/providers/fab/auth_manager/fab_auth_manager.py
index 4d3c1dc3c9e..f801eb9cdbd 100644
--- a/providers/fab/src/airflow/providers/fab/auth_manager/fab_auth_manager.py
+++ b/providers/fab/src/airflow/providers/fab/auth_manager/fab_auth_manager.py
@@ -155,7 +155,7 @@ _MAP_ACCESS_VIEW_TO_FAB_RESOURCE_TYPE = {
_MAP_MENU_ITEM_TO_FAB_RESOURCE_TYPE = {
MenuItem.ASSETS: RESOURCE_ASSET,
- MenuItem.ASSET_EVENTS: RESOURCE_ASSET,
+ MenuItem.AUDIT_LOG: RESOURCE_AUDIT_LOG,
MenuItem.CONNECTIONS: RESOURCE_CONNECTION,
MenuItem.DAGS: RESOURCE_DAG,
MenuItem.DOCS: RESOURCE_DOCS,
diff --git a/providers/fab/tests/unit/fab/auth_manager/test_fab_auth_manager.py
b/providers/fab/tests/unit/fab/auth_manager/test_fab_auth_manager.py
index d6db61c4492..9f2057e339c 100644
--- a/providers/fab/tests/unit/fab/auth_manager/test_fab_auth_manager.py
+++ b/providers/fab/tests/unit/fab/auth_manager/test_fab_auth_manager.py
@@ -60,6 +60,7 @@ from airflow.providers.fab.www.security.permissions import (
ACTION_CAN_DELETE,
ACTION_CAN_EDIT,
ACTION_CAN_READ,
+ RESOURCE_AUDIT_LOG,
RESOURCE_CONFIG,
RESOURCE_CONNECTION,
RESOURCE_DAG,
@@ -488,9 +489,9 @@ class TestFabAuthManager:
[],
),
(
- [MenuItem.ASSET_EVENTS, MenuItem.VARIABLES],
- [(ACTION_CAN_ACCESS_MENU, RESOURCE_ASSET), (ACTION_CAN_READ,
RESOURCE_VARIABLE)],
- [MenuItem.ASSET_EVENTS],
+ [MenuItem.AUDIT_LOG, MenuItem.VARIABLES],
+ [(ACTION_CAN_ACCESS_MENU, RESOURCE_AUDIT_LOG),
(ACTION_CAN_READ, RESOURCE_VARIABLE)],
+ [MenuItem.AUDIT_LOG],
),
(
[],