diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index 2402516a246..278884d76a5 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -230,6 +230,8 @@ Experimental features might be changed or removed without prior notice. | `useV2DashboardsAPI` | Use the v2 kubernetes API in the frontend for dashboards | | `unifiedHistory` | Displays the navigation history so the user can navigate back to previous pages | | `investigationsBackend` | Enable the investigations backend API | +| `k8SFolderCounts` | Enable folder's api server counts | +| `k8SFolderMove` | Enable folder's api server move | ## Development feature toggles diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index ef6049346c7..46cebb3309b 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -248,4 +248,6 @@ export interface FeatureToggles { unifiedHistory?: boolean; lokiLabelNamesQueryApi?: boolean; investigationsBackend?: boolean; + k8SFolderCounts?: boolean; + k8SFolderMove?: boolean; } diff --git a/pkg/api/folder.go b/pkg/api/folder.go index 8f2c195cf4d..cd19f59013e 100644 --- a/pkg/api/folder.go +++ b/pkg/api/folder.go @@ -63,8 +63,16 @@ func (hs *HTTPServer) registerFolderAPI(apiRoute routing.RouteRegister, authoriz folderUidRoute.Put("/", handler.updateFolder) folderUidRoute.Delete("/", handler.deleteFolder) folderUidRoute.Get("/", handler.getFolder) - folderUidRoute.Get("/counts", handler.countFolderContent) - folderUidRoute.Post("/move", handler.moveFolder) + if hs.Features.IsEnabledGlobally(featuremgmt.FlagK8SFolderCounts) { + folderUidRoute.Get("/counts", handler.countFolderContent) + } else { + folderUidRoute.Get("/counts", authorize(accesscontrol.EvalPermission(dashboards.ActionFoldersRead, uidScope)), routing.Wrap(hs.GetFolderDescendantCounts)) + } + if hs.Features.IsEnabledGlobally(featuremgmt.FlagK8SFolderMove) { + folderUidRoute.Post("/move", handler.moveFolder) + } else { + folderUidRoute.Post("/move", authorize(accesscontrol.EvalPermission(dashboards.ActionFoldersWrite, uidScope)), routing.Wrap(hs.MoveFolder)) + } }) } else { folderRoute.Post("/", authorize(accesscontrol.EvalPermission(dashboards.ActionFoldersCreate)), routing.Wrap(hs.CreateFolder)) diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index c3ecbab4883..f5858478fc1 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1719,6 +1719,20 @@ var ( Owner: grafanaAppPlatformSquad, Expression: "false", }, + { + Name: "k8SFolderCounts", + Description: "Enable folder's api server counts", + Stage: FeatureStageExperimental, + Owner: grafanaSearchAndStorageSquad, + Expression: "false", + }, + { + Name: "k8SFolderMove", + Description: "Enable folder's api server move", + Stage: FeatureStageExperimental, + Owner: grafanaSearchAndStorageSquad, + Expression: "false", + }, } ) diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index ff8687d9ad5..456e915dbba 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -229,3 +229,5 @@ elasticsearchCrossClusterSearch,preview,@grafana/aws-datasources,false,false,fal unifiedHistory,experimental,@grafana/grafana-frontend-platform,false,false,true lokiLabelNamesQueryApi,GA,@grafana/observability-logs,false,false,false investigationsBackend,experimental,@grafana/grafana-app-platform-squad,false,false,false +k8SFolderCounts,experimental,@grafana/search-and-storage,false,false,false +k8SFolderMove,experimental,@grafana/search-and-storage,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 4cd67bed405..c28ff8058a8 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -926,4 +926,12 @@ const ( // FlagInvestigationsBackend // Enable the investigations backend API FlagInvestigationsBackend = "investigationsBackend" + + // FlagK8SFolderCounts + // Enable folder's api server counts + FlagK8SFolderCounts = "k8SFolderCounts" + + // FlagK8SFolderMove + // Enable folder's api server move + FlagK8SFolderMove = "k8SFolderMove" ) diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index b764e3bc1c2..c36e5cd724c 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -1586,6 +1586,34 @@ "frontend": true } }, + { + "metadata": { + "name": "folderCounts", + "resourceVersion": "1734702013658", + "creationTimestamp": "2024-12-20T13:40:13Z", + "deletionTimestamp": "2024-12-27T10:19:54Z" + }, + "spec": { + "description": "Enable folder's api server counts", + "stage": "experimental", + "codeowner": "@grafana/search-and-storage", + "expression": "false" + } + }, + { + "metadata": { + "name": "folderMove", + "resourceVersion": "1734702013658", + "creationTimestamp": "2024-12-20T13:40:13Z", + "deletionTimestamp": "2024-12-27T10:19:54Z" + }, + "spec": { + "description": "Enable folder's api server move", + "stage": "experimental", + "codeowner": "@grafana/search-and-storage", + "expression": "false" + } + }, { "metadata": { "name": "formatString", @@ -1886,6 +1914,32 @@ "hideFromDocs": true } }, + { + "metadata": { + "name": "k8SFolderCounts", + "resourceVersion": "1735294794086", + "creationTimestamp": "2024-12-27T10:19:54Z" + }, + "spec": { + "description": "Enable folder's api server counts", + "stage": "experimental", + "codeowner": "@grafana/search-and-storage", + "expression": "false" + } + }, + { + "metadata": { + "name": "k8SFolderMove", + "resourceVersion": "1735294794086", + "creationTimestamp": "2024-12-27T10:19:54Z" + }, + "spec": { + "description": "Enable folder's api server move", + "stage": "experimental", + "codeowner": "@grafana/search-and-storage", + "expression": "false" + } + }, { "metadata": { "name": "kubernetesAggregator",