diff --git a/pkg/apiserver/rest/dualwriter.go b/pkg/apiserver/rest/dualwriter.go index 15be881b2500b..31ca7e9c97e9f 100644 --- a/pkg/apiserver/rest/dualwriter.go +++ b/pkg/apiserver/rest/dualwriter.go @@ -26,8 +26,18 @@ var ( _ rest.SingularNameProvider = (DualWriter)(nil) ) +type dualWriteContextKey struct{} + +func IsDualWriteUpdate(ctx context.Context) bool { + return ctx.Value(dualWriteContextKey{}) == true +} + +func WithDualWriteUpdate(ctx context.Context) context.Context { + return context.WithValue(ctx, dualWriteContextKey{}, true) +} + // Function that will create a dual writer -type DualWriteBuilder func(gr schema.GroupResource, legacy LegacyStorage, storage Storage) (Storage, error) +type DualWriteBuilder func(gr schema.GroupResource, legacy Storage, unified Storage) (Storage, error) // Storage is a storage implementation that satisfies the same interfaces as genericregistry.Store. type Storage interface { @@ -36,26 +46,12 @@ type Storage interface { rest.TableConvertor rest.SingularNameProvider rest.Getter - // TODO: when watch is implemented, we can replace all the below with rest.StandardStorage rest.Lister rest.CreaterUpdater rest.GracefulDeleter rest.CollectionDeleter } -// LegacyStorage is a storage implementation that writes to the Grafana SQL database. -type LegacyStorage interface { - rest.Storage - rest.Scoper - rest.SingularNameProvider - rest.CreaterUpdater - rest.Lister - rest.GracefulDeleter - rest.CollectionDeleter - rest.TableConvertor - rest.Getter -} - // DualWriter is a storage implementation that writes first to LegacyStorage and then to Storage. // If writing to LegacyStorage fails, the write to Storage is skipped and the error is returned. // Storage is used for all read operations. This is useful as a migration step from SQL based @@ -79,7 +75,6 @@ type LegacyStorage interface { type DualWriter interface { Storage - LegacyStorage Mode() DualWriterMode } @@ -110,8 +105,8 @@ const ( // NewDualWriter returns a new DualWriter. func NewDualWriter( mode DualWriterMode, - legacy LegacyStorage, - storage Storage, + legacy Storage, + unified Storage, reg prometheus.Registerer, resource string, ) Storage { @@ -122,17 +117,17 @@ func NewDualWriter( return legacy case Mode1: // read and write only from legacy storage - return newDualWriterMode1(legacy, storage, metrics, resource) + return newDualWriterMode1(legacy, unified, metrics, resource) case Mode2: // write to both, read from storage but use legacy as backup - return newDualWriterMode2(legacy, storage, metrics, resource) + return newDualWriterMode2(legacy, unified, metrics, resource) case Mode3: // write to both, read from storage only - return newDualWriterMode3(legacy, storage, metrics, resource) + return newDualWriterMode3(legacy, unified, metrics, resource) case Mode4, Mode5: - return storage + return unified default: - return newDualWriterMode1(legacy, storage, metrics, resource) + return newDualWriterMode1(legacy, unified, metrics, resource) } } diff --git a/pkg/apiserver/rest/dualwriter_mode1.go b/pkg/apiserver/rest/dualwriter_mode1.go index 2ce24e5200883..7395fc5d13bf3 100644 --- a/pkg/apiserver/rest/dualwriter_mode1.go +++ b/pkg/apiserver/rest/dualwriter_mode1.go @@ -15,7 +15,7 @@ import ( ) type DualWriterMode1 struct { - Legacy LegacyStorage + Legacy Storage Storage Storage *dualWriterMetrics resource string @@ -26,7 +26,7 @@ const mode1Str = "1" // NewDualWriterMode1 returns a new DualWriter in mode 1. // Mode 1 represents writing to and reading from LegacyStorage. -func newDualWriterMode1(legacy LegacyStorage, storage Storage, dwm *dualWriterMetrics, resource string) *DualWriterMode1 { +func newDualWriterMode1(legacy Storage, storage Storage, dwm *dualWriterMetrics, resource string) *DualWriterMode1 { return &DualWriterMode1{ Legacy: legacy, Storage: storage, diff --git a/pkg/apiserver/rest/dualwriter_mode1_test.go b/pkg/apiserver/rest/dualwriter_mode1_test.go index e5504e4df4ecf..398b25a3acc85 100644 --- a/pkg/apiserver/rest/dualwriter_mode1_test.go +++ b/pkg/apiserver/rest/dualwriter_mode1_test.go @@ -60,10 +60,10 @@ func TestMode1_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -122,10 +122,10 @@ func TestMode1_CreateOnUnifiedStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -190,10 +190,10 @@ func TestMode1_Get(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -251,10 +251,10 @@ func TestMode1_GetFromUnifiedStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -308,10 +308,10 @@ func TestMode1_List(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -365,10 +365,10 @@ func TestMode1_ListFromUnifiedStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -434,10 +434,10 @@ func TestMode1_Delete(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -494,10 +494,10 @@ func TestMode1_DeleteFromUnifiedStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -565,10 +565,10 @@ func TestMode1_DeleteCollection(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -626,10 +626,10 @@ func TestMode1_DeleteCollectionFromUnifiedStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -695,10 +695,10 @@ func TestMode1_Update(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -761,10 +761,10 @@ func TestMode1_UpdateOnUnifiedStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { diff --git a/pkg/apiserver/rest/dualwriter_mode2.go b/pkg/apiserver/rest/dualwriter_mode2.go index 84e841270e59b..17aae84e2fbff 100644 --- a/pkg/apiserver/rest/dualwriter_mode2.go +++ b/pkg/apiserver/rest/dualwriter_mode2.go @@ -16,15 +16,9 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/utils" ) -type dualWriteContextKey struct{} - -func IsDualWriteUpdate(ctx context.Context) bool { - return ctx.Value(dualWriteContextKey{}) == true -} - type DualWriterMode2 struct { Storage Storage - Legacy LegacyStorage + Legacy Storage *dualWriterMetrics resource string Log klog.Logger @@ -35,7 +29,7 @@ const mode2Str = "2" // newDualWriterMode2 returns a new DualWriter in mode 2. // Mode 2 represents writing to LegacyStorage first, then to Storage. // When reading, values from LegacyStorage will be returned. -func newDualWriterMode2(legacy LegacyStorage, storage Storage, dwm *dualWriterMetrics, resource string) *DualWriterMode2 { +func newDualWriterMode2(legacy Storage, storage Storage, dwm *dualWriterMetrics, resource string) *DualWriterMode2 { return &DualWriterMode2{ Legacy: legacy, Storage: storage, diff --git a/pkg/apiserver/rest/dualwriter_mode2_test.go b/pkg/apiserver/rest/dualwriter_mode2_test.go index dfd7b6db0f550..b0d653053dfdf 100644 --- a/pkg/apiserver/rest/dualwriter_mode2_test.go +++ b/pkg/apiserver/rest/dualwriter_mode2_test.go @@ -54,10 +54,10 @@ func TestMode2_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -138,10 +138,10 @@ func TestMode2_Get(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -212,10 +212,10 @@ func TestMode2_List(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -313,10 +313,10 @@ func TestMode2_Delete(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -382,10 +382,10 @@ func TestMode2_DeleteCollection(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -451,10 +451,10 @@ func TestMode2_Update(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { diff --git a/pkg/apiserver/rest/dualwriter_mode3.go b/pkg/apiserver/rest/dualwriter_mode3.go index bd28ef3c31c6b..db61f0ed7f797 100644 --- a/pkg/apiserver/rest/dualwriter_mode3.go +++ b/pkg/apiserver/rest/dualwriter_mode3.go @@ -17,7 +17,7 @@ import ( ) type DualWriterMode3 struct { - Legacy LegacyStorage + Legacy Storage Storage Storage watchImp rest.Watcher // watch is only available in mode 3 and 4 *dualWriterMetrics @@ -27,7 +27,7 @@ type DualWriterMode3 struct { // newDualWriterMode3 returns a new DualWriter in mode 3. // Mode 3 represents writing to LegacyStorage and Storage and reading from Storage. -func newDualWriterMode3(legacy LegacyStorage, storage Storage, dwm *dualWriterMetrics, resource string) *DualWriterMode3 { +func newDualWriterMode3(legacy Storage, storage Storage, dwm *dualWriterMetrics, resource string) *DualWriterMode3 { return &DualWriterMode3{ Legacy: legacy, Storage: storage, diff --git a/pkg/apiserver/rest/dualwriter_mode3_test.go b/pkg/apiserver/rest/dualwriter_mode3_test.go index f68287f4ead1d..832c8957aeb38 100644 --- a/pkg/apiserver/rest/dualwriter_mode3_test.go +++ b/pkg/apiserver/rest/dualwriter_mode3_test.go @@ -61,10 +61,10 @@ func TestMode3_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -128,10 +128,10 @@ func TestMode3_Get(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -187,10 +187,10 @@ func TestMode1_GetFromLegacyStorage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -234,10 +234,10 @@ func TestMode3_List(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupStorageFn != nil { @@ -311,10 +311,10 @@ func TestMode3_Delete(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -380,10 +380,10 @@ func TestMode3_DeleteCollection(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -449,10 +449,10 @@ func TestMode3_Update(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { diff --git a/pkg/apiserver/rest/dualwriter_syncer.go b/pkg/apiserver/rest/dualwriter_syncer.go index 9c36fdd22b7df..b15cf5376acf5 100644 --- a/pkg/apiserver/rest/dualwriter_syncer.go +++ b/pkg/apiserver/rest/dualwriter_syncer.go @@ -33,7 +33,7 @@ type SyncerConfig struct { RequestInfo *request.RequestInfo Mode DualWriterMode - LegacyStorage LegacyStorage + LegacyStorage Storage Storage Storage ServerLockService ServerLockService diff --git a/pkg/apiserver/rest/dualwriter_syncer_test.go b/pkg/apiserver/rest/dualwriter_syncer_test.go index d9d94cea54c0e..c1e0a216e9fd9 100644 --- a/pkg/apiserver/rest/dualwriter_syncer_test.go +++ b/pkg/apiserver/rest/dualwriter_syncer_test.go @@ -181,12 +181,12 @@ func TestLegacyToUnifiedStorage_DataSyncer(t *testing.T) { // mode 1 for _, tt := range tests { t.Run("Mode-1-"+tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) lm := &mock.Mock{} um := &mock.Mock{} - ls := legacyStoreMock{lm, l} + ls := storageMock{lm, l} us := storageMock{um, s} if tt.setupLegacyFn != nil { @@ -221,12 +221,12 @@ func TestLegacyToUnifiedStorage_DataSyncer(t *testing.T) { // mode 2 for _, tt := range tests { t.Run("Mode-2-"+tt.name, func(t *testing.T) { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) lm := &mock.Mock{} um := &mock.Mock{} - ls := legacyStoreMock{lm, l} + ls := storageMock{lm, l} us := storageMock{um, s} if tt.setupLegacyFn != nil { diff --git a/pkg/apiserver/rest/dualwriter_test.go b/pkg/apiserver/rest/dualwriter_test.go index 13fc007dc5317..3faf131424e75 100644 --- a/pkg/apiserver/rest/dualwriter_test.go +++ b/pkg/apiserver/rest/dualwriter_test.go @@ -64,7 +64,7 @@ func TestSetDualWritingMode(t *testing.T) { } for _, tt := range tests { - l := (LegacyStorage)(nil) + l := (Storage)(nil) s := (Storage)(nil) sm := &mock.Mock{} @@ -75,7 +75,7 @@ func TestSetDualWritingMode(t *testing.T) { lm := &mock.Mock{} lm.On("List", mock.Anything, mock.Anything).Return(exampleList, nil) - ls := legacyStoreMock{lm, l} + ls := storageMock{lm, l} serverLockSvc := &fakeServerLock{ err: tt.serverLockError, diff --git a/pkg/apiserver/rest/storage_mocks_test.go b/pkg/apiserver/rest/storage_mocks_test.go index 582bcdc067c61..3baaa14c5262c 100644 --- a/pkg/apiserver/rest/storage_mocks_test.go +++ b/pkg/apiserver/rest/storage_mocks_test.go @@ -11,102 +11,11 @@ import ( "k8s.io/apiserver/pkg/registry/rest" ) -type legacyStoreMock struct { - *mock.Mock - LegacyStorage -} - type storageMock struct { *mock.Mock Storage } -func (m legacyStoreMock) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - - args := m.Called(ctx, name, options) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - -func (m legacyStoreMock) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - - args := m.Called(ctx, obj, createValidation, options) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - -func (m legacyStoreMock) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - - args := m.Called(ctx, options) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - -func (m legacyStoreMock) NewList() runtime.Object { - return nil -} - -func (m legacyStoreMock) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) { - select { - case <-ctx.Done(): - return nil, false, errors.New("context canceled") - default: - } - args := m.Called(ctx, name, objInfo, createValidation, updateValidation, forceAllowCreate, options) - if err := args.Get(2); err != nil { - return nil, false, err.(error) - } - return args.Get(0).(runtime.Object), args.Bool(1), args.Error(2) -} - -func (m legacyStoreMock) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) { - select { - case <-ctx.Done(): - return nil, false, errors.New("context canceled") - default: - } - - args := m.Called(ctx, name, deleteValidation, options) - if err := args.Get(2); err != nil { - return nil, false, err.(error) - } - return args.Get(0).(runtime.Object), args.Bool(1), args.Error(2) -} - -func (m legacyStoreMock) DeleteCollection(ctx context.Context, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions, listOptions *metainternalversion.ListOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - args := m.Called(ctx, deleteValidation, options, listOptions) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - // Unified Store func (m storageMock) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { select { diff --git a/pkg/registry/apis/alerting/notifications/receiver/legacy_storage.go b/pkg/registry/apis/alerting/notifications/receiver/legacy_storage.go index 6b1377dc1f3ef..65f5593cf3a9c 100644 --- a/pkg/registry/apis/alerting/notifications/receiver/legacy_storage.go +++ b/pkg/registry/apis/alerting/notifications/receiver/legacy_storage.go @@ -13,7 +13,7 @@ import ( model "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/resource/receiver/v0alpha1" "github.com/grafana/grafana/pkg/apimachinery/identity" - grafanaRest "github.com/grafana/grafana/pkg/apiserver/rest" + grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" alertingac "github.com/grafana/grafana/pkg/services/ngalert/accesscontrol" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" @@ -22,7 +22,7 @@ import ( ) var ( - _ grafanaRest.LegacyStorage = (*legacyStorage)(nil) + _ grafanarest.Storage = (*legacyStorage)(nil) ) type ReceiverService interface { diff --git a/pkg/registry/apis/alerting/notifications/routingtree/legacy_storage.go b/pkg/registry/apis/alerting/notifications/routingtree/legacy_storage.go index 00c20880212fc..07f5138aca88b 100644 --- a/pkg/registry/apis/alerting/notifications/routingtree/legacy_storage.go +++ b/pkg/registry/apis/alerting/notifications/routingtree/legacy_storage.go @@ -11,14 +11,14 @@ import ( "k8s.io/apiserver/pkg/registry/rest" model "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/resource/routingtree/v0alpha1" - grafanaRest "github.com/grafana/grafana/pkg/apiserver/rest" + grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" alerting_models "github.com/grafana/grafana/pkg/services/ngalert/models" ) var ( - _ grafanaRest.LegacyStorage = (*legacyStorage)(nil) + _ grafanarest.Storage = (*legacyStorage)(nil) ) type RouteService interface { diff --git a/pkg/registry/apis/alerting/notifications/templategroup/legacy_storage.go b/pkg/registry/apis/alerting/notifications/templategroup/legacy_storage.go index a492c4b3b4949..ada3f463820a9 100644 --- a/pkg/registry/apis/alerting/notifications/templategroup/legacy_storage.go +++ b/pkg/registry/apis/alerting/notifications/templategroup/legacy_storage.go @@ -4,13 +4,14 @@ import ( "context" "fmt" - "github.com/grafana/alerting/templates" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" + "github.com/grafana/alerting/templates" + model "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/resource/templategroup/v0alpha1" grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" @@ -19,7 +20,7 @@ import ( ) var ( - _ grafanarest.LegacyStorage = (*legacyStorage)(nil) + _ grafanarest.Storage = (*legacyStorage)(nil) ) type TemplateService interface { diff --git a/pkg/registry/apis/alerting/notifications/timeinterval/legacy_storage.go b/pkg/registry/apis/alerting/notifications/timeinterval/legacy_storage.go index 7a7ef74165aae..bb382ee952531 100644 --- a/pkg/registry/apis/alerting/notifications/timeinterval/legacy_storage.go +++ b/pkg/registry/apis/alerting/notifications/timeinterval/legacy_storage.go @@ -11,14 +11,14 @@ import ( "k8s.io/apiserver/pkg/registry/rest" model "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/resource/timeinterval/v0alpha1" - grafanaRest "github.com/grafana/grafana/pkg/apiserver/rest" + grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" ) var ( - _ grafanaRest.LegacyStorage = (*legacyStorage)(nil) + _ grafanarest.Storage = (*legacyStorage)(nil) ) type TimeIntervalService interface { diff --git a/pkg/registry/apis/dashboard/legacy_storage.go b/pkg/registry/apis/dashboard/legacy_storage.go index 214c2ad220215..b5e033df390d1 100644 --- a/pkg/registry/apis/dashboard/legacy_storage.go +++ b/pkg/registry/apis/dashboard/legacy_storage.go @@ -28,7 +28,7 @@ type DashboardStorage struct { Features featuremgmt.FeatureToggles } -func (s *DashboardStorage) NewStore(scheme *runtime.Scheme, defaultOptsGetter generic.RESTOptionsGetter, reg prometheus.Registerer) (grafanarest.LegacyStorage, error) { +func (s *DashboardStorage) NewStore(scheme *runtime.Scheme, defaultOptsGetter generic.RESTOptionsGetter, reg prometheus.Registerer) (grafanarest.Storage, error) { server, err := resource.NewResourceServer(resource.ResourceServerOptions{ Backend: s.Access, Reg: reg, diff --git a/pkg/registry/apis/dashboard/register.go b/pkg/registry/apis/dashboard/register.go index c223026576f2b..a06dfe50a0ff7 100644 --- a/pkg/registry/apis/dashboard/register.go +++ b/pkg/registry/apis/dashboard/register.go @@ -17,6 +17,8 @@ import ( "k8s.io/kube-openapi/pkg/spec3" "k8s.io/kube-openapi/pkg/validation/spec" + "github.com/prometheus/client_golang/prometheus" + claims "github.com/grafana/authlib/types" "github.com/grafana/grafana/pkg/apimachinery/utils" dashboardinternal "github.com/grafana/grafana/pkg/apis/dashboard" @@ -42,7 +44,6 @@ import ( "github.com/grafana/grafana/pkg/storage/legacysql/dualwrite" "github.com/grafana/grafana/pkg/storage/unified/apistore" "github.com/grafana/grafana/pkg/storage/unified/resource" - "github.com/prometheus/client_golang/prometheus" ) var ( @@ -247,7 +248,7 @@ func (b *DashboardsAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver func (b *DashboardsAPIBuilder) storageForVersion( opts builder.APIGroupOptions, - legacyStore grafanarest.LegacyStorage, + legacyStore grafanarest.Storage, largeObjects apistore.LargeObjectSupport, newDTOFunc func() runtime.Object, ) (map[string]rest.Storage, error) { diff --git a/pkg/registry/apps/playlist/register.go b/pkg/registry/apps/playlist/register.go index 9f79bb22f1d75..a4215d880d478 100644 --- a/pkg/registry/apps/playlist/register.go +++ b/pkg/registry/apps/playlist/register.go @@ -48,7 +48,7 @@ func RegisterApp( return provider } -func (p *PlaylistAppProvider) legacyStorageGetter(requested schema.GroupVersionResource) grafanarest.LegacyStorage { +func (p *PlaylistAppProvider) legacyStorageGetter(requested schema.GroupVersionResource) grafanarest.Storage { gvr := schema.GroupVersionResource{ Group: playlistv0alpha1.PlaylistKind().Group(), Version: playlistv0alpha1.PlaylistKind().Version(), diff --git a/pkg/services/apiserver/builder/helper.go b/pkg/services/apiserver/builder/helper.go index 33e06c2580b1f..8f6fe0e378393 100644 --- a/pkg/services/apiserver/builder/helper.go +++ b/pkg/services/apiserver/builder/helper.go @@ -286,7 +286,7 @@ func InstallAPIs( // nolint:staticcheck if storageOpts.StorageType != options.StorageTypeLegacy { - dualWrite = func(gr schema.GroupResource, legacy grafanarest.LegacyStorage, storage grafanarest.Storage) (grafanarest.Storage, error) { + dualWrite = func(gr schema.GroupResource, legacy grafanarest.Storage, storage grafanarest.Storage) (grafanarest.Storage, error) { // Dashboards + Folders may be managed (depends on feature toggles and database state) if dualWriteService != nil && dualWriteService.ShouldManage(gr) { return dualWriteService.NewStorage(gr, legacy, storage) // eventually this can replace this whole function diff --git a/pkg/services/apiserver/builder/runner/builder.go b/pkg/services/apiserver/builder/runner/builder.go index 1bc052fb46edf..8a7b18a5fe2c7 100644 --- a/pkg/services/apiserver/builder/runner/builder.go +++ b/pkg/services/apiserver/builder/runner/builder.go @@ -18,7 +18,7 @@ import ( var _ AppBuilder = (*appBuilder)(nil) -type LegacyStorageGetter func(schema.GroupVersionResource) grafanarest.LegacyStorage +type LegacyStorageGetter func(schema.GroupVersionResource) grafanarest.Storage type AppBuilderConfig struct { Authorizer authorizer.Authorizer diff --git a/pkg/storage/legacysql/dualwrite/mock.go b/pkg/storage/legacysql/dualwrite/mock.go index 130c5c0feff5c..3dbf71a126a63 100644 --- a/pkg/storage/legacysql/dualwrite/mock.go +++ b/pkg/storage/legacysql/dualwrite/mock.go @@ -26,7 +26,7 @@ type mockService struct { } // NewStorage implements Service. -func (m *mockService) NewStorage(gr schema.GroupResource, legacy rest.LegacyStorage, storage rest.Storage) (rest.Storage, error) { +func (m *mockService) NewStorage(gr schema.GroupResource, legacy rest.Storage, storage rest.Storage) (rest.Storage, error) { return nil, fmt.Errorf("not implemented") } diff --git a/pkg/storage/legacysql/dualwrite/runtime.go b/pkg/storage/legacysql/dualwrite/runtime.go index 5fe705c340901..33896e669e2e0 100644 --- a/pkg/storage/legacysql/dualwrite/runtime.go +++ b/pkg/storage/legacysql/dualwrite/runtime.go @@ -15,7 +15,7 @@ import ( ) func (m *service) NewStorage(gr schema.GroupResource, - legacy grafanarest.LegacyStorage, + legacy grafanarest.Storage, storage grafanarest.Storage, ) (grafanarest.Storage, error) { status, err := m.Status(context.Background(), gr) @@ -53,7 +53,7 @@ func (m *service) NewStorage(gr schema.GroupResource, // When a resource is marked as "migrating", all write requests will be 503 unavailable type runtimeDualWriter struct { service Service - legacy grafanarest.LegacyStorage + legacy grafanarest.Storage unified grafanarest.Storage dualwrite grafanarest.Storage gr schema.GroupResource diff --git a/pkg/storage/legacysql/dualwrite/runtime_test.go b/pkg/storage/legacysql/dualwrite/runtime_test.go index c97139948f2b5..9c148eaf07f34 100644 --- a/pkg/storage/legacysql/dualwrite/runtime_test.go +++ b/pkg/storage/legacysql/dualwrite/runtime_test.go @@ -76,10 +76,10 @@ func TestManagedMode3_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (rest.LegacyStorage)(nil) + l := (rest.Storage)(nil) s := (rest.Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -148,10 +148,10 @@ func TestManagedMode3_Get(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (rest.LegacyStorage)(nil) + l := (rest.Storage)(nil) s := (rest.Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { @@ -249,10 +249,10 @@ func TestManagedMode3_CreateWhileMigrating(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - l := (rest.LegacyStorage)(nil) + l := (rest.Storage)(nil) s := (rest.Storage)(nil) - ls := legacyStoreMock{&mock.Mock{}, l} + ls := storageMock{&mock.Mock{}, l} us := storageMock{&mock.Mock{}, s} if tt.setupLegacyFn != nil { diff --git a/pkg/storage/legacysql/dualwrite/static.go b/pkg/storage/legacysql/dualwrite/static.go index 64e8c14a85a5d..d74e2a5b91412 100644 --- a/pkg/storage/legacysql/dualwrite/static.go +++ b/pkg/storage/legacysql/dualwrite/static.go @@ -14,7 +14,7 @@ type staticService struct { cfg *setting.Cfg } -func (m *staticService) NewStorage(gr schema.GroupResource, legacy rest.LegacyStorage, storage rest.Storage) (rest.Storage, error) { +func (m *staticService) NewStorage(gr schema.GroupResource, legacy rest.Storage, storage rest.Storage) (rest.Storage, error) { return nil, fmt.Errorf("not implemented") } diff --git a/pkg/storage/legacysql/dualwrite/storage_mocks_test.go b/pkg/storage/legacysql/dualwrite/storage_mocks_test.go index 62ce9be23446c..b3905d1c3d341 100644 --- a/pkg/storage/legacysql/dualwrite/storage_mocks_test.go +++ b/pkg/storage/legacysql/dualwrite/storage_mocks_test.go @@ -13,102 +13,11 @@ import ( grafanarest "github.com/grafana/grafana/pkg/apiserver/rest" ) -type legacyStoreMock struct { - *mock.Mock - grafanarest.LegacyStorage -} - type storageMock struct { *mock.Mock grafanarest.Storage } -func (m legacyStoreMock) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - - args := m.Called(ctx, name, options) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - -func (m legacyStoreMock) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, options *metav1.CreateOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - - args := m.Called(ctx, obj, createValidation, options) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - -func (m legacyStoreMock) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - - args := m.Called(ctx, options) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - -func (m legacyStoreMock) NewList() runtime.Object { - return nil -} - -func (m legacyStoreMock) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) { - select { - case <-ctx.Done(): - return nil, false, errors.New("context canceled") - default: - } - args := m.Called(ctx, name, objInfo, createValidation, updateValidation, forceAllowCreate, options) - if err := args.Get(2); err != nil { - return nil, false, err.(error) - } - return args.Get(0).(runtime.Object), args.Bool(1), args.Error(2) -} - -func (m legacyStoreMock) Delete(ctx context.Context, name string, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions) (runtime.Object, bool, error) { - select { - case <-ctx.Done(): - return nil, false, errors.New("context canceled") - default: - } - - args := m.Called(ctx, name, deleteValidation, options) - if err := args.Get(2); err != nil { - return nil, false, err.(error) - } - return args.Get(0).(runtime.Object), args.Bool(1), args.Error(2) -} - -func (m legacyStoreMock) DeleteCollection(ctx context.Context, deleteValidation rest.ValidateObjectFunc, options *metav1.DeleteOptions, listOptions *metainternalversion.ListOptions) (runtime.Object, error) { - select { - case <-ctx.Done(): - return nil, errors.New("context canceled") - default: - } - args := m.Called(ctx, deleteValidation, options, listOptions) - if err := args.Get(1); err != nil { - return nil, err.(error) - } - return args.Get(0).(runtime.Object), args.Error(1) -} - // Unified Store func (m storageMock) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { select { diff --git a/pkg/storage/legacysql/dualwrite/types.go b/pkg/storage/legacysql/dualwrite/types.go index 4b43f0d39a8b8..0478aa5438e3a 100644 --- a/pkg/storage/legacysql/dualwrite/types.go +++ b/pkg/storage/legacysql/dualwrite/types.go @@ -36,7 +36,7 @@ type Service interface { ShouldManage(gr schema.GroupResource) bool // Create a managed k8s storage instance - NewStorage(gr schema.GroupResource, legacy grafanarest.LegacyStorage, storage grafanarest.Storage) (grafanarest.Storage, error) + NewStorage(gr schema.GroupResource, legacy grafanarest.Storage, storage grafanarest.Storage) (grafanarest.Storage, error) // Check if the dual writes is reading from unified storage (mode3++) ReadFromUnified(ctx context.Context, gr schema.GroupResource) (bool, error)