diff --git a/pkg/registry/apis/dashboard/register.go b/pkg/registry/apis/dashboard/register.go index ee5219e38f8..92c09689838 100644 --- a/pkg/registry/apis/dashboard/register.go +++ b/pkg/registry/apis/dashboard/register.go @@ -352,16 +352,6 @@ func (b *DashboardsAPIBuilder) validateUpdate(ctx context.Context, a admission.A return apierrors.NewBadRequest(err.Error()) } - allowOverwrite := false // TODO: Add support for overwrite flag - // check for is someone else has written in between - if newAccessor.GetGeneration() != oldAccessor.GetGeneration() { - if allowOverwrite { - newAccessor.SetGeneration(oldAccessor.GetGeneration()) - } else { - return apierrors.NewBadRequest(dashboards.ErrDashboardVersionMismatch.Error()) - } - } - return nil } diff --git a/pkg/registry/apis/folders/conversions.go b/pkg/registry/apis/folders/conversions.go index 39ca3e1137b..bf743893816 100644 --- a/pkg/registry/apis/folders/conversions.go +++ b/pkg/registry/apis/folders/conversions.go @@ -22,6 +22,7 @@ func LegacyCreateCommandToUnstructured(cmd *folder.CreateFolderCommand) (*unstru "spec": map[string]any{ "title": cmd.Title, "description": cmd.Description, + "version": 1, }, }, } @@ -52,6 +53,7 @@ func convertToK8sResource(v *folder.Folder, namespacer request.NamespaceMapper) ResourceVersion: fmt.Sprintf("%d", v.Updated.UnixMilli()), CreationTimestamp: metav1.NewTime(v.Created), Namespace: namespacer(v.OrgID), + Generation: int64(v.Version), }, Spec: folders.FolderSpec{ Title: v.Title, diff --git a/pkg/services/folder/folderimpl/conversions.go b/pkg/services/folder/folderimpl/conversions.go index 03e4d560756..d682ad604d0 100644 --- a/pkg/services/folder/folderimpl/conversions.go +++ b/pkg/services/folder/folderimpl/conversions.go @@ -88,6 +88,7 @@ func (ss *FolderUnifiedStoreImpl) UnstructuredToLegacyFolder(ctx context.Context updaterId = creatorId } + folder.Version = int(item.GetGeneration()) folder.CreatedBy = creatorId folder.UpdatedBy = updaterId @@ -124,6 +125,7 @@ func (ss *FolderUnifiedStoreImpl) UnstructuredToLegacyFolderList(ctx context.Con updaterId = creatorId } + folder.Version = int(item.GetGeneration()) folder.CreatedBy = creatorId folder.UpdatedBy = updaterId folders = append(folders, folder) diff --git a/pkg/services/folder/folderimpl/folder_unifiedstorage.go b/pkg/services/folder/folderimpl/folder_unifiedstorage.go index b9f3633b292..8a7f5134e3d 100644 --- a/pkg/services/folder/folderimpl/folder_unifiedstorage.go +++ b/pkg/services/folder/folderimpl/folder_unifiedstorage.go @@ -591,6 +591,8 @@ func (s *Service) updateOnApiServer(ctx context.Context, cmd *folder.UpdateFolde NewTitle: cmd.NewTitle, NewDescription: cmd.NewDescription, SignedInUser: user, + Overwrite: cmd.Overwrite, + Version: cmd.Version, }) if err != nil { diff --git a/pkg/services/folder/folderimpl/unifiedstore.go b/pkg/services/folder/folderimpl/unifiedstore.go index 7cd4b0fece4..193167358ed 100644 --- a/pkg/services/folder/folderimpl/unifiedstore.go +++ b/pkg/services/folder/folderimpl/unifiedstore.go @@ -104,6 +104,11 @@ func (ss *FolderUnifiedStoreImpl) Update(ctx context.Context, cmd folder.UpdateF return nil, err } meta.SetFolder(*cmd.NewParentUID) + } else { + // only compare versions if not moving the folder + if !cmd.Overwrite && (cmd.Version != int(obj.GetGeneration())) { + return nil, dashboards.ErrDashboardVersionMismatch + } } out, err := ss.k8sclient.Update(ctx, updated, cmd.OrgID, v1.UpdateOptions{