Revert "UniStore: Add folder to the SQL backend" (#95966)

Revert "UniStore: Add folder to the SQL backend (#95671)"

This reverts commit f075662696.
This commit is contained in:
Leonor Oliveira 2024-11-06 16:04:57 +01:00 committed by GitHub
parent 26b0e8f105
commit aaa4f4a23e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
43 changed files with 72 additions and 235 deletions

View File

@ -196,10 +196,6 @@ func (r *rowsWrapper) ResourceVersion() int64 {
return r.row.RV return r.row.RV
} }
func (r *rowsWrapper) Folder() string {
return r.row.FolderUID
}
// Value implements resource.ListIterator. // Value implements resource.ListIterator.
func (r *rowsWrapper) Value() []byte { func (r *rowsWrapper) Value() []byte {
b, err := json.Marshal(r.row.Dash) b, err := json.Marshal(r.row.Dash)

View File

@ -128,8 +128,8 @@ func (a *dashboardSqlAccess) GetDashboard(ctx context.Context, orgId int64, uid
} }
// Read implements ResourceStoreServer. // Read implements ResourceStoreServer.
func (a *dashboardSqlAccess) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.BackendReadResponse { func (a *dashboardSqlAccess) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.ReadResponse {
rsp := &resource.BackendReadResponse{} rsp := &resource.ReadResponse{}
info, err := claims.ParseNamespace(req.Key.Namespace) info, err := claims.ParseNamespace(req.Key.Namespace)
if err == nil { if err == nil {
err = isDashboardKey(req.Key, true) err = isDashboardKey(req.Key, true)
@ -242,7 +242,7 @@ func (a *dashboardSqlAccess) WatchWriteEvents(ctx context.Context) (<-chan *reso
} }
// Simple wrapper for index implementation // Simple wrapper for index implementation
func (a *dashboardSqlAccess) Read(ctx context.Context, req *resource.ReadRequest) (*resource.BackendReadResponse, error) { func (a *dashboardSqlAccess) Read(ctx context.Context, req *resource.ReadRequest) (*resource.ReadResponse, error) {
return a.ReadResource(ctx, req), nil return a.ReadResource(ctx, req), nil
} }

View File

@ -134,7 +134,7 @@ func (s *cdkBackend) WriteEvent(ctx context.Context, event WriteEvent) (rv int64
return rv, err return rv, err
} }
func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *BackendReadResponse { func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *ReadResponse {
rv := req.ResourceVersion rv := req.ResourceVersion
path := s.getPath(req.Key, rv) path := s.getPath(req.Key, rv)
@ -162,7 +162,7 @@ func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *Backen
raw, err := s.bucket.ReadAll(ctx, path) raw, err := s.bucket.ReadAll(ctx, path)
if raw == nil && req.ResourceVersion > 0 { if raw == nil && req.ResourceVersion > 0 {
if req.ResourceVersion > s.rv.Load() { if req.ResourceVersion > s.rv.Load() {
return &BackendReadResponse{ return &ReadResponse{
Error: &ErrorResult{ Error: &ErrorResult{
Code: http.StatusGatewayTimeout, Code: http.StatusGatewayTimeout,
Reason: string(metav1.StatusReasonTimeout), // match etcd behavior Reason: string(metav1.StatusReasonTimeout), // match etcd behavior
@ -191,11 +191,9 @@ func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *Backen
raw = nil raw = nil
} }
if raw == nil { if raw == nil {
return &BackendReadResponse{Error: NewNotFoundError(req.Key)} return &ReadResponse{Error: NewNotFoundError(req.Key)}
} }
return &BackendReadResponse{ return &ReadResponse{
Key: req.Key,
Folder: "", // TODO: implement this
ResourceVersion: rv, ResourceVersion: rv,
Value: raw, Value: raw,
} }
@ -320,10 +318,6 @@ func (c *cdkListIterator) Namespace() string {
return c.currentKey // TODO (parse namespace from key) return c.currentKey // TODO (parse namespace from key)
} }
func (c *cdkListIterator) Folder() string {
return "" // TODO: implement this
}
var _ ListIterator = (*cdkListIterator)(nil) var _ ListIterator = (*cdkListIterator)(nil)
func buildTree(ctx context.Context, s *cdkBackend, key *ResourceKey) (*cdkListIterator, error) { func buildTree(ctx context.Context, s *cdkBackend, key *ResourceKey) (*cdkListIterator, error) {

View File

@ -24,8 +24,6 @@ type WriteEvent struct {
// WriteEvents after they include a resource version // WriteEvents after they include a resource version
type WrittenEvent struct { type WrittenEvent struct {
WriteEvent WriteEvent
// Metadata
Folder string
// The resource version // The resource version
ResourceVersion int64 ResourceVersion int64

View File

@ -49,27 +49,10 @@ type ListIterator interface {
// Used for fast(er) authz filtering // Used for fast(er) authz filtering
Name() string Name() string
// Folder of the current item
// Used for fast(er) authz filtering
Folder() string
// Value for the current item // Value for the current item
Value() []byte 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 StorageBackend is an internal abstraction that supports interacting with
// the underlying raw storage medium. This interface is never exposed directly, // the underlying raw storage medium. This interface is never exposed directly,
// it is provided by concrete instances that actually write values. // it is provided by concrete instances that actually write values.
@ -80,7 +63,7 @@ type StorageBackend interface {
WriteEvent(context.Context, WriteEvent) (int64, error) WriteEvent(context.Context, WriteEvent) (int64, error)
// Read a resource from storage optionally at an explicit version // Read a resource from storage optionally at an explicit version
ReadResource(context.Context, *ReadRequest) *BackendReadResponse ReadResource(context.Context, *ReadRequest) *ReadResponse
// When the ResourceServer executes a List request, this iterator will // When the ResourceServer executes a List request, this iterator will
// query the backend for potential results. All results will be // query the backend for potential results. All results will be
@ -555,11 +538,7 @@ func (s *server) Read(ctx context.Context, req *ReadRequest) (*ReadResponse, err
rsp := s.backend.ReadResource(ctx, req) rsp := s.backend.ReadResource(ctx, req)
// TODO, check folder permissions etc // TODO, check folder permissions etc
return &ReadResponse{ return rsp, nil
ResourceVersion: rsp.ResourceVersion,
Value: rsp.Value,
Error: rsp.Error,
}, nil
} }
func (s *server) List(ctx context.Context, req *ListRequest) (*ListResponse, error) { func (s *server) List(ctx context.Context, req *ListRequest) (*ListResponse, error) {

View File

@ -143,15 +143,12 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64,
var newVersion int64 var newVersion int64
guid := uuid.New().String() guid := uuid.New().String()
err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error {
folder := "" // TODO: Set the Labels
if event.Object != nil {
folder = event.Object.GetFolder()
}
// 1. Insert into resource // 1. Insert into resource
if _, err := dbutil.Exec(ctx, tx, sqlResourceInsert, sqlResourceRequest{ if _, err := dbutil.Exec(ctx, tx, sqlResourceInsert, sqlResourceRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
WriteEvent: event, WriteEvent: event,
Folder: folder,
GUID: guid, GUID: guid,
}); err != nil { }); err != nil {
return fmt.Errorf("insert into resource: %w", err) return fmt.Errorf("insert into resource: %w", err)
@ -161,7 +158,6 @@ func (b *backend) create(ctx context.Context, event resource.WriteEvent) (int64,
if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{ if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
WriteEvent: event, WriteEvent: event,
Folder: folder,
GUID: guid, GUID: guid,
}); err != nil { }); err != nil {
return fmt.Errorf("insert into resource history: %w", err) return fmt.Errorf("insert into resource history: %w", err)
@ -204,15 +200,12 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64,
var newVersion int64 var newVersion int64
guid := uuid.New().String() guid := uuid.New().String()
err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error {
folder := "" // TODO: Set the Labels
if event.Object != nil {
folder = event.Object.GetFolder()
}
// 1. Update resource // 1. Update resource
_, err := dbutil.Exec(ctx, tx, sqlResourceUpdate, sqlResourceRequest{ _, err := dbutil.Exec(ctx, tx, sqlResourceUpdate, sqlResourceRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
WriteEvent: event, WriteEvent: event,
Folder: folder,
GUID: guid, GUID: guid,
}) })
if err != nil { if err != nil {
@ -223,7 +216,6 @@ func (b *backend) update(ctx context.Context, event resource.WriteEvent) (int64,
if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{ if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
WriteEvent: event, WriteEvent: event,
Folder: folder,
GUID: guid, GUID: guid,
}); err != nil { }); err != nil {
return fmt.Errorf("insert into resource history: %w", err) return fmt.Errorf("insert into resource history: %w", err)
@ -268,10 +260,8 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64,
guid := uuid.New().String() guid := uuid.New().String()
err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error {
folder := "" // TODO: Set the Labels
if event.Object != nil {
folder = event.Object.GetFolder()
}
// 1. delete from resource // 1. delete from resource
_, err := dbutil.Exec(ctx, tx, sqlResourceDelete, sqlResourceRequest{ _, err := dbutil.Exec(ctx, tx, sqlResourceDelete, sqlResourceRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
@ -286,7 +276,6 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64,
if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{ if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
WriteEvent: event, WriteEvent: event,
Folder: folder,
GUID: guid, GUID: guid,
}); err != nil { }); err != nil {
return fmt.Errorf("insert into resource history: %w", err) return fmt.Errorf("insert into resource history: %w", err)
@ -316,7 +305,7 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64,
return newVersion, err return newVersion, err
} }
func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.BackendReadResponse { func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.ReadResponse {
_, span := b.tracer.Start(ctx, tracePrefix+".Read") _, span := b.tracer.Start(ctx, tracePrefix+".Read")
defer span.End() defer span.End()
@ -325,7 +314,7 @@ func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *
readReq := &sqlResourceReadRequest{ readReq := &sqlResourceReadRequest{
SQLTemplate: sqltemplate.New(b.dialect), SQLTemplate: sqltemplate.New(b.dialect),
Request: req, Request: req,
Response: NewReadResponse(), readResponse: new(readResponse),
} }
sr := sqlResourceRead sr := sqlResourceRead
@ -334,21 +323,21 @@ func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *
sr = sqlResourceHistoryRead sr = sqlResourceHistoryRead
} }
var res *resource.BackendReadResponse var res *readResponse
err := b.db.WithTx(ctx, ReadCommittedRO, func(ctx context.Context, tx db.Tx) error { err := b.db.WithTx(ctx, ReadCommittedRO, func(ctx context.Context, tx db.Tx) error {
var err error var err error
res, err = dbutil.QueryRow(ctx, tx, sr, readReq) res, err = dbutil.QueryRow(ctx, tx, sr, readReq)
return err return err
}) })
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return &resource.BackendReadResponse{ return &resource.ReadResponse{
Error: resource.NewNotFoundError(req.Key), Error: resource.NewNotFoundError(req.Key),
} }
} else if err != nil { } else if err != nil {
return &resource.BackendReadResponse{Error: resource.AsErrorResult(err)} return &resource.ReadResponse{Error: resource.AsErrorResult(err)}
} }
return res return &res.ReadResponse
} }
func (b *backend) ListIterator(ctx context.Context, req *resource.ListRequest, cb func(resource.ListIterator) error) (int64, error) { func (b *backend) ListIterator(ctx context.Context, req *resource.ListRequest, cb func(resource.ListIterator) error) (int64, error) {
@ -382,7 +371,6 @@ type listIter struct {
value []byte value []byte
namespace string namespace string
name string name string
folder string
} }
// ContinueToken implements resource.ListIterator. // ContinueToken implements resource.ListIterator.
@ -390,22 +378,21 @@ func (l *listIter) ContinueToken() string {
return ContinueToken{ResourceVersion: l.listRV, StartOffset: l.offset}.String() return ContinueToken{ResourceVersion: l.listRV, StartOffset: l.offset}.String()
} }
// Error implements resource.ListIterator.
func (l *listIter) Error() error { func (l *listIter) Error() error {
return l.err return l.err
} }
// Name implements resource.ListIterator.
func (l *listIter) Name() string { func (l *listIter) Name() string {
return l.name return l.name
} }
// Namespace implements resource.ListIterator.
func (l *listIter) Namespace() string { func (l *listIter) Namespace() string {
return l.namespace return l.namespace
} }
func (l *listIter) Folder() string {
return l.folder
}
// ResourceVersion implements resource.ListIterator. // ResourceVersion implements resource.ListIterator.
func (l *listIter) ResourceVersion() int64 { func (l *listIter) ResourceVersion() int64 {
return l.rv return l.rv
@ -420,7 +407,7 @@ func (l *listIter) Value() []byte {
func (l *listIter) Next() bool { func (l *listIter) Next() bool {
if l.rows.Next() { if l.rows.Next() {
l.offset++ l.offset++
l.err = l.rows.Scan(&l.rv, &l.namespace, &l.name, &l.folder, &l.value) l.err = l.rows.Scan(&l.rv, &l.namespace, &l.name, &l.value)
return true return true
} }
return false return false
@ -668,7 +655,6 @@ func (b *backend) poll(ctx context.Context, grp string, res string, since int64,
Type: resource.WatchEvent_Type(rec.Action), Type: resource.WatchEvent_Type(rec.Action),
PreviousRV: *prevRV, PreviousRV: *prevRV,
}, },
Folder: rec.Folder,
ResourceVersion: rec.ResourceVersion, ResourceVersion: rec.ResourceVersion,
// Timestamp: , // TODO: add timestamp // Timestamp: , // TODO: add timestamp
} }

View File

@ -8,9 +8,7 @@ import (
sqlmock "github.com/DATA-DOG/go-sqlmock" sqlmock "github.com/DATA-DOG/go-sqlmock"
"github.com/stretchr/testify/require" "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/resource"
"github.com/grafana/grafana/pkg/storage/unified/sql/db/dbimpl" "github.com/grafana/grafana/pkg/storage/unified/sql/db/dbimpl"
"github.com/grafana/grafana/pkg/storage/unified/sql/test" "github.com/grafana/grafana/pkg/storage/unified/sql/test"
@ -283,14 +281,9 @@ func TestResourceVersionAtomicInc(t *testing.T) {
func TestBackend_create(t *testing.T) { func TestBackend_create(t *testing.T) {
t.Parallel() t.Parallel()
meta, err := utils.MetaAccessor(&unstructured.Unstructured{
Object: map[string]any{},
})
require.NoError(t, err)
event := resource.WriteEvent{ event := resource.WriteEvent{
Type: resource.WatchEvent_ADDED, Type: resource.WatchEvent_ADDED,
Key: resKey, Key: resKey,
Object: meta,
} }
t.Run("happy path", func(t *testing.T) { t.Run("happy path", func(t *testing.T) {
@ -393,15 +386,9 @@ func TestBackend_create(t *testing.T) {
func TestBackend_update(t *testing.T) { func TestBackend_update(t *testing.T) {
t.Parallel() t.Parallel()
meta, err := utils.MetaAccessor(&unstructured.Unstructured{
Object: map[string]any{},
})
require.NoError(t, err)
meta.SetFolder("folderuid")
event := resource.WriteEvent{ event := resource.WriteEvent{
Type: resource.WatchEvent_MODIFIED, Type: resource.WatchEvent_MODIFIED,
Key: resKey, Key: resKey,
Object: meta,
} }
t.Run("happy path", func(t *testing.T) { t.Run("happy path", func(t *testing.T) {
@ -504,14 +491,9 @@ func TestBackend_update(t *testing.T) {
func TestBackend_delete(t *testing.T) { func TestBackend_delete(t *testing.T) {
t.Parallel() t.Parallel()
meta, err := utils.MetaAccessor(&unstructured.Unstructured{
Object: map[string]any{},
})
require.NoError(t, err)
event := resource.WriteEvent{ event := resource.WriteEvent{
Type: resource.WatchEvent_DELETED, Type: resource.WatchEvent_DELETED,
Key: resKey, Key: resKey,
Object: meta,
} }
t.Run("happy path", func(t *testing.T) { t.Run("happy path", func(t *testing.T) {

View File

@ -5,7 +5,6 @@ INSERT INTO {{ .Ident "resource_history" }}
{{ .Ident "resource" }}, {{ .Ident "resource" }},
{{ .Ident "namespace" }}, {{ .Ident "namespace" }},
{{ .Ident "name" }}, {{ .Ident "name" }},
{{ .Ident "folder" }},
{{ .Ident "previous_resource_version"}}, {{ .Ident "previous_resource_version"}},
{{ .Ident "value" }}, {{ .Ident "value" }},
@ -18,7 +17,6 @@ INSERT INTO {{ .Ident "resource_history" }}
{{ .Arg .WriteEvent.Key.Resource }}, {{ .Arg .WriteEvent.Key.Resource }},
{{ .Arg .WriteEvent.Key.Namespace }}, {{ .Arg .WriteEvent.Key.Namespace }},
{{ .Arg .WriteEvent.Key.Name }}, {{ .Arg .WriteEvent.Key.Name }},
{{ .Arg .Folder }},
{{ .Arg .WriteEvent.PreviousRV }}, {{ .Arg .WriteEvent.PreviousRV }},
{{ .Arg .WriteEvent.Value }}, {{ .Arg .WriteEvent.Value }},

View File

@ -2,7 +2,6 @@ SELECT
kv.{{ .Ident "resource_version" }}, kv.{{ .Ident "resource_version" }},
kv.{{ .Ident "namespace" }}, kv.{{ .Ident "namespace" }},
kv.{{ .Ident "name" }}, kv.{{ .Ident "name" }},
kv.{{ .Ident "folder" }},
kv.{{ .Ident "value" }} kv.{{ .Ident "value" }}
FROM {{ .Ident "resource_history" }} as kv FROM {{ .Ident "resource_history" }} as kv
INNER JOIN ( INNER JOIN (

View File

@ -4,7 +4,6 @@ SELECT
{{ .Ident "group" | .Into .Response.Key.Group }}, {{ .Ident "group" | .Into .Response.Key.Group }},
{{ .Ident "resource" | .Into .Response.Key.Resource }}, {{ .Ident "resource" | .Into .Response.Key.Resource }},
{{ .Ident "name" | .Into .Response.Key.Name }}, {{ .Ident "name" | .Into .Response.Key.Name }},
{{ .Ident "folder" | .Into .Response.Folder }},
{{ .Ident "value" | .Into .Response.Value }}, {{ .Ident "value" | .Into .Response.Value }},
{{ .Ident "action" | .Into .Response.Action }}, {{ .Ident "action" | .Into .Response.Action }},
{{ .Ident "previous_resource_version" | .Into .Response.PreviousRV }} {{ .Ident "previous_resource_version" | .Into .Response.PreviousRV }}

View File

@ -1,11 +1,6 @@
SELECT SELECT
{{ .Ident "namespace" | .Into .Response.Key.Namespace }}, {{ .Ident "resource_version" | .Into .ResourceVersion }},
{{ .Ident "group" | .Into .Response.Key.Group }}, {{ .Ident "value" | .Into .Value }}
{{ .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" }} FROM {{ .Ident "resource_history" }}

View File

@ -6,7 +6,6 @@ INSERT INTO {{ .Ident "resource" }}
{{ .Ident "resource" }}, {{ .Ident "resource" }},
{{ .Ident "namespace" }}, {{ .Ident "namespace" }},
{{ .Ident "name" }}, {{ .Ident "name" }},
{{ .Ident "folder" }},
{{ .Ident "previous_resource_version" }}, {{ .Ident "previous_resource_version" }},
{{ .Ident "value" }}, {{ .Ident "value" }},
@ -18,7 +17,6 @@ INSERT INTO {{ .Ident "resource" }}
{{ .Arg .WriteEvent.Key.Resource }}, {{ .Arg .WriteEvent.Key.Resource }},
{{ .Arg .WriteEvent.Key.Namespace }}, {{ .Arg .WriteEvent.Key.Namespace }},
{{ .Arg .WriteEvent.Key.Name }}, {{ .Arg .WriteEvent.Key.Name }},
{{ .Arg .Folder }},
{{ .Arg .WriteEvent.PreviousRV }}, {{ .Arg .WriteEvent.PreviousRV }},
{{ .Arg .WriteEvent.Value }}, {{ .Arg .WriteEvent.Value }},

View File

@ -2,7 +2,6 @@ SELECT
{{ .Ident "resource_version" }}, {{ .Ident "resource_version" }},
{{ .Ident "namespace" }}, {{ .Ident "namespace" }},
{{ .Ident "name" }}, {{ .Ident "name" }},
{{ .Ident "folder" }},
{{ .Ident "value" }} {{ .Ident "value" }}
FROM {{ .Ident "resource" }} FROM {{ .Ident "resource" }}
WHERE 1 = 1 WHERE 1 = 1

View File

@ -1,11 +1,6 @@
SELECT SELECT
{{ .Ident "namespace" | .Into .Response.Key.Namespace }}, {{ .Ident "resource_version" | .Into .ResourceVersion }},
{{ .Ident "group" | .Into .Response.Key.Group }}, {{ .Ident "value" | .Into .Value }}
{{ .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" }} FROM {{ .Ident "resource" }}
WHERE 1 = 1 WHERE 1 = 1
AND {{ .Ident "namespace" }} = {{ .Arg .Request.Key.Namespace }} AND {{ .Ident "namespace" }} = {{ .Arg .Request.Key.Namespace }}

View File

@ -2,7 +2,6 @@ UPDATE {{ .Ident "resource" }}
SET SET
{{ .Ident "guid" }} = {{ .Arg .GUID }}, {{ .Ident "guid" }} = {{ .Arg .GUID }},
{{ .Ident "value" }} = {{ .Arg .WriteEvent.Value }}, {{ .Ident "value" }} = {{ .Arg .WriteEvent.Value }},
{{ .Ident "folder" }} = {{ .Arg .Folder }},
{{ .Ident "action" }} = {{ .Arg .WriteEvent.Type }} {{ .Ident "action" }} = {{ .Arg .WriteEvent.Type }}
WHERE 1 = 1 WHERE 1 = 1
AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }} AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }}

View File

@ -113,13 +113,5 @@ func initResourceTables(mg *migrator.Migrator) string {
Cols: []string{"group", "resource"}, Type: migrator.IndexType, 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: true,
}))
mg.AddMigration("Add column folder in resource", migrator.NewAddColumnMigration(resource_table, &migrator.Column{
Name: "folder", Type: migrator.DB_NVarchar, Length: 253, Nullable: true,
}))
return marker return marker
} }

View File

@ -61,7 +61,6 @@ type sqlResourceRequest struct {
sqltemplate.SQLTemplate sqltemplate.SQLTemplate
GUID string GUID string
WriteEvent resource.WriteEvent WriteEvent resource.WriteEvent
Folder string
} }
func (r sqlResourceRequest) Validate() error { func (r sqlResourceRequest) Validate() error {
@ -74,7 +73,6 @@ type historyPollResponse struct {
PreviousRV *int64 PreviousRV *int64
Value []byte Value []byte
Action int Action int
Folder string
} }
func (r *historyPollResponse) Results() (*historyPollResponse, error) { func (r *historyPollResponse) Results() (*historyPollResponse, error) {
@ -107,7 +105,6 @@ func (r *sqlResourceHistoryPollRequest) Results() (*historyPollResponse, error)
Resource: r.Response.Key.Resource, Resource: r.Response.Key.Resource,
Name: r.Response.Key.Name, Name: r.Response.Key.Name,
}, },
Folder: r.Response.Folder,
ResourceVersion: r.Response.ResourceVersion, ResourceVersion: r.Response.ResourceVersion,
PreviousRV: prevRV, PreviousRV: prevRV,
Value: r.Response.Value, Value: r.Response.Value,
@ -116,24 +113,33 @@ func (r *sqlResourceHistoryPollRequest) Results() (*historyPollResponse, error)
} }
// sqlResourceReadRequest can be used to retrieve a row fromthe "resource" tables. // sqlResourceReadRequest can be used to retrieve a row fromthe "resource" tables.
func NewReadResponse() *resource.BackendReadResponse {
return &resource.BackendReadResponse{ type readResponse struct {
Key: &resource.ResourceKey{}, resource.ReadResponse
} }
func (r *readResponse) Results() (*readResponse, error) {
return r, nil
} }
type sqlResourceReadRequest struct { type sqlResourceReadRequest struct {
sqltemplate.SQLTemplate sqltemplate.SQLTemplate
Request *resource.ReadRequest Request *resource.ReadRequest
Response *resource.BackendReadResponse *readResponse
} }
func (r *sqlResourceReadRequest) Validate() error { func (r *sqlResourceReadRequest) Validate() error {
return nil // TODO return nil // TODO
} }
func (r *sqlResourceReadRequest) Results() (*resource.BackendReadResponse, error) { func (r *sqlResourceReadRequest) Results() (*readResponse, error) {
return r.Response, nil return &readResponse{
ReadResponse: resource.ReadResponse{
Error: r.ReadResponse.Error,
ResourceVersion: r.ReadResponse.ResourceVersion,
Value: r.ReadResponse.Value,
},
}, nil
} }
// List // List
@ -148,7 +154,6 @@ func (r sqlResourceListRequest) Validate() error {
type historyListRequest struct { type historyListRequest struct {
ResourceVersion, Limit, Offset int64 ResourceVersion, Limit, Offset int64
Folder string
Options *resource.ListOptions Options *resource.ListOptions
} }
type sqlResourceHistoryListRequest struct { type sqlResourceHistoryListRequest struct {

View File

@ -43,7 +43,6 @@ func TestUnifiedStorageQueries(t *testing.T) {
Type: resource.WatchEvent_ADDED, Type: resource.WatchEvent_ADDED,
PreviousRV: 123, PreviousRV: 123,
}, },
Folder: "fldr",
}, },
}, },
}, },
@ -60,7 +59,6 @@ func TestUnifiedStorageQueries(t *testing.T) {
Name: "name", Name: "name",
}, },
}, },
Folder: "fldr",
}, },
}, },
}, },
@ -77,7 +75,7 @@ func TestUnifiedStorageQueries(t *testing.T) {
Name: "name", Name: "name",
}, },
}, },
Response: NewReadResponse(), readResponse: new(readResponse),
}, },
}, },
}, },
@ -145,14 +143,9 @@ func TestUnifiedStorageQueries(t *testing.T) {
SQLTemplate: mocks.NewTestingSQLTemplate(), SQLTemplate: mocks.NewTestingSQLTemplate(),
Request: &resource.ReadRequest{ Request: &resource.ReadRequest{
ResourceVersion: 123, ResourceVersion: 123,
Key: &resource.ResourceKey{ Key: &resource.ResourceKey{},
Namespace: "ns",
Group: "gp",
Resource: "rs",
Name: "nm",
}, },
}, readResponse: new(readResponse),
Response: NewReadResponse(),
}, },
}, },
}, },
@ -180,7 +173,6 @@ func TestUnifiedStorageQueries(t *testing.T) {
}, },
PreviousRV: 1234, PreviousRV: 1234,
}, },
Folder: "fldr",
}, },
}, },
}, },

View File

@ -9,13 +9,11 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/insecure"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"github.com/grafana/authlib/claims" "github.com/grafana/authlib/claims"
"github.com/grafana/dskit/services" "github.com/grafana/dskit/services"
"github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/grafana/grafana/pkg/apimachinery/utils"
infraDB "github.com/grafana/grafana/pkg/infra/db" infraDB "github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/infra/tracing"
"github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/featuremgmt"
@ -65,9 +63,9 @@ func newServer(t *testing.T, cfg *setting.Cfg) (sql.Backend, resource.ResourceSe
} }
func TestIntegrationBackendHappyPath(t *testing.T) { func TestIntegrationBackendHappyPath(t *testing.T) {
// if infraDB.IsTestDbSQLite() { if infraDB.IsTestDbSQLite() {
// t.Skip("TODO: test blocking, skipping to unblock Enterprise until we fix this") t.Skip("TODO: test blocking, skipping to unblock Enterprise until we fix this")
// } }
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")
} }
@ -118,7 +116,6 @@ func TestIntegrationBackendHappyPath(t *testing.T) {
require.Nil(t, resp.Error) require.Nil(t, resp.Error)
require.Equal(t, rv4, resp.ResourceVersion) require.Equal(t, rv4, resp.ResourceVersion)
require.Equal(t, "item2 MODIFIED", string(resp.Value)) 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) { t.Run("Read early version of item2", func(t *testing.T) {
@ -154,13 +151,10 @@ func TestIntegrationBackendHappyPath(t *testing.T) {
require.Equal(t, "item1", event.Key.Name) require.Equal(t, "item1", event.Key.Name)
require.Equal(t, rv1, event.ResourceVersion) require.Equal(t, rv1, event.ResourceVersion)
require.Equal(t, resource.WatchEvent_ADDED, event.Type) require.Equal(t, resource.WatchEvent_ADDED, event.Type)
require.Equal(t, "folderuid", event.Folder)
event = <-stream event = <-stream
require.Equal(t, "item2", event.Key.Name) require.Equal(t, "item2", event.Key.Name)
require.Equal(t, rv2, event.ResourceVersion) require.Equal(t, rv2, event.ResourceVersion)
require.Equal(t, resource.WatchEvent_ADDED, event.Type) require.Equal(t, resource.WatchEvent_ADDED, event.Type)
require.Equal(t, "folderuid", event.Folder)
event = <-stream event = <-stream
require.Equal(t, "item3", event.Key.Name) require.Equal(t, "item3", event.Key.Name)
@ -424,14 +418,6 @@ func TestClientServer(t *testing.T) {
} }
func writeEvent(ctx context.Context, store sql.Backend, name string, action resource.WatchEvent_Type) (int64, error) { 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{ return store.WriteEvent(ctx, resource.WriteEvent{
Type: action, Type: action,
Value: []byte(name + " " + resource.WatchEvent_Type_name[int32(action)]), Value: []byte(name + " " + resource.WatchEvent_Type_name[int32(action)]),
@ -441,7 +427,6 @@ func writeEvent(ctx context.Context, store sql.Backend, name string, action reso
Resource: "resource", Resource: "resource",
Name: name, Name: name,
}, },
Object: meta,
}) })
} }

View File

@ -5,7 +5,6 @@ INSERT INTO `resource_history`
`resource`, `resource`,
`namespace`, `namespace`,
`name`, `name`,
`folder`,
`previous_resource_version`, `previous_resource_version`,
`value`, `value`,
`action` `action`
@ -16,7 +15,6 @@ INSERT INTO `resource_history`
'rr', 'rr',
'nn', 'nn',
'name', 'name',
'fldr',
1234, 1234,
'[]', '[]',
'UNKNOWN' 'UNKNOWN'

View File

@ -2,7 +2,6 @@ SELECT
kv.`resource_version`, kv.`resource_version`,
kv.`namespace`, kv.`namespace`,
kv.`name`, kv.`name`,
kv.`folder`,
kv.`value` kv.`value`
FROM `resource_history` as kv FROM `resource_history` as kv
INNER JOIN ( INNER JOIN (

View File

@ -4,7 +4,6 @@ SELECT
`group`, `group`,
`resource`, `resource`,
`name`, `name`,
`folder`,
`value`, `value`,
`action`, `action`,
`previous_resource_version` `previous_resource_version`

View File

@ -1,17 +1,12 @@
SELECT SELECT
`namespace`,
`group`,
`resource`,
`name`,
`folder`,
`resource_version`, `resource_version`,
`value` `value`
FROM `resource_history` FROM `resource_history`
WHERE 1 = 1 WHERE 1 = 1
AND `namespace` = 'ns' AND `namespace` = ''
AND `group` = 'gp' AND `group` = ''
AND `resource` = 'rs' AND `resource` = ''
AND `name` = 'nm' AND `name` = ''
AND `resource_version` <= 123 AND `resource_version` <= 123
ORDER BY `resource_version` DESC ORDER BY `resource_version` DESC
LIMIT 1 LIMIT 1

View File

@ -5,7 +5,6 @@ INSERT INTO `resource`
`resource`, `resource`,
`namespace`, `namespace`,
`name`, `name`,
`folder`,
`previous_resource_version`, `previous_resource_version`,
`value`, `value`,
`action` `action`
@ -16,7 +15,6 @@ INSERT INTO `resource`
'rr', 'rr',
'nn', 'nn',
'name', 'name',
'fldr',
123, 123,
'[]', '[]',
'ADDED' 'ADDED'

View File

@ -2,7 +2,6 @@ SELECT
`resource_version`, `resource_version`,
`namespace`, `namespace`,
`name`, `name`,
`folder`,
`value` `value`
FROM `resource` FROM `resource`
WHERE 1 = 1 WHERE 1 = 1

View File

@ -1,9 +1,4 @@
SELECT SELECT
`namespace`,
`group`,
`resource`,
`name`,
`folder`,
`resource_version`, `resource_version`,
`value` `value`
FROM `resource` FROM `resource`

View File

@ -2,7 +2,6 @@ UPDATE `resource`
SET SET
`guid` = '', `guid` = '',
`value` = '[]', `value` = '[]',
`folder` = 'fldr',
`action` = 'UNKNOWN' `action` = 'UNKNOWN'
WHERE 1 = 1 WHERE 1 = 1
AND `group` = 'gg' AND `group` = 'gg'

View File

@ -5,7 +5,6 @@ INSERT INTO "resource_history"
"resource", "resource",
"namespace", "namespace",
"name", "name",
"folder",
"previous_resource_version", "previous_resource_version",
"value", "value",
"action" "action"
@ -16,7 +15,6 @@ INSERT INTO "resource_history"
'rr', 'rr',
'nn', 'nn',
'name', 'name',
'fldr',
1234, 1234,
'[]', '[]',
'UNKNOWN' 'UNKNOWN'

View File

@ -2,7 +2,6 @@ SELECT
kv."resource_version", kv."resource_version",
kv."namespace", kv."namespace",
kv."name", kv."name",
kv."folder",
kv."value" kv."value"
FROM "resource_history" as kv FROM "resource_history" as kv
INNER JOIN ( INNER JOIN (

View File

@ -4,7 +4,6 @@ SELECT
"group", "group",
"resource", "resource",
"name", "name",
"folder",
"value", "value",
"action", "action",
"previous_resource_version" "previous_resource_version"

View File

@ -1,17 +1,12 @@
SELECT SELECT
"namespace",
"group",
"resource",
"name",
"folder",
"resource_version", "resource_version",
"value" "value"
FROM "resource_history" FROM "resource_history"
WHERE 1 = 1 WHERE 1 = 1
AND "namespace" = 'ns' AND "namespace" = ''
AND "group" = 'gp' AND "group" = ''
AND "resource" = 'rs' AND "resource" = ''
AND "name" = 'nm' AND "name" = ''
AND "resource_version" <= 123 AND "resource_version" <= 123
ORDER BY "resource_version" DESC ORDER BY "resource_version" DESC
LIMIT 1 LIMIT 1

View File

@ -5,7 +5,6 @@ INSERT INTO "resource"
"resource", "resource",
"namespace", "namespace",
"name", "name",
"folder",
"previous_resource_version", "previous_resource_version",
"value", "value",
"action" "action"
@ -16,7 +15,6 @@ INSERT INTO "resource"
'rr', 'rr',
'nn', 'nn',
'name', 'name',
'fldr',
123, 123,
'[]', '[]',
'ADDED' 'ADDED'

View File

@ -2,7 +2,6 @@ SELECT
"resource_version", "resource_version",
"namespace", "namespace",
"name", "name",
"folder",
"value" "value"
FROM "resource" FROM "resource"
WHERE 1 = 1 WHERE 1 = 1

View File

@ -1,9 +1,4 @@
SELECT SELECT
"namespace",
"group",
"resource",
"name",
"folder",
"resource_version", "resource_version",
"value" "value"
FROM "resource" FROM "resource"

View File

@ -2,7 +2,6 @@ UPDATE "resource"
SET SET
"guid" = '', "guid" = '',
"value" = '[]', "value" = '[]',
"folder" = 'fldr',
"action" = 'UNKNOWN' "action" = 'UNKNOWN'
WHERE 1 = 1 WHERE 1 = 1
AND "group" = 'gg' AND "group" = 'gg'

View File

@ -5,7 +5,6 @@ INSERT INTO "resource_history"
"resource", "resource",
"namespace", "namespace",
"name", "name",
"folder",
"previous_resource_version", "previous_resource_version",
"value", "value",
"action" "action"
@ -16,7 +15,6 @@ INSERT INTO "resource_history"
'rr', 'rr',
'nn', 'nn',
'name', 'name',
'fldr',
1234, 1234,
'[]', '[]',
'UNKNOWN' 'UNKNOWN'

View File

@ -2,7 +2,6 @@ SELECT
kv."resource_version", kv."resource_version",
kv."namespace", kv."namespace",
kv."name", kv."name",
kv."folder",
kv."value" kv."value"
FROM "resource_history" as kv FROM "resource_history" as kv
INNER JOIN ( INNER JOIN (

View File

@ -4,7 +4,6 @@ SELECT
"group", "group",
"resource", "resource",
"name", "name",
"folder",
"value", "value",
"action", "action",
"previous_resource_version" "previous_resource_version"

View File

@ -1,17 +1,12 @@
SELECT SELECT
"namespace",
"group",
"resource",
"name",
"folder",
"resource_version", "resource_version",
"value" "value"
FROM "resource_history" FROM "resource_history"
WHERE 1 = 1 WHERE 1 = 1
AND "namespace" = 'ns' AND "namespace" = ''
AND "group" = 'gp' AND "group" = ''
AND "resource" = 'rs' AND "resource" = ''
AND "name" = 'nm' AND "name" = ''
AND "resource_version" <= 123 AND "resource_version" <= 123
ORDER BY "resource_version" DESC ORDER BY "resource_version" DESC
LIMIT 1 LIMIT 1

View File

@ -5,7 +5,6 @@ INSERT INTO "resource"
"resource", "resource",
"namespace", "namespace",
"name", "name",
"folder",
"previous_resource_version", "previous_resource_version",
"value", "value",
"action" "action"
@ -16,7 +15,6 @@ INSERT INTO "resource"
'rr', 'rr',
'nn', 'nn',
'name', 'name',
'fldr',
123, 123,
'[]', '[]',
'ADDED' 'ADDED'

View File

@ -2,7 +2,6 @@ SELECT
"resource_version", "resource_version",
"namespace", "namespace",
"name", "name",
"folder",
"value" "value"
FROM "resource" FROM "resource"
WHERE 1 = 1 WHERE 1 = 1

View File

@ -1,9 +1,4 @@
SELECT SELECT
"namespace",
"group",
"resource",
"name",
"folder",
"resource_version", "resource_version",
"value" "value"
FROM "resource" FROM "resource"

View File

@ -2,7 +2,6 @@ UPDATE "resource"
SET SET
"guid" = '', "guid" = '',
"value" = '[]', "value" = '[]',
"folder" = 'fldr',
"action" = 'UNKNOWN' "action" = 'UNKNOWN'
WHERE 1 = 1 WHERE 1 = 1
AND "group" = 'gg' AND "group" = 'gg'