mirror of https://github.com/grafana/grafana.git
				
				
				
			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:
		
							parent
							
								
									26b0e8f105
								
							
						
					
					
						commit
						aaa4f4a23e
					
				|  | @ -196,10 +196,6 @@ 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) | ||||
|  |  | |||
|  | @ -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.BackendReadResponse { | ||||
| 	rsp := &resource.BackendReadResponse{} | ||||
| func (a *dashboardSqlAccess) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.ReadResponse { | ||||
| 	rsp := &resource.ReadResponse{} | ||||
| 	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.BackendReadResponse, error) { | ||||
| func (a *dashboardSqlAccess) Read(ctx context.Context, req *resource.ReadRequest) (*resource.ReadResponse, error) { | ||||
| 	return a.ReadResource(ctx, req), nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -134,7 +134,7 @@ func (s *cdkBackend) WriteEvent(ctx context.Context, event WriteEvent) (rv int64 | |||
| 	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 | ||||
| 
 | ||||
| 	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) | ||||
| 	if raw == nil && req.ResourceVersion > 0 { | ||||
| 		if req.ResourceVersion > s.rv.Load() { | ||||
| 			return &BackendReadResponse{ | ||||
| 			return &ReadResponse{ | ||||
| 				Error: &ErrorResult{ | ||||
| 					Code:    http.StatusGatewayTimeout, | ||||
| 					Reason:  string(metav1.StatusReasonTimeout), // match etcd behavior
 | ||||
|  | @ -191,11 +191,9 @@ func (s *cdkBackend) ReadResource(ctx context.Context, req *ReadRequest) *Backen | |||
| 		raw = nil | ||||
| 	} | ||||
| 	if raw == nil { | ||||
| 		return &BackendReadResponse{Error: NewNotFoundError(req.Key)} | ||||
| 		return &ReadResponse{Error: NewNotFoundError(req.Key)} | ||||
| 	} | ||||
| 	return &BackendReadResponse{ | ||||
| 		Key:             req.Key, | ||||
| 		Folder:          "", // TODO: implement this
 | ||||
| 	return &ReadResponse{ | ||||
| 		ResourceVersion: rv, | ||||
| 		Value:           raw, | ||||
| 	} | ||||
|  | @ -320,10 +318,6 @@ 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) { | ||||
|  |  | |||
|  | @ -24,8 +24,6 @@ type WriteEvent struct { | |||
| // WriteEvents after they include a resource version
 | ||||
| type WrittenEvent struct { | ||||
| 	WriteEvent | ||||
| 	// Metadata
 | ||||
| 	Folder string | ||||
| 
 | ||||
| 	// The resource version
 | ||||
| 	ResourceVersion int64 | ||||
|  |  | |||
|  | @ -49,27 +49,10 @@ 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.
 | ||||
|  | @ -80,7 +63,7 @@ type StorageBackend interface { | |||
| 	WriteEvent(context.Context, WriteEvent) (int64, error) | ||||
| 
 | ||||
| 	// 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
 | ||||
| 	// 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) | ||||
| 	// TODO, check folder permissions etc
 | ||||
| 	return &ReadResponse{ | ||||
| 		ResourceVersion: rsp.ResourceVersion, | ||||
| 		Value:           rsp.Value, | ||||
| 		Error:           rsp.Error, | ||||
| 	}, nil | ||||
| 	return rsp, nil | ||||
| } | ||||
| 
 | ||||
| func (s *server) List(ctx context.Context, req *ListRequest) (*ListResponse, error) { | ||||
|  |  | |||
|  | @ -143,15 +143,12 @@ 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 { | ||||
| 		folder := "" | ||||
| 		if event.Object != nil { | ||||
| 			folder = event.Object.GetFolder() | ||||
| 		} | ||||
| 		// TODO: Set the Labels
 | ||||
| 
 | ||||
| 		// 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) | ||||
|  | @ -161,7 +158,6 @@ 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) | ||||
|  | @ -204,15 +200,12 @@ 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 { | ||||
| 		folder := "" | ||||
| 		if event.Object != nil { | ||||
| 			folder = event.Object.GetFolder() | ||||
| 		} | ||||
| 		// TODO: Set the Labels
 | ||||
| 
 | ||||
| 		// 1. Update resource
 | ||||
| 		_, err := dbutil.Exec(ctx, tx, sqlResourceUpdate, sqlResourceRequest{ | ||||
| 			SQLTemplate: sqltemplate.New(b.dialect), | ||||
| 			WriteEvent:  event, | ||||
| 			Folder:      folder, | ||||
| 			GUID:        guid, | ||||
| 		}) | ||||
| 		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{ | ||||
| 			SQLTemplate: sqltemplate.New(b.dialect), | ||||
| 			WriteEvent:  event, | ||||
| 			Folder:      folder, | ||||
| 			GUID:        guid, | ||||
| 		}); err != nil { | ||||
| 			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() | ||||
| 
 | ||||
| 	err := b.db.WithTx(ctx, ReadCommitted, func(ctx context.Context, tx db.Tx) error { | ||||
| 		folder := "" | ||||
| 		if event.Object != nil { | ||||
| 			folder = event.Object.GetFolder() | ||||
| 		} | ||||
| 		// TODO: Set the Labels
 | ||||
| 
 | ||||
| 		// 1. delete from resource
 | ||||
| 		_, err := dbutil.Exec(ctx, tx, sqlResourceDelete, sqlResourceRequest{ | ||||
| 			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{ | ||||
| 			SQLTemplate: sqltemplate.New(b.dialect), | ||||
| 			WriteEvent:  event, | ||||
| 			Folder:      folder, | ||||
| 			GUID:        guid, | ||||
| 		}); err != nil { | ||||
| 			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 | ||||
| } | ||||
| 
 | ||||
| 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") | ||||
| 	defer span.End() | ||||
| 
 | ||||
|  | @ -325,7 +314,7 @@ func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) * | |||
| 	readReq := &sqlResourceReadRequest{ | ||||
| 		SQLTemplate:  sqltemplate.New(b.dialect), | ||||
| 		Request:      req, | ||||
| 		Response:    NewReadResponse(), | ||||
| 		readResponse: new(readResponse), | ||||
| 	} | ||||
| 
 | ||||
| 	sr := sqlResourceRead | ||||
|  | @ -334,21 +323,21 @@ func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) * | |||
| 		sr = sqlResourceHistoryRead | ||||
| 	} | ||||
| 
 | ||||
| 	var res *resource.BackendReadResponse | ||||
| 	var res *readResponse | ||||
| 	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.BackendReadResponse{ | ||||
| 		return &resource.ReadResponse{ | ||||
| 			Error: resource.NewNotFoundError(req.Key), | ||||
| 		} | ||||
| 	} 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) { | ||||
|  | @ -382,7 +371,6 @@ type listIter struct { | |||
| 	value     []byte | ||||
| 	namespace string | ||||
| 	name      string | ||||
| 	folder    string | ||||
| } | ||||
| 
 | ||||
| // ContinueToken implements resource.ListIterator.
 | ||||
|  | @ -390,22 +378,21 @@ 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 | ||||
|  | @ -420,7 +407,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.folder, &l.value) | ||||
| 		l.err = l.rows.Scan(&l.rv, &l.namespace, &l.name, &l.value) | ||||
| 		return true | ||||
| 	} | ||||
| 	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), | ||||
| 				PreviousRV: *prevRV, | ||||
| 			}, | ||||
| 			Folder:          rec.Folder, | ||||
| 			ResourceVersion: rec.ResourceVersion, | ||||
| 			// Timestamp:  , // TODO: add timestamp
 | ||||
| 		} | ||||
|  |  | |||
|  | @ -8,9 +8,7 @@ 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" | ||||
|  | @ -283,14 +281,9 @@ 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, | ||||
| 		Object: meta, | ||||
| 	} | ||||
| 
 | ||||
| 	t.Run("happy path", func(t *testing.T) { | ||||
|  | @ -393,15 +386,9 @@ 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, | ||||
| 		Object: meta, | ||||
| 	} | ||||
| 
 | ||||
| 	t.Run("happy path", func(t *testing.T) { | ||||
|  | @ -504,14 +491,9 @@ 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, | ||||
| 		Object: meta, | ||||
| 	} | ||||
| 
 | ||||
| 	t.Run("happy path", func(t *testing.T) { | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO {{ .Ident "resource_history" }} | |||
|         {{ .Ident "resource" }}, | ||||
|         {{ .Ident "namespace" }}, | ||||
|         {{ .Ident "name" }}, | ||||
|         {{ .Ident "folder" }}, | ||||
| 
 | ||||
|         {{ .Ident "previous_resource_version"}}, | ||||
|         {{ .Ident "value" }}, | ||||
|  | @ -18,7 +17,6 @@ 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 }}, | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ 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  ( | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ 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 }} | ||||
|  |  | |||
|  | @ -1,11 +1,6 @@ | |||
| SELECT | ||||
|     {{ .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 }} | ||||
|     {{ .Ident "resource_version" | .Into .ResourceVersion }}, | ||||
|     {{ .Ident "value" | .Into .Value }} | ||||
| 
 | ||||
|     FROM {{ .Ident "resource_history" }} | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ INSERT INTO {{ .Ident "resource" }} | |||
|         {{ .Ident "resource" }}, | ||||
|         {{ .Ident "namespace" }}, | ||||
|         {{ .Ident "name" }}, | ||||
|         {{ .Ident "folder" }}, | ||||
| 
 | ||||
|         {{ .Ident "previous_resource_version" }}, | ||||
|         {{ .Ident "value" }}, | ||||
|  | @ -18,7 +17,6 @@ INSERT INTO {{ .Ident "resource" }} | |||
|         {{ .Arg .WriteEvent.Key.Resource }}, | ||||
|         {{ .Arg .WriteEvent.Key.Namespace }}, | ||||
|         {{ .Arg .WriteEvent.Key.Name }}, | ||||
|         {{ .Arg .Folder }}, | ||||
| 
 | ||||
|         {{ .Arg .WriteEvent.PreviousRV }}, | ||||
|         {{ .Arg .WriteEvent.Value }}, | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     {{ .Ident "resource_version" }}, | ||||
|     {{ .Ident "namespace" }}, | ||||
|     {{ .Ident "name" }}, | ||||
|     {{ .Ident "folder" }}, | ||||
|     {{ .Ident "value" }} | ||||
|     FROM {{ .Ident "resource" }} | ||||
|     WHERE 1 = 1 | ||||
|  |  | |||
|  | @ -1,11 +1,6 @@ | |||
| SELECT | ||||
|     {{ .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 }} | ||||
|     {{ .Ident "resource_version" | .Into .ResourceVersion }}, | ||||
|     {{ .Ident "value" | .Into .Value }} | ||||
|     FROM {{ .Ident "resource" }} | ||||
|     WHERE 1 = 1 | ||||
|         AND {{ .Ident "namespace" }} = {{ .Arg .Request.Key.Namespace }} | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ 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 }} | ||||
|  |  | |||
|  | @ -113,13 +113,5 @@ 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: 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 | ||||
| } | ||||
|  |  | |||
|  | @ -61,7 +61,6 @@ type sqlResourceRequest struct { | |||
| 	sqltemplate.SQLTemplate | ||||
| 	GUID       string | ||||
| 	WriteEvent resource.WriteEvent | ||||
| 	Folder     string | ||||
| } | ||||
| 
 | ||||
| func (r sqlResourceRequest) Validate() error { | ||||
|  | @ -74,7 +73,6 @@ type historyPollResponse struct { | |||
| 	PreviousRV      *int64 | ||||
| 	Value           []byte | ||||
| 	Action          int | ||||
| 	Folder          string | ||||
| } | ||||
| 
 | ||||
| func (r *historyPollResponse) Results() (*historyPollResponse, error) { | ||||
|  | @ -107,7 +105,6 @@ 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,24 +113,33 @@ func (r *sqlResourceHistoryPollRequest) Results() (*historyPollResponse, error) | |||
| } | ||||
| 
 | ||||
| // sqlResourceReadRequest can be used to retrieve a row fromthe "resource" tables.
 | ||||
| func NewReadResponse() *resource.BackendReadResponse { | ||||
| 	return &resource.BackendReadResponse{ | ||||
| 		Key: &resource.ResourceKey{}, | ||||
| 	} | ||||
| 
 | ||||
| type readResponse struct { | ||||
| 	resource.ReadResponse | ||||
| } | ||||
| 
 | ||||
| func (r *readResponse) Results() (*readResponse, error) { | ||||
| 	return r, nil | ||||
| } | ||||
| 
 | ||||
| type sqlResourceReadRequest struct { | ||||
| 	sqltemplate.SQLTemplate | ||||
| 	Request *resource.ReadRequest | ||||
| 	Response *resource.BackendReadResponse | ||||
| 	*readResponse | ||||
| } | ||||
| 
 | ||||
| func (r *sqlResourceReadRequest) Validate() error { | ||||
| 	return nil // TODO
 | ||||
| } | ||||
| 
 | ||||
| func (r *sqlResourceReadRequest) Results() (*resource.BackendReadResponse, error) { | ||||
| 	return r.Response, nil | ||||
| func (r *sqlResourceReadRequest) Results() (*readResponse, error) { | ||||
| 	return &readResponse{ | ||||
| 		ReadResponse: resource.ReadResponse{ | ||||
| 			Error:           r.ReadResponse.Error, | ||||
| 			ResourceVersion: r.ReadResponse.ResourceVersion, | ||||
| 			Value:           r.ReadResponse.Value, | ||||
| 		}, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // List
 | ||||
|  | @ -148,7 +154,6 @@ func (r sqlResourceListRequest) Validate() error { | |||
| 
 | ||||
| type historyListRequest struct { | ||||
| 	ResourceVersion, Limit, Offset int64 | ||||
| 	Folder                         string | ||||
| 	Options                        *resource.ListOptions | ||||
| } | ||||
| type sqlResourceHistoryListRequest struct { | ||||
|  |  | |||
|  | @ -43,7 +43,6 @@ func TestUnifiedStorageQueries(t *testing.T) { | |||
| 							Type:       resource.WatchEvent_ADDED, | ||||
| 							PreviousRV: 123, | ||||
| 						}, | ||||
| 						Folder: "fldr", | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
|  | @ -60,7 +59,6 @@ func TestUnifiedStorageQueries(t *testing.T) { | |||
| 								Name:      "name", | ||||
| 							}, | ||||
| 						}, | ||||
| 						Folder: "fldr", | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
|  | @ -77,7 +75,7 @@ func TestUnifiedStorageQueries(t *testing.T) { | |||
| 								Name:      "name", | ||||
| 							}, | ||||
| 						}, | ||||
| 						Response: NewReadResponse(), | ||||
| 						readResponse: new(readResponse), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
|  | @ -145,14 +143,9 @@ func TestUnifiedStorageQueries(t *testing.T) { | |||
| 						SQLTemplate: mocks.NewTestingSQLTemplate(), | ||||
| 						Request: &resource.ReadRequest{ | ||||
| 							ResourceVersion: 123, | ||||
| 							Key: &resource.ResourceKey{ | ||||
| 								Namespace: "ns", | ||||
| 								Group:     "gp", | ||||
| 								Resource:  "rs", | ||||
| 								Name:      "nm", | ||||
| 							Key:             &resource.ResourceKey{}, | ||||
| 						}, | ||||
| 						}, | ||||
| 						Response: NewReadResponse(), | ||||
| 						readResponse: new(readResponse), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
|  | @ -180,7 +173,6 @@ func TestUnifiedStorageQueries(t *testing.T) { | |||
| 							}, | ||||
| 							PreviousRV: 1234, | ||||
| 						}, | ||||
| 						Folder: "fldr", | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
|  |  | |||
|  | @ -9,13 +9,11 @@ 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" | ||||
|  | @ -65,9 +63,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") | ||||
| 	} | ||||
|  | @ -118,7 +116,6 @@ 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) { | ||||
|  | @ -154,13 +151,10 @@ 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) | ||||
|  | @ -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) { | ||||
| 	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)]), | ||||
|  | @ -441,7 +427,6 @@ func writeEvent(ctx context.Context, store sql.Backend, name string, action reso | |||
| 			Resource:  "resource", | ||||
| 			Name:      name, | ||||
| 		}, | ||||
| 		Object: meta, | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO `resource_history` | |||
|         `resource`, | ||||
|         `namespace`, | ||||
|         `name`, | ||||
|         `folder`, | ||||
|         `previous_resource_version`, | ||||
|         `value`, | ||||
|         `action` | ||||
|  | @ -16,7 +15,6 @@ INSERT INTO `resource_history` | |||
|         'rr', | ||||
|         'nn', | ||||
|         'name', | ||||
|         'fldr', | ||||
|         1234, | ||||
|         '[]', | ||||
|         'UNKNOWN' | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     kv.`resource_version`, | ||||
|     kv.`namespace`, | ||||
|     kv.`name`, | ||||
|     kv.`folder`, | ||||
|     kv.`value` | ||||
|     FROM `resource_history` as kv  | ||||
|     INNER JOIN  ( | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ SELECT | |||
|     `group`, | ||||
|     `resource`, | ||||
|     `name`, | ||||
|     `folder`, | ||||
|     `value`, | ||||
|     `action`, | ||||
|     `previous_resource_version` | ||||
|  |  | |||
|  | @ -1,17 +1,12 @@ | |||
| SELECT | ||||
|     `namespace`, | ||||
|     `group`, | ||||
|     `resource`, | ||||
|     `name`, | ||||
|     `folder`, | ||||
|     `resource_version`, | ||||
|     `value` | ||||
|     FROM `resource_history` | ||||
|     WHERE 1 = 1 | ||||
|         AND `namespace` = 'ns' | ||||
|         AND `group`     = 'gp' | ||||
|         AND `resource`  = 'rs' | ||||
|         AND `name`      = 'nm' | ||||
|         AND `namespace` = '' | ||||
|         AND `group`     = '' | ||||
|         AND `resource`  = '' | ||||
|         AND `name`      = '' | ||||
|         AND `resource_version` <= 123 | ||||
|     ORDER BY `resource_version` DESC | ||||
|     LIMIT 1 | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO `resource` | |||
|         `resource`, | ||||
|         `namespace`, | ||||
|         `name`, | ||||
|         `folder`, | ||||
|         `previous_resource_version`, | ||||
|         `value`, | ||||
|         `action` | ||||
|  | @ -16,7 +15,6 @@ INSERT INTO `resource` | |||
|         'rr', | ||||
|         'nn', | ||||
|         'name', | ||||
|         'fldr', | ||||
|         123, | ||||
|         '[]', | ||||
|         'ADDED' | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     `resource_version`, | ||||
|     `namespace`, | ||||
|     `name`, | ||||
|     `folder`, | ||||
|     `value` | ||||
|     FROM `resource` | ||||
|     WHERE 1 = 1 | ||||
|  |  | |||
|  | @ -1,9 +1,4 @@ | |||
| SELECT | ||||
|     `namespace`, | ||||
|     `group`, | ||||
|     `resource`, | ||||
|     `name`, | ||||
|     `folder`, | ||||
|     `resource_version`, | ||||
|     `value` | ||||
|     FROM `resource` | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ UPDATE `resource` | |||
|     SET | ||||
|         `guid`   = '', | ||||
|         `value`  = '[]', | ||||
|         `folder`  = 'fldr', | ||||
|         `action` = 'UNKNOWN'   | ||||
|     WHERE 1 = 1 | ||||
|         AND `group`     = 'gg' | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO "resource_history" | |||
|         "resource", | ||||
|         "namespace", | ||||
|         "name", | ||||
|         "folder", | ||||
|         "previous_resource_version", | ||||
|         "value", | ||||
|         "action" | ||||
|  | @ -16,7 +15,6 @@ INSERT INTO "resource_history" | |||
|         'rr', | ||||
|         'nn', | ||||
|         'name', | ||||
|         'fldr', | ||||
|         1234, | ||||
|         '[]', | ||||
|         'UNKNOWN' | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     kv."resource_version", | ||||
|     kv."namespace", | ||||
|     kv."name", | ||||
|     kv."folder", | ||||
|     kv."value" | ||||
|     FROM "resource_history" as kv  | ||||
|     INNER JOIN  ( | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ SELECT | |||
|     "group", | ||||
|     "resource", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "value", | ||||
|     "action", | ||||
|     "previous_resource_version" | ||||
|  |  | |||
|  | @ -1,17 +1,12 @@ | |||
| SELECT | ||||
|     "namespace", | ||||
|     "group", | ||||
|     "resource", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "resource_version", | ||||
|     "value" | ||||
|     FROM "resource_history" | ||||
|     WHERE 1 = 1 | ||||
|         AND "namespace" = 'ns' | ||||
|         AND "group"     = 'gp' | ||||
|         AND "resource"  = 'rs' | ||||
|         AND "name"      = 'nm' | ||||
|         AND "namespace" = '' | ||||
|         AND "group"     = '' | ||||
|         AND "resource"  = '' | ||||
|         AND "name"      = '' | ||||
|         AND "resource_version" <= 123 | ||||
|     ORDER BY "resource_version" DESC | ||||
|     LIMIT 1 | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO "resource" | |||
|         "resource", | ||||
|         "namespace", | ||||
|         "name", | ||||
|         "folder", | ||||
|         "previous_resource_version", | ||||
|         "value", | ||||
|         "action" | ||||
|  | @ -16,7 +15,6 @@ INSERT INTO "resource" | |||
|         'rr', | ||||
|         'nn', | ||||
|         'name', | ||||
|         'fldr', | ||||
|         123, | ||||
|         '[]', | ||||
|         'ADDED' | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     "resource_version", | ||||
|     "namespace", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "value" | ||||
|     FROM "resource" | ||||
|     WHERE 1 = 1 | ||||
|  |  | |||
|  | @ -1,9 +1,4 @@ | |||
| SELECT | ||||
|     "namespace", | ||||
|     "group", | ||||
|     "resource", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "resource_version", | ||||
|     "value" | ||||
|     FROM "resource" | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ UPDATE "resource" | |||
|     SET | ||||
|         "guid"   = '', | ||||
|         "value"  = '[]', | ||||
|         "folder"  = 'fldr', | ||||
|         "action" = 'UNKNOWN'   | ||||
|     WHERE 1 = 1 | ||||
|         AND "group"     = 'gg' | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO "resource_history" | |||
|         "resource", | ||||
|         "namespace", | ||||
|         "name", | ||||
|         "folder", | ||||
|         "previous_resource_version", | ||||
|         "value", | ||||
|         "action" | ||||
|  | @ -16,7 +15,6 @@ INSERT INTO "resource_history" | |||
|         'rr', | ||||
|         'nn', | ||||
|         'name', | ||||
|         'fldr', | ||||
|         1234, | ||||
|         '[]', | ||||
|         'UNKNOWN' | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     kv."resource_version", | ||||
|     kv."namespace", | ||||
|     kv."name", | ||||
|     kv."folder", | ||||
|     kv."value" | ||||
|     FROM "resource_history" as kv  | ||||
|     INNER JOIN  ( | ||||
|  |  | |||
|  | @ -4,7 +4,6 @@ SELECT | |||
|     "group", | ||||
|     "resource", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "value", | ||||
|     "action", | ||||
|     "previous_resource_version" | ||||
|  |  | |||
|  | @ -1,17 +1,12 @@ | |||
| SELECT | ||||
|     "namespace", | ||||
|     "group", | ||||
|     "resource", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "resource_version", | ||||
|     "value" | ||||
|     FROM "resource_history" | ||||
|     WHERE 1 = 1 | ||||
|         AND "namespace" = 'ns' | ||||
|         AND "group"     = 'gp' | ||||
|         AND "resource"  = 'rs' | ||||
|         AND "name"      = 'nm' | ||||
|         AND "namespace" = '' | ||||
|         AND "group"     = '' | ||||
|         AND "resource"  = '' | ||||
|         AND "name"      = '' | ||||
|         AND "resource_version" <= 123 | ||||
|     ORDER BY "resource_version" DESC | ||||
|     LIMIT 1 | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ INSERT INTO "resource" | |||
|         "resource", | ||||
|         "namespace", | ||||
|         "name", | ||||
|         "folder", | ||||
|         "previous_resource_version", | ||||
|         "value", | ||||
|         "action" | ||||
|  | @ -16,7 +15,6 @@ INSERT INTO "resource" | |||
|         'rr', | ||||
|         'nn', | ||||
|         'name', | ||||
|         'fldr', | ||||
|         123, | ||||
|         '[]', | ||||
|         'ADDED' | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ SELECT | |||
|     "resource_version", | ||||
|     "namespace", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "value" | ||||
|     FROM "resource" | ||||
|     WHERE 1 = 1 | ||||
|  |  | |||
|  | @ -1,9 +1,4 @@ | |||
| SELECT | ||||
|     "namespace", | ||||
|     "group", | ||||
|     "resource", | ||||
|     "name", | ||||
|     "folder", | ||||
|     "resource_version", | ||||
|     "value" | ||||
|     FROM "resource" | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ UPDATE "resource" | |||
|     SET | ||||
|         "guid"   = '', | ||||
|         "value"  = '[]', | ||||
|         "folder"  = 'fldr', | ||||
|         "action" = 'UNKNOWN'   | ||||
|     WHERE 1 = 1 | ||||
|         AND "group"     = 'gg' | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue