grafana/pkg/apiserver/rest/dualwriter_mode3_test.go
Leonor Oliveira 9baf96dbd2
Storage: dualwriter update implementation (#85844)
* Add update methods for the dual writer

* improve errors

* [WIP] add tests for the update method

* Move example package to its own package so it can be used by the rest package. Finish tests

* Add codeowners

* Use Pod as a dummy resource

* :int

* Lint

* [REVIEW] rename var

* [REVIEW] don't rely on legacy storage at all in mode4

* Update pkg/apiserver/rest/dualwriter_mode2.go

Co-authored-by: Arati R. <33031346+suntala@users.noreply.github.com>

* [REVIEW] improve comment

* Update pkg/apiserver/rest/dualwriter_mode1.go

Co-authored-by: Dan Cech <dcech@grafana.com>

* [REVIEW] improve mode3

* Lint

* Move test files

* Update pkg/apiserver/rest/dualwriter_mode2.go

Co-authored-by: Arati R. <33031346+suntala@users.noreply.github.com>

* Lint

* Update pkg/apiserver/rest/dualwriter_mode4_test.go

Co-authored-by: Arati R. <33031346+suntala@users.noreply.github.com>

* Fix error

* Lint

* Update pkg/apiserver/rest/dualwriter_mode2.go

Co-authored-by: Arati R. <33031346+suntala@users.noreply.github.com>

* Don't set the flag to true as updatedObj creates an object in case it's not found

* Lint

* Lint

* Add tests on update

* Lint

---------

Co-authored-by: Arati R. <33031346+suntala@users.noreply.github.com>
Co-authored-by: Dan Cech <dcech@grafana.com>
2024-04-17 08:32:34 -06:00

73 lines
2.7 KiB
Go

package rest
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/apis/example"
)
func TestMode3(t *testing.T) {
var ls = (LegacyStorage)(nil)
var s = (Storage)(nil)
lsSpy := NewLegacyStorageSpyClient(ls)
sSpy := NewStorageSpyClient(s)
dw := NewDualWriterMode3(lsSpy, sSpy)
// Create: it should use the Legacy Create implementation
_, err := dw.Create(context.Background(), &dummyObject{}, func(context.Context, runtime.Object) error { return nil }, &metav1.CreateOptions{})
assert.NoError(t, err)
assert.Equal(t, 1, lsSpy.Counts("LegacyStorage.Create"))
assert.Equal(t, 1, sSpy.Counts("Storage.Create"))
// Get: it should use the Storage Get implementation
_, err = dw.Get(context.Background(), kind, &metav1.GetOptions{})
assert.NoError(t, err)
assert.Equal(t, 0, lsSpy.Counts("LegacyStorage.Get"))
assert.Equal(t, 1, sSpy.Counts("Storage.Get"))
// List: it should use the Storage List implementation
_, err = dw.List(context.Background(), &metainternalversion.ListOptions{})
assert.NoError(t, err)
assert.Equal(t, 0, lsSpy.Counts("LegacyStorage.List"))
assert.Equal(t, 1, sSpy.Counts("Storage.List"))
// Delete: it should use call both Legacy and Storage Delete methods
var deleteValidation = func(ctx context.Context, obj runtime.Object) error { return nil }
_, _, err = dw.Delete(context.Background(), kind, deleteValidation, &metav1.DeleteOptions{})
assert.NoError(t, err)
assert.Equal(t, 1, lsSpy.Counts("LegacyStorage.Delete"))
assert.Equal(t, 1, sSpy.Counts("Storage.Delete"))
// DeleteCollection: it should delete from both LegacyStorage and Storage
_, err = dw.DeleteCollection(
context.Background(),
func(context.Context, runtime.Object) error { return nil },
&metav1.DeleteOptions{},
&metainternalversion.ListOptions{},
)
assert.NoError(t, err)
assert.Equal(t, 1, lsSpy.Counts("LegacyStorage.DeleteCollection"))
assert.Equal(t, 1, sSpy.Counts("Storage.DeleteCollection"))
// Update: it should update in both storages
dummy := &example.Pod{}
uoi := UpdatedObjInfoObj{}
_, err = uoi.UpdatedObject(context.Background(), dummy)
assert.NoError(t, err)
var validateObjFn = func(ctx context.Context, obj runtime.Object) error { return nil }
var validateObjUpdateFn = func(ctx context.Context, obj, old runtime.Object) error { return nil }
_, _, err = dw.Update(context.Background(), kind, uoi, validateObjFn, validateObjUpdateFn, false, &metav1.UpdateOptions{})
assert.NoError(t, err)
assert.Equal(t, 1, lsSpy.Counts("LegacyStorage.Update"))
assert.Equal(t, 1, sSpy.Counts("Storage.Update"))
assert.NoError(t, err)
}