mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
ResourceServer: Update twice should return an ErrOptimisticLockingFailed (#90378)
Update twice should return an ErrOptimisticLockingFailed
This commit is contained in:
parent
216d99439b
commit
ff7c0edd64
@ -338,6 +338,10 @@ func (s *server) Update(ctx context.Context, req *UpdateRequest) (*UpdateRespons
|
||||
return nil, apierrors.NewBadRequest("current value does not exist")
|
||||
}
|
||||
|
||||
if req.ResourceVersion > 0 && latest.ResourceVersion != req.ResourceVersion {
|
||||
return nil, ErrOptimisticLockingFailed
|
||||
}
|
||||
|
||||
builder, err := s.newEventBuilder(ctx, req.Key, req.Value, latest.Value)
|
||||
if err != nil {
|
||||
rsp.Status, err = errToStatus(err)
|
||||
|
@ -164,4 +164,57 @@ func TestSimpleServer(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Len(t, all.Items, 0) // empty
|
||||
})
|
||||
|
||||
t.Run("playlist update optimistic concurrency check", func(t *testing.T) {
|
||||
raw := []byte(`{
|
||||
"apiVersion": "playlist.grafana.app/v0alpha1",
|
||||
"kind": "Playlist",
|
||||
"metadata": {
|
||||
"name": "fdgsv37qslr0ga",
|
||||
"namespace": "default",
|
||||
"annotations": {
|
||||
"grafana.app/originName": "elsewhere",
|
||||
"grafana.app/originPath": "path/to/item",
|
||||
"grafana.app/originTimestamp": "2024-02-02T00:00:00Z"
|
||||
}
|
||||
},
|
||||
"spec": {
|
||||
"title": "hello",
|
||||
"interval": "5m",
|
||||
"items": [
|
||||
{
|
||||
"type": "dashboard_by_uid",
|
||||
"value": "vmie2cmWz"
|
||||
}
|
||||
]
|
||||
}
|
||||
}`)
|
||||
|
||||
key := &ResourceKey{
|
||||
Group: "playlist.grafana.app",
|
||||
Resource: "rrrr", // can be anything :(
|
||||
Namespace: "default",
|
||||
Name: "fdgsv37qslr0ga",
|
||||
}
|
||||
|
||||
created, err := server.Create(ctx, &CreateRequest{
|
||||
Value: raw,
|
||||
Key: key,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Update should return an ErrOptimisticLockingFailed the second time
|
||||
|
||||
_, err = server.Update(ctx, &UpdateRequest{
|
||||
Key: key,
|
||||
Value: raw,
|
||||
ResourceVersion: created.ResourceVersion})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = server.Update(ctx, &UpdateRequest{
|
||||
Key: key,
|
||||
Value: raw,
|
||||
ResourceVersion: created.ResourceVersion})
|
||||
require.ErrorIs(t, err, ErrOptimisticLockingFailed)
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user