diff --git a/pkg/registry/apis/dashboard/legacy/sql_dashboards.go b/pkg/registry/apis/dashboard/legacy/sql_dashboards.go index 8cd1bb90226..3c82455bb8b 100644 --- a/pkg/registry/apis/dashboard/legacy/sql_dashboards.go +++ b/pkg/registry/apis/dashboard/legacy/sql_dashboards.go @@ -200,6 +200,10 @@ func (r *rowsWrapper) ResourceVersion() int64 { return r.row.RV } +func (r *rowsWrapper) Folder() string { + return r.row.FolderUID +} + // Value implements resource.ListIterator. func (r *rowsWrapper) Value() []byte { b, err := json.Marshal(r.row.Dash) diff --git a/pkg/registry/apis/dashboard/legacy/storage.go b/pkg/registry/apis/dashboard/legacy/storage.go index 2f96178ca7f..4a830dd2719 100644 --- a/pkg/registry/apis/dashboard/legacy/storage.go +++ b/pkg/registry/apis/dashboard/legacy/storage.go @@ -128,8 +128,8 @@ func (a *dashboardSqlAccess) GetDashboard(ctx context.Context, orgId int64, uid } // Read implements ResourceStoreServer. -func (a *dashboardSqlAccess) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.ReadResponse { - rsp := &resource.ReadResponse{} +func (a *dashboardSqlAccess) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.BackendReadResponse { + rsp := &resource.BackendReadResponse{} info, err := claims.ParseNamespace(req.Key.Namespace) if err == nil { err = isDashboardKey(req.Key, true) @@ -242,7 +242,7 @@ func (a *dashboardSqlAccess) WatchWriteEvents(ctx context.Context) (<-chan *reso } // Simple wrapper for index implementation -func (a *dashboardSqlAccess) Read(ctx context.Context, req *resource.ReadRequest) (*resource.ReadResponse, error) { +func (a *dashboardSqlAccess) Read(ctx context.Context, req *resource.ReadRequest) (*resource.BackendReadResponse, error) { return a.ReadResource(ctx, req), nil } diff --git a/pkg/storage/unified/resource/cdk_backend.go b/pkg/storage/unified/resource/cdk_backend.go index 6d45f153c0d..d9aabec1005 100644 --- a/pkg/storage/unified/resource/cdk_backend.go +++ b/pkg/storage/unified/resource/cdk_backend.go @@ -138,7 +138,7 @@ func (s *cdkBackend) WriteEvent(ctx context.Context, event WriteEvent) (rv int64 return rv, err } -func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *ReadResponse { +func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *BackendReadResponse { rv := req.ResourceVersion path := s.getPath(req.Key, rv) @@ -166,7 +166,7 @@ func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *ReadRe raw, err := s.bucket.ReadAll(ctx, path) if raw == nil && req.ResourceVersion > 0 { if req.ResourceVersion > s.rv.Load() { - return &ReadResponse{ + return &BackendReadResponse{ Error: &ErrorResult{ Code: http.StatusGatewayTimeout, Reason: string(metav1.StatusReasonTimeout), // match etcd behavior @@ -195,9 +195,11 @@ func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *ReadRe raw = nil } if raw == nil { - return &ReadResponse{Error: NewNotFoundError(req.Key)} + return &BackendReadResponse{Error: NewNotFoundError(req.Key)} } - return &ReadResponse{ + return &BackendReadResponse{ + Key: req.Key, + Folder: "", // TODO: implement this ResourceVersion: rv, Value: raw, } @@ -322,6 +324,10 @@ func (c *cdkListIterator) Namespace() string { return c.currentKey // TODO (parse namespace from key) } +func (c *cdkListIterator) Folder() string { + return "" // TODO: implement this +} + var _ ListIterator = (*cdkListIterator)(nil) func buildTree(ctx context.Context, s *cdkBackend, key *ResourceKey) (*cdkListIterator, error) { diff --git a/pkg/storage/unified/resource/event.go b/pkg/storage/unified/resource/event.go index 53d250d1b72..91c9225ee0c 100644 --- a/pkg/storage/unified/resource/event.go +++ b/pkg/storage/unified/resource/event.go @@ -24,6 +24,8 @@ type WriteEvent struct { // WriteEvents after they include a resource version type WrittenEvent struct { WriteEvent + // Metadata + Folder string // The resource version ResourceVersion int64 diff --git a/pkg/storage/unified/resource/server.go b/pkg/storage/unified/resource/server.go index e45e5bbff9a..316bd75e471 100644 --- a/pkg/storage/unified/resource/server.go +++ b/pkg/storage/unified/resource/server.go @@ -50,10 +50,27 @@ type ListIterator interface { // Used for fast(er) authz filtering Name() string + // Folder of the current item + // Used for fast(er) authz filtering + Folder() string + // Value for the current item Value() []byte } +type BackendReadResponse struct { + // Metadata + Key *ResourceKey + Folder string + + // The new resource version + ResourceVersion int64 + // The properties + Value []byte + // Error details + Error *ErrorResult +} + // The StorageBackend is an internal abstraction that supports interacting with // the underlying raw storage medium. This interface is never exposed directly, // it is provided by concrete instances that actually write values. @@ -64,7 +81,7 @@ type StorageBackend interface { WriteEvent(context.Context, WriteEvent) (int64, error) // Read a resource from storage optionally at an explicit version - ReadResource(context.Context, *ReadRequest) *ReadResponse + ReadResource(context.Context, *ReadRequest) *BackendReadResponse // When the ResourceServer executes a List request, this iterator will // query the backend for potential results. All results will be @@ -543,7 +560,11 @@ func (s *server) Read(ctx context.Context, req *ReadRequest) (*ReadResponse, err rsp := s.backend.ReadResource(ctx, req) // TODO, check folder permissions etc - return rsp, nil + return &ReadResponse{ + ResourceVersion: rsp.ResourceVersion, + Value: rsp.Value, + Error: rsp.Error, + }, nil } func (s *server) List(ctx context.Context, req *ListRequest) (*ListResponse, error) { diff --git a/pkg/storage/unified/sql/backend.go b/pkg/storage/unified/sql/backend.go index a4c13e5f508..e11bbdcefcc 100644 --- a/pkg/storage/unified/sql/backend.go +++ b/pkg/storage/unified/sql/backend.go @@ -168,12 +168,15 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, var newVersion int64 guid := uuid.New().String() err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { - // TODO: Set the Labels - + folder := "" + if event.Object != nil { + folder = event.Object.GetFolder() + } // 1. Insert into resource if _, err := dbutil.Exec(ctx, tx, sqlResourceInsert, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), WriteEvent: event, + Folder: folder, GUID: guid, }); err != nil { return fmt.Errorf("insert into resource: %w", err) @@ -183,6 +186,7 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64, if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), WriteEvent: event, + Folder: folder, GUID: guid, }); err != nil { return fmt.Errorf("insert into resource history: %w", err) @@ -225,12 +229,15 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, var newVersion int64 guid := uuid.New().String() err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { - // TODO: Set the Labels - + folder := "" + if event.Object != nil { + folder = event.Object.GetFolder() + } // 1. Update resource _, err := dbutil.Exec(ctx, tx, sqlResourceUpdate, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), WriteEvent: event, + Folder: folder, GUID: guid, }) if err != nil { @@ -241,6 +248,7 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64, if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), WriteEvent: event, + Folder: folder, GUID: guid, }); err != nil { return fmt.Errorf("insert into resource history: %w", err) @@ -285,8 +293,10 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, guid := uuid.New().String() err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { - // TODO: Set the Labels - + folder := "" + if event.Object != nil { + folder = event.Object.GetFolder() + } // 1. delete from resource _, err := dbutil.Exec(ctx, tx, sqlResourceDelete, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), @@ -301,6 +311,7 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{ SQLTemplate: sqltemplate.New(b.dialect), WriteEvent: event, + Folder: folder, GUID: guid, }); err != nil { return fmt.Errorf("insert into resource history: %w", err) @@ -330,16 +341,16 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64, return newVersion, err } -func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.ReadResponse { +func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.BackendReadResponse { _, span := b.tracer.Start(ctx, tracePrefix+".Read") defer span.End() // TODO: validate key ? readReq := &sqlResourceReadRequest{ - SQLTemplate: sqltemplate.New(b.dialect), - Request: req, - readResponse: new(readResponse), + SQLTemplate: sqltemplate.New(b.dialect), + Request: req, + Response: NewReadResponse(), } sr := sqlResourceRead @@ -348,21 +359,21 @@ func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) * sr = sqlResourceHistoryRead } - var res *readResponse + var res *resource.BackendReadResponse err := b.db.WithTx(ctx, ReadCommittedRO, func(ctx context.Context, tx db.Tx) error { var err error res, err = dbutil.QueryRow(ctx, tx, sr, readReq) return err }) if errors.Is(err, sql.ErrNoRows) { - return &resource.ReadResponse{ + return &resource.BackendReadResponse{ Error: resource.NewNotFoundError(req.Key), } } else if err != nil { - return &resource.ReadResponse{Error: resource.AsErrorResult(err)} + return &resource.BackendReadResponse{Error: resource.AsErrorResult(err)} } - return &res.ReadResponse + return res } func (b *backend) ListIterator(ctx context.Context, req *resource.ListRequest, cb func(resource.ListIterator) error) (int64, error) { @@ -396,6 +407,7 @@ type listIter struct { value []byte namespace string name string + folder string } // ContinueToken implements resource.ListIterator. @@ -403,21 +415,22 @@ func (l *listIter) ContinueToken() string { return ContinueToken{ResourceVersion: l.listRV, StartOffset: l.offset}.String() } -// Error implements resource.ListIterator. func (l *listIter) Error() error { return l.err } -// Name implements resource.ListIterator. func (l *listIter) Name() string { return l.name } -// Namespace implements resource.ListIterator. func (l *listIter) Namespace() string { return l.namespace } +func (l *listIter) Folder() string { + return l.folder +} + // ResourceVersion implements resource.ListIterator. func (l *listIter) ResourceVersion() int64 { return l.rv @@ -432,7 +445,7 @@ func (l *listIter) Value() []byte { func (l *listIter) Next() bool { if l.rows.Next() { l.offset++ - l.err = l.rows.Scan(&l.rv, &l.namespace, &l.name, &l.value) + l.err = l.rows.Scan(&l.rv, &l.namespace, &l.name, &l.folder, &l.value) return true } return false @@ -680,6 +693,7 @@ func (b *backend) poll(ctx context.Context, grp string, res string, since int64, Type: resource.WatchEvent_Type(rec.Action), PreviousRV: *prevRV, }, + Folder: rec.Folder, ResourceVersion: rec.ResourceVersion, // Timestamp: , // TODO: add timestamp } diff --git a/pkg/storage/unified/sql/backend_test.go b/pkg/storage/unified/sql/backend_test.go index 367c5b6941a..fc25cf6c5e1 100644 --- a/pkg/storage/unified/sql/backend_test.go +++ b/pkg/storage/unified/sql/backend_test.go @@ -8,7 +8,9 @@ import ( sqlmock "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/require" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/grafana/grafana/pkg/apimachinery/utils" "github.com/grafana/grafana/pkg/storage/unified/resource" "github.com/grafana/grafana/pkg/storage/unified/sql/db/dbimpl" "github.com/grafana/grafana/pkg/storage/unified/sql/test" @@ -281,9 +283,14 @@ func TestResourceVersionAtomicInc(t *testing.T) { func TestBackend_create(t *testing.T) { t.Parallel() + meta, err := utils.MetaAccessor(&unstructured.Unstructured{ + Object: map[string]any{}, + }) + require.NoError(t, err) event := resource.WriteEvent{ - Type: resource.WatchEvent_ADDED, - Key: resKey, + Type: resource.WatchEvent_ADDED, + Key: resKey, + Object: meta, } t.Run("happy path", func(t *testing.T) { @@ -386,9 +393,15 @@ func TestBackend_create(t *testing.T) { func TestBackend_update(t *testing.T) { t.Parallel() + meta, err := utils.MetaAccessor(&unstructured.Unstructured{ + Object: map[string]any{}, + }) + require.NoError(t, err) + meta.SetFolder("folderuid") event := resource.WriteEvent{ - Type: resource.WatchEvent_MODIFIED, - Key: resKey, + Type: resource.WatchEvent_MODIFIED, + Key: resKey, + Object: meta, } t.Run("happy path", func(t *testing.T) { @@ -491,9 +504,14 @@ func TestBackend_update(t *testing.T) { func TestBackend_delete(t *testing.T) { t.Parallel() + meta, err := utils.MetaAccessor(&unstructured.Unstructured{ + Object: map[string]any{}, + }) + require.NoError(t, err) event := resource.WriteEvent{ - Type: resource.WatchEvent_DELETED, - Key: resKey, + Type: resource.WatchEvent_DELETED, + Key: resKey, + Object: meta, } t.Run("happy path", func(t *testing.T) { diff --git a/pkg/storage/unified/sql/data/resource_history_insert.sql b/pkg/storage/unified/sql/data/resource_history_insert.sql index 2669ef82447..caaaa7a3c61 100644 --- a/pkg/storage/unified/sql/data/resource_history_insert.sql +++ b/pkg/storage/unified/sql/data/resource_history_insert.sql @@ -5,6 +5,7 @@ INSERT INTO {{ .Ident "resource_history" }} {{ .Ident "resource" }}, {{ .Ident "namespace" }}, {{ .Ident "name" }}, + {{ .Ident "folder" }}, {{ .Ident "previous_resource_version"}}, {{ .Ident "value" }}, @@ -17,6 +18,7 @@ INSERT INTO {{ .Ident "resource_history" }} {{ .Arg .WriteEvent.Key.Resource }}, {{ .Arg .WriteEvent.Key.Namespace }}, {{ .Arg .WriteEvent.Key.Name }}, + {{ .Arg .Folder }}, {{ .Arg .WriteEvent.PreviousRV }}, {{ .Arg .WriteEvent.Value }}, diff --git a/pkg/storage/unified/sql/data/resource_history_list.sql b/pkg/storage/unified/sql/data/resource_history_list.sql index 5e5e9b507a4..5d4f91df2ca 100644 --- a/pkg/storage/unified/sql/data/resource_history_list.sql +++ b/pkg/storage/unified/sql/data/resource_history_list.sql @@ -2,6 +2,7 @@ SELECT kv.{{ .Ident "resource_version" }}, kv.{{ .Ident "namespace" }}, kv.{{ .Ident "name" }}, + kv.{{ .Ident "folder" }}, kv.{{ .Ident "value" }} FROM {{ .Ident "resource_history" }} as kv INNER JOIN ( diff --git a/pkg/storage/unified/sql/data/resource_history_poll.sql b/pkg/storage/unified/sql/data/resource_history_poll.sql index 8e4a7374fdb..235690d9975 100644 --- a/pkg/storage/unified/sql/data/resource_history_poll.sql +++ b/pkg/storage/unified/sql/data/resource_history_poll.sql @@ -4,6 +4,7 @@ SELECT {{ .Ident "group" | .Into .Response.Key.Group }}, {{ .Ident "resource" | .Into .Response.Key.Resource }}, {{ .Ident "name" | .Into .Response.Key.Name }}, + {{ .Ident "folder" | .Into .Response.Folder }}, {{ .Ident "value" | .Into .Response.Value }}, {{ .Ident "action" | .Into .Response.Action }}, {{ .Ident "previous_resource_version" | .Into .Response.PreviousRV }} diff --git a/pkg/storage/unified/sql/data/resource_history_read.sql b/pkg/storage/unified/sql/data/resource_history_read.sql index e7e4e0561a5..3eb350e275d 100644 --- a/pkg/storage/unified/sql/data/resource_history_read.sql +++ b/pkg/storage/unified/sql/data/resource_history_read.sql @@ -1,6 +1,11 @@ SELECT - {{ .Ident "resource_version" | .Into .ResourceVersion }}, - {{ .Ident "value" | .Into .Value }} + {{ .Ident "namespace" | .Into .Response.Key.Namespace }}, + {{ .Ident "group" | .Into .Response.Key.Group }}, + {{ .Ident "resource" | .Into .Response.Key.Resource }}, + {{ .Ident "name" | .Into .Response.Key.Name }}, + {{ .Ident "folder" | .Into .Response.Folder }}, + {{ .Ident "resource_version" | .Into .Response.ResourceVersion }}, + {{ .Ident "value" | .Into .Response.Value }} FROM {{ .Ident "resource_history" }} diff --git a/pkg/storage/unified/sql/data/resource_insert.sql b/pkg/storage/unified/sql/data/resource_insert.sql index ccaca2f12f7..a3478ead4d2 100644 --- a/pkg/storage/unified/sql/data/resource_insert.sql +++ b/pkg/storage/unified/sql/data/resource_insert.sql @@ -6,6 +6,7 @@ INSERT INTO {{ .Ident "resource" }} {{ .Ident "resource" }}, {{ .Ident "namespace" }}, {{ .Ident "name" }}, + {{ .Ident "folder" }}, {{ .Ident "previous_resource_version" }}, {{ .Ident "value" }}, @@ -17,6 +18,7 @@ INSERT INTO {{ .Ident "resource" }} {{ .Arg .WriteEvent.Key.Resource }}, {{ .Arg .WriteEvent.Key.Namespace }}, {{ .Arg .WriteEvent.Key.Name }}, + {{ .Arg .Folder }}, {{ .Arg .WriteEvent.PreviousRV }}, {{ .Arg .WriteEvent.Value }}, diff --git a/pkg/storage/unified/sql/data/resource_list.sql b/pkg/storage/unified/sql/data/resource_list.sql index 07787335cfd..80fdcc41273 100644 --- a/pkg/storage/unified/sql/data/resource_list.sql +++ b/pkg/storage/unified/sql/data/resource_list.sql @@ -2,6 +2,7 @@ SELECT {{ .Ident "resource_version" }}, {{ .Ident "namespace" }}, {{ .Ident "name" }}, + {{ .Ident "folder" }}, {{ .Ident "value" }} FROM {{ .Ident "resource" }} WHERE 1 = 1 diff --git a/pkg/storage/unified/sql/data/resource_read.sql b/pkg/storage/unified/sql/data/resource_read.sql index 410bf5f1e74..d83f400b90b 100644 --- a/pkg/storage/unified/sql/data/resource_read.sql +++ b/pkg/storage/unified/sql/data/resource_read.sql @@ -1,6 +1,11 @@ SELECT - {{ .Ident "resource_version" | .Into .ResourceVersion }}, - {{ .Ident "value" | .Into .Value }} + {{ .Ident "namespace" | .Into .Response.Key.Namespace }}, + {{ .Ident "group" | .Into .Response.Key.Group }}, + {{ .Ident "resource" | .Into .Response.Key.Resource }}, + {{ .Ident "name" | .Into .Response.Key.Name }}, + {{ .Ident "folder" | .Into .Response.Folder }}, + {{ .Ident "resource_version" | .Into .Response.ResourceVersion }}, + {{ .Ident "value" | .Into .Response.Value }} FROM {{ .Ident "resource" }} WHERE 1 = 1 AND {{ .Ident "namespace" }} = {{ .Arg .Request.Key.Namespace }} diff --git a/pkg/storage/unified/sql/data/resource_update.sql b/pkg/storage/unified/sql/data/resource_update.sql index 47ab9fabd5e..653fd820ccd 100644 --- a/pkg/storage/unified/sql/data/resource_update.sql +++ b/pkg/storage/unified/sql/data/resource_update.sql @@ -2,6 +2,7 @@ UPDATE {{ .Ident "resource" }} SET {{ .Ident "guid" }} = {{ .Arg .GUID }}, {{ .Ident "value" }} = {{ .Arg .WriteEvent.Value }}, + {{ .Ident "folder" }} = {{ .Arg .Folder }}, {{ .Ident "action" }} = {{ .Arg .WriteEvent.Type }} WHERE 1 = 1 AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }} diff --git a/pkg/storage/unified/sql/db/migrations/resource_mig.go b/pkg/storage/unified/sql/db/migrations/resource_mig.go index 92466dd50c0..b31f617658e 100644 --- a/pkg/storage/unified/sql/db/migrations/resource_mig.go +++ b/pkg/storage/unified/sql/db/migrations/resource_mig.go @@ -113,5 +113,13 @@ func initResourceTables(mg *migrator.Migrator) string { Cols: []string{"group", "resource"}, Type: migrator.IndexType, })) + mg.AddMigration("Add column folder in resource_history", migrator.NewAddColumnMigration(resource_history_table, &migrator.Column{ + Name: "folder", Type: migrator.DB_NVarchar, Length: 253, Nullable: false, Default: "", + })) + + mg.AddMigration("Add column folder in resource", migrator.NewAddColumnMigration(resource_table, &migrator.Column{ + Name: "folder", Type: migrator.DB_NVarchar, Length: 253, Nullable: false, Default: "", + })) + return marker } diff --git a/pkg/storage/unified/sql/queries.go b/pkg/storage/unified/sql/queries.go index 5c4c1d91e89..78afce6439d 100644 --- a/pkg/storage/unified/sql/queries.go +++ b/pkg/storage/unified/sql/queries.go @@ -64,6 +64,7 @@ type sqlResourceRequest struct { sqltemplate.SQLTemplate GUID string WriteEvent resource.WriteEvent + Folder string } func (r sqlResourceRequest) Validate() error { @@ -76,6 +77,7 @@ type historyPollResponse struct { PreviousRV *int64 Value []byte Action int + Folder string } func (r *historyPollResponse) Results() (*historyPollResponse, error) { @@ -108,6 +110,7 @@ func (r *sqlResourceHistoryPollRequest) Results() (*historyPollResponse, error) Resource: r.Response.Key.Resource, Name: r.Response.Key.Name, }, + Folder: r.Response.Folder, ResourceVersion: r.Response.ResourceVersion, PreviousRV: prevRV, Value: r.Response.Value, @@ -116,33 +119,24 @@ func (r *sqlResourceHistoryPollRequest) Results() (*historyPollResponse, error) } // sqlResourceReadRequest can be used to retrieve a row fromthe "resource" tables. - -type readResponse struct { - resource.ReadResponse -} - -func (r *readResponse) Results() (*readResponse, error) { - return r, nil +func NewReadResponse() *resource.BackendReadResponse { + return &resource.BackendReadResponse{ + Key: &resource.ResourceKey{}, + } } type sqlResourceReadRequest struct { sqltemplate.SQLTemplate - Request *resource.ReadRequest - *readResponse + Request *resource.ReadRequest + Response *resource.BackendReadResponse } func (r *sqlResourceReadRequest) Validate() error { return nil // TODO } -func (r *sqlResourceReadRequest) Results() (*readResponse, error) { - return &readResponse{ - ReadResponse: resource.ReadResponse{ - Error: r.ReadResponse.Error, - ResourceVersion: r.ReadResponse.ResourceVersion, - Value: r.ReadResponse.Value, - }, - }, nil +func (r *sqlResourceReadRequest) Results() (*resource.BackendReadResponse, error) { + return r.Response, nil } // List @@ -157,6 +151,7 @@ func (r sqlResourceListRequest) Validate() error { type historyListRequest struct { ResourceVersion, Limit, Offset int64 + Folder string Options *resource.ListOptions } type sqlResourceHistoryListRequest struct { diff --git a/pkg/storage/unified/sql/queries_test.go b/pkg/storage/unified/sql/queries_test.go index 5e2557af8c4..788abe95dad 100644 --- a/pkg/storage/unified/sql/queries_test.go +++ b/pkg/storage/unified/sql/queries_test.go @@ -43,6 +43,7 @@ func TestUnifiedStorageQueries(t *testing.T) { Type: resource.WatchEvent_ADDED, PreviousRV: 123, }, + Folder: "fldr", }, }, }, @@ -59,6 +60,7 @@ func TestUnifiedStorageQueries(t *testing.T) { Name: "name", }, }, + Folder: "fldr", }, }, }, @@ -75,7 +77,7 @@ func TestUnifiedStorageQueries(t *testing.T) { Name: "name", }, }, - readResponse: new(readResponse), + Response: NewReadResponse(), }, }, }, @@ -143,9 +145,14 @@ func TestUnifiedStorageQueries(t *testing.T) { SQLTemplate: mocks.NewTestingSQLTemplate(), Request: &resource.ReadRequest{ ResourceVersion: 123, - Key: &resource.ResourceKey{}, + Key: &resource.ResourceKey{ + Namespace: "ns", + Group: "gp", + Resource: "rs", + Name: "nm", + }, }, - readResponse: new(readResponse), + Response: NewReadResponse(), }, }, }, @@ -173,6 +180,7 @@ func TestUnifiedStorageQueries(t *testing.T) { }, PreviousRV: 1234, }, + Folder: "fldr", }, }, }, diff --git a/pkg/storage/unified/sql/test/integration_test.go b/pkg/storage/unified/sql/test/integration_test.go index 743ce01c0ca..d36a9a93c7f 100644 --- a/pkg/storage/unified/sql/test/integration_test.go +++ b/pkg/storage/unified/sql/test/integration_test.go @@ -9,11 +9,13 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/grafana/authlib/claims" "github.com/grafana/dskit/services" "github.com/grafana/grafana/pkg/apimachinery/identity" + "github.com/grafana/grafana/pkg/apimachinery/utils" infraDB "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/featuremgmt" @@ -63,9 +65,9 @@ func newServer(t *testing.T, cfg *setting.Cfg) (sql.Backend, resource.ResourceSe } func TestIntegrationBackendHappyPath(t *testing.T) { - if infraDB.IsTestDbSQLite() { - t.Skip("TODO: test blocking, skipping to unblock Enterprise until we fix this") - } + // if infraDB.IsTestDbSQLite() { + // t.Skip("TODO: test blocking, skipping to unblock Enterprise until we fix this") + // } if testing.Short() { t.Skip("skipping integration test") } @@ -116,6 +118,7 @@ func TestIntegrationBackendHappyPath(t *testing.T) { require.Nil(t, resp.Error) require.Equal(t, rv4, resp.ResourceVersion) require.Equal(t, "item2 MODIFIED", string(resp.Value)) + require.Equal(t, "folderuid", resp.Folder) }) t.Run("Read early version of item2", func(t *testing.T) { @@ -151,10 +154,13 @@ func TestIntegrationBackendHappyPath(t *testing.T) { require.Equal(t, "item1", event.Key.Name) require.Equal(t, rv1, event.ResourceVersion) require.Equal(t, resource.WatchEvent_ADDED, event.Type) + require.Equal(t, "folderuid", event.Folder) + event = <-stream require.Equal(t, "item2", event.Key.Name) require.Equal(t, rv2, event.ResourceVersion) require.Equal(t, resource.WatchEvent_ADDED, event.Type) + require.Equal(t, "folderuid", event.Folder) event = <-stream require.Equal(t, "item3", event.Key.Name) @@ -418,6 +424,14 @@ func TestClientServer(t *testing.T) { } func writeEvent(ctx context.Context, store sql.Backend, name string, action resource.WatchEvent_Type) (int64, error) { + res := &unstructured.Unstructured{ + Object: map[string]any{}, + } + meta, err := utils.MetaAccessor(res) + if err != nil { + return 0, err + } + meta.SetFolder("folderuid") return store.WriteEvent(ctx, resource.WriteEvent{ Type: action, Value: []byte(name + " " + resource.WatchEvent_Type_name[int32(action)]), @@ -427,6 +441,7 @@ func writeEvent(ctx context.Context, store sql.Backend, name string, action reso Resource: "resource", Name: name, }, + Object: meta, }) } diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_history_insert-insert into resource_history.sql b/pkg/storage/unified/sql/testdata/mysql--resource_history_insert-insert into resource_history.sql index 27f85926301..4f3d859d886 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_history_insert-insert into resource_history.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_history_insert-insert into resource_history.sql @@ -5,6 +5,7 @@ INSERT INTO `resource_history` `resource`, `namespace`, `name`, + `folder`, `previous_resource_version`, `value`, `action` @@ -15,6 +16,7 @@ INSERT INTO `resource_history` 'rr', 'nn', 'name', + 'fldr', 1234, '[]', 'UNKNOWN' diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_history_list-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_history_list-single path.sql index 1061626026f..f57ad91ff02 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_history_list-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_history_list-single path.sql @@ -2,6 +2,7 @@ SELECT kv.`resource_version`, kv.`namespace`, kv.`name`, + kv.`folder`, kv.`value` FROM `resource_history` as kv INNER JOIN ( diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_history_poll-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_history_poll-single path.sql index a29cf35d4da..12e16ee980a 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_history_poll-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_history_poll-single path.sql @@ -4,6 +4,7 @@ SELECT `group`, `resource`, `name`, + `folder`, `value`, `action`, `previous_resource_version` diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_history_read-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_history_read-single path.sql index fa8b3ae3da6..2fef4f54bd8 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_history_read-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_history_read-single path.sql @@ -1,12 +1,17 @@ SELECT + `namespace`, + `group`, + `resource`, + `name`, + `folder`, `resource_version`, `value` FROM `resource_history` WHERE 1 = 1 - AND `namespace` = '' - AND `group` = '' - AND `resource` = '' - AND `name` = '' + AND `namespace` = 'ns' + AND `group` = 'gp' + AND `resource` = 'rs' + AND `name` = 'nm' AND `resource_version` <= 123 ORDER BY `resource_version` DESC LIMIT 1 diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_insert-simple.sql b/pkg/storage/unified/sql/testdata/mysql--resource_insert-simple.sql index 5bf3424e55b..e388def9f61 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_insert-simple.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_insert-simple.sql @@ -5,6 +5,7 @@ INSERT INTO `resource` `resource`, `namespace`, `name`, + `folder`, `previous_resource_version`, `value`, `action` @@ -15,6 +16,7 @@ INSERT INTO `resource` 'rr', 'nn', 'name', + 'fldr', 123, '[]', 'ADDED' diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_list-filter_on_namespace.sql b/pkg/storage/unified/sql/testdata/mysql--resource_list-filter_on_namespace.sql index 85ed7223d79..a289cf2a2ec 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_list-filter_on_namespace.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_list-filter_on_namespace.sql @@ -2,6 +2,7 @@ SELECT `resource_version`, `namespace`, `name`, + `folder`, `value` FROM `resource` WHERE 1 = 1 diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_read-without_resource_version.sql b/pkg/storage/unified/sql/testdata/mysql--resource_read-without_resource_version.sql index 10a19336dcd..6d7b2f412b5 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_read-without_resource_version.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_read-without_resource_version.sql @@ -1,4 +1,9 @@ SELECT + `namespace`, + `group`, + `resource`, + `name`, + `folder`, `resource_version`, `value` FROM `resource` diff --git a/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql b/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql index 34582a97d87..ed94a0d7e1d 100755 --- a/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql +++ b/pkg/storage/unified/sql/testdata/mysql--resource_update-single path.sql @@ -2,6 +2,7 @@ UPDATE `resource` SET `guid` = '', `value` = '[]', + `folder` = 'fldr', `action` = 'UNKNOWN' WHERE 1 = 1 AND `group` = 'gg' diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_history_insert-insert into resource_history.sql b/pkg/storage/unified/sql/testdata/postgres--resource_history_insert-insert into resource_history.sql index c7db6c75739..6014421cd7f 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_history_insert-insert into resource_history.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_history_insert-insert into resource_history.sql @@ -5,6 +5,7 @@ INSERT INTO "resource_history" "resource", "namespace", "name", + "folder", "previous_resource_version", "value", "action" @@ -15,6 +16,7 @@ INSERT INTO "resource_history" 'rr', 'nn', 'name', + 'fldr', 1234, '[]', 'UNKNOWN' diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_history_list-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_history_list-single path.sql index 3f6d4e7206f..e576a9b778c 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_history_list-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_history_list-single path.sql @@ -2,6 +2,7 @@ SELECT kv."resource_version", kv."namespace", kv."name", + kv."folder", kv."value" FROM "resource_history" as kv INNER JOIN ( diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_history_poll-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_history_poll-single path.sql index d038317381a..90b5830eee1 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_history_poll-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_history_poll-single path.sql @@ -4,6 +4,7 @@ SELECT "group", "resource", "name", + "folder", "value", "action", "previous_resource_version" diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_history_read-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_history_read-single path.sql index 35127f6b176..a37f00ac13b 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_history_read-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_history_read-single path.sql @@ -1,12 +1,17 @@ SELECT + "namespace", + "group", + "resource", + "name", + "folder", "resource_version", "value" FROM "resource_history" WHERE 1 = 1 - AND "namespace" = '' - AND "group" = '' - AND "resource" = '' - AND "name" = '' + AND "namespace" = 'ns' + AND "group" = 'gp' + AND "resource" = 'rs' + AND "name" = 'nm' AND "resource_version" <= 123 ORDER BY "resource_version" DESC LIMIT 1 diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_insert-simple.sql b/pkg/storage/unified/sql/testdata/postgres--resource_insert-simple.sql index fc2d22be1c4..2a521cf223e 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_insert-simple.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_insert-simple.sql @@ -5,6 +5,7 @@ INSERT INTO "resource" "resource", "namespace", "name", + "folder", "previous_resource_version", "value", "action" @@ -15,6 +16,7 @@ INSERT INTO "resource" 'rr', 'nn', 'name', + 'fldr', 123, '[]', 'ADDED' diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_list-filter_on_namespace.sql b/pkg/storage/unified/sql/testdata/postgres--resource_list-filter_on_namespace.sql index 8a1356f62f8..3a32ec49aa7 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_list-filter_on_namespace.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_list-filter_on_namespace.sql @@ -2,6 +2,7 @@ SELECT "resource_version", "namespace", "name", + "folder", "value" FROM "resource" WHERE 1 = 1 diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_read-without_resource_version.sql b/pkg/storage/unified/sql/testdata/postgres--resource_read-without_resource_version.sql index 5b8879b6c6a..f103015dac9 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_read-without_resource_version.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_read-without_resource_version.sql @@ -1,4 +1,9 @@ SELECT + "namespace", + "group", + "resource", + "name", + "folder", "resource_version", "value" FROM "resource" diff --git a/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql b/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql index 4febc55d530..6d76b8f568e 100755 --- a/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql +++ b/pkg/storage/unified/sql/testdata/postgres--resource_update-single path.sql @@ -2,6 +2,7 @@ UPDATE "resource" SET "guid" = '', "value" = '[]', + "folder" = 'fldr', "action" = 'UNKNOWN' WHERE 1 = 1 AND "group" = 'gg' diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_history_insert-insert into resource_history.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_history_insert-insert into resource_history.sql index c7db6c75739..6014421cd7f 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_history_insert-insert into resource_history.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_history_insert-insert into resource_history.sql @@ -5,6 +5,7 @@ INSERT INTO "resource_history" "resource", "namespace", "name", + "folder", "previous_resource_version", "value", "action" @@ -15,6 +16,7 @@ INSERT INTO "resource_history" 'rr', 'nn', 'name', + 'fldr', 1234, '[]', 'UNKNOWN' diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_history_list-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_history_list-single path.sql index 3f6d4e7206f..e576a9b778c 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_history_list-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_history_list-single path.sql @@ -2,6 +2,7 @@ SELECT kv."resource_version", kv."namespace", kv."name", + kv."folder", kv."value" FROM "resource_history" as kv INNER JOIN ( diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_history_poll-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_history_poll-single path.sql index d038317381a..90b5830eee1 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_history_poll-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_history_poll-single path.sql @@ -4,6 +4,7 @@ SELECT "group", "resource", "name", + "folder", "value", "action", "previous_resource_version" diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_history_read-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_history_read-single path.sql index 35127f6b176..a37f00ac13b 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_history_read-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_history_read-single path.sql @@ -1,12 +1,17 @@ SELECT + "namespace", + "group", + "resource", + "name", + "folder", "resource_version", "value" FROM "resource_history" WHERE 1 = 1 - AND "namespace" = '' - AND "group" = '' - AND "resource" = '' - AND "name" = '' + AND "namespace" = 'ns' + AND "group" = 'gp' + AND "resource" = 'rs' + AND "name" = 'nm' AND "resource_version" <= 123 ORDER BY "resource_version" DESC LIMIT 1 diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_insert-simple.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_insert-simple.sql index fc2d22be1c4..2a521cf223e 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_insert-simple.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_insert-simple.sql @@ -5,6 +5,7 @@ INSERT INTO "resource" "resource", "namespace", "name", + "folder", "previous_resource_version", "value", "action" @@ -15,6 +16,7 @@ INSERT INTO "resource" 'rr', 'nn', 'name', + 'fldr', 123, '[]', 'ADDED' diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_list-filter_on_namespace.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_list-filter_on_namespace.sql index 8a1356f62f8..3a32ec49aa7 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_list-filter_on_namespace.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_list-filter_on_namespace.sql @@ -2,6 +2,7 @@ SELECT "resource_version", "namespace", "name", + "folder", "value" FROM "resource" WHERE 1 = 1 diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_read-without_resource_version.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_read-without_resource_version.sql index 5b8879b6c6a..f103015dac9 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_read-without_resource_version.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_read-without_resource_version.sql @@ -1,4 +1,9 @@ SELECT + "namespace", + "group", + "resource", + "name", + "folder", "resource_version", "value" FROM "resource" diff --git a/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql b/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql index 4febc55d530..6d76b8f568e 100755 --- a/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql +++ b/pkg/storage/unified/sql/testdata/sqlite--resource_update-single path.sql @@ -2,6 +2,7 @@ UPDATE "resource" SET "guid" = '', "value" = '[]', + "folder" = 'fldr', "action" = 'UNKNOWN' WHERE 1 = 1 AND "group" = 'gg'