From b1ff3eb2f19282fc0e1890bc1503667ccda2dcf0 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Tue, 2 Dec 2025 14:48:02 +0300 Subject: [PATCH] remove general folder in legacy api --- pkg/registry/apis/folders/validate.go | 25 +++++++++++----------- pkg/services/folder/folderimpl/folder.go | 4 ++++ pkg/tests/apis/provisioning/helper_test.go | 8 +++---- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/pkg/registry/apis/folders/validate.go b/pkg/registry/apis/folders/validate.go index 4f8ccd2250d..3f61c4e52b6 100644 --- a/pkg/registry/apis/folders/validate.go +++ b/pkg/registry/apis/folders/validate.go @@ -44,12 +44,12 @@ func validateOnCreate(ctx context.Context, f *folders.Folder, getter parentsGett return dashboards.ErrFolderTitleEmpty } - parentName := meta.GetFolder() - if parentName == "" { + switch meta.GetFolder() { + case "", folder.GeneralFolderUID: return nil // OK, we do not need to validate the tree - } - - if parentName == f.Name { + case folder.SharedWithMeFolderUID: + return fmt.Errorf("can not save shared with me") + case f.Name: return folder.ErrFolderCannotBeParentOfItself } @@ -94,14 +94,15 @@ func validateOnUpdate(ctx context.Context, // Validate the move operation newParent := folderObj.GetFolder() - // If we move to root, we don't need to validate the depth. - if newParent == folder.RootFolderUID { - return nil - } - - // folder cannot be moved to a k6 folder - if newParent == accesscontrol.K6FolderUID { + switch newParent { + case "", folder.GeneralFolderUID: + return nil // OK, we do not need to validate the tree + case folder.SharedWithMeFolderUID: + return fmt.Errorf("can not save shared with me") + case accesscontrol.K6FolderUID: return fmt.Errorf("k6 project may not be moved") + case folderObj.GetName(): + return folder.ErrFolderCannotBeParentOfItself } parentObj, err := getter.Get(ctx, newParent, &metav1.GetOptions{}) diff --git a/pkg/services/folder/folderimpl/folder.go b/pkg/services/folder/folderimpl/folder.go index a78d1d76b7c..08d2682f52d 100644 --- a/pkg/services/folder/folderimpl/folder.go +++ b/pkg/services/folder/folderimpl/folder.go @@ -1283,6 +1283,10 @@ func (s *Service) buildSaveDashboardCommand(ctx context.Context, dto *dashboards return nil, dashboards.ErrDashboardFolderNameExists } + if dash.FolderUID == folder.GeneralFolderUID { + dash.FolderUID = "" // general is the same as root + } + if dash.FolderUID != "" { if _, err := s.dashboardFolderStore.GetFolderByUID(ctx, dash.OrgID, dash.FolderUID); err != nil { return nil, err diff --git a/pkg/tests/apis/provisioning/helper_test.go b/pkg/tests/apis/provisioning/helper_test.go index f4687bdb01b..1bf6d79054c 100644 --- a/pkg/tests/apis/provisioning/helper_test.go +++ b/pkg/tests/apis/provisioning/helper_test.go @@ -534,12 +534,12 @@ func (h *provisioningTestHelper) validateManagedDashboardsFolderMetadata(t *test sourcePath, _, _ := unstructured.NestedString(d.Object, "metadata", "annotations", "grafana.app/sourcePath") isNested := strings.Contains(sourcePath, "/") - folder, found, _ := unstructured.NestedString(d.Object, "metadata", "annotations", "grafana.app/folder") + folderName, found, _ := unstructured.NestedString(d.Object, "metadata", "annotations", "grafana.app/folder") + require.True(t, found, "dashboard will always have a folder annotation") if isNested { - require.True(t, found, "dashboard should have a folder annotation") - require.NotEmpty(t, folder, "dashboard should be in a non-empty folder") + require.NotEmpty(t, folderName, "dashboard should be in a non-empty folder") } else { - require.False(t, found, "dashboard should not have a folder annotation") + require.Equal(t, folderName, "general", "non nested folder is in general") } managerID, _, _ := unstructured.NestedString(d.Object, "metadata", "annotations", "grafana.app/managerId")