Unitstore: Fix the Folder migration (#96078)
* UniStore: Add folder to the SQL backend
This reverts commit aaa4f4a23e.
* fix folder migration
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 }},
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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" }}
|
||||
|
||||
|
||||
@@ -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 }},
|
||||
|
||||
@@ -2,6 +2,7 @@ SELECT
|
||||
{{ .Ident "resource_version" }},
|
||||
{{ .Ident "namespace" }},
|
||||
{{ .Ident "name" }},
|
||||
{{ .Ident "folder" }},
|
||||
{{ .Ident "value" }}
|
||||
FROM {{ .Ident "resource" }}
|
||||
WHERE 1 = 1
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Vendored
+2
@@ -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'
|
||||
|
||||
@@ -2,6 +2,7 @@ SELECT
|
||||
kv.`resource_version`,
|
||||
kv.`namespace`,
|
||||
kv.`name`,
|
||||
kv.`folder`,
|
||||
kv.`value`
|
||||
FROM `resource_history` as kv
|
||||
INNER JOIN (
|
||||
|
||||
@@ -4,6 +4,7 @@ SELECT
|
||||
`group`,
|
||||
`resource`,
|
||||
`name`,
|
||||
`folder`,
|
||||
`value`,
|
||||
`action`,
|
||||
`previous_resource_version`
|
||||
|
||||
+9
-4
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -2,6 +2,7 @@ SELECT
|
||||
`resource_version`,
|
||||
`namespace`,
|
||||
`name`,
|
||||
`folder`,
|
||||
`value`
|
||||
FROM `resource`
|
||||
WHERE 1 = 1
|
||||
|
||||
+5
@@ -1,4 +1,9 @@
|
||||
SELECT
|
||||
`namespace`,
|
||||
`group`,
|
||||
`resource`,
|
||||
`name`,
|
||||
`folder`,
|
||||
`resource_version`,
|
||||
`value`
|
||||
FROM `resource`
|
||||
|
||||
@@ -2,6 +2,7 @@ UPDATE `resource`
|
||||
SET
|
||||
`guid` = '',
|
||||
`value` = '[]',
|
||||
`folder` = 'fldr',
|
||||
`action` = 'UNKNOWN'
|
||||
WHERE 1 = 1
|
||||
AND `group` = 'gg'
|
||||
|
||||
Vendored
+2
@@ -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'
|
||||
|
||||
+1
@@ -2,6 +2,7 @@ SELECT
|
||||
kv."resource_version",
|
||||
kv."namespace",
|
||||
kv."name",
|
||||
kv."folder",
|
||||
kv."value"
|
||||
FROM "resource_history" as kv
|
||||
INNER JOIN (
|
||||
|
||||
+1
@@ -4,6 +4,7 @@ SELECT
|
||||
"group",
|
||||
"resource",
|
||||
"name",
|
||||
"folder",
|
||||
"value",
|
||||
"action",
|
||||
"previous_resource_version"
|
||||
|
||||
+9
-4
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
+1
@@ -2,6 +2,7 @@ SELECT
|
||||
"resource_version",
|
||||
"namespace",
|
||||
"name",
|
||||
"folder",
|
||||
"value"
|
||||
FROM "resource"
|
||||
WHERE 1 = 1
|
||||
|
||||
+5
@@ -1,4 +1,9 @@
|
||||
SELECT
|
||||
"namespace",
|
||||
"group",
|
||||
"resource",
|
||||
"name",
|
||||
"folder",
|
||||
"resource_version",
|
||||
"value"
|
||||
FROM "resource"
|
||||
|
||||
@@ -2,6 +2,7 @@ UPDATE "resource"
|
||||
SET
|
||||
"guid" = '',
|
||||
"value" = '[]',
|
||||
"folder" = 'fldr',
|
||||
"action" = 'UNKNOWN'
|
||||
WHERE 1 = 1
|
||||
AND "group" = 'gg'
|
||||
|
||||
Vendored
+2
@@ -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'
|
||||
|
||||
+1
@@ -2,6 +2,7 @@ SELECT
|
||||
kv."resource_version",
|
||||
kv."namespace",
|
||||
kv."name",
|
||||
kv."folder",
|
||||
kv."value"
|
||||
FROM "resource_history" as kv
|
||||
INNER JOIN (
|
||||
|
||||
+1
@@ -4,6 +4,7 @@ SELECT
|
||||
"group",
|
||||
"resource",
|
||||
"name",
|
||||
"folder",
|
||||
"value",
|
||||
"action",
|
||||
"previous_resource_version"
|
||||
|
||||
+9
-4
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
+1
@@ -2,6 +2,7 @@ SELECT
|
||||
"resource_version",
|
||||
"namespace",
|
||||
"name",
|
||||
"folder",
|
||||
"value"
|
||||
FROM "resource"
|
||||
WHERE 1 = 1
|
||||
|
||||
+5
@@ -1,4 +1,9 @@
|
||||
SELECT
|
||||
"namespace",
|
||||
"group",
|
||||
"resource",
|
||||
"name",
|
||||
"folder",
|
||||
"resource_version",
|
||||
"value"
|
||||
FROM "resource"
|
||||
|
||||
@@ -2,6 +2,7 @@ UPDATE "resource"
|
||||
SET
|
||||
"guid" = '',
|
||||
"value" = '[]',
|
||||
"folder" = 'fldr',
|
||||
"action" = 'UNKNOWN'
|
||||
WHERE 1 = 1
|
||||
AND "group" = 'gg'
|
||||
|
||||
Reference in New Issue
Block a user