K8s: Remove restore functionality; can be done with list (#102560)
This commit is contained in:
committed by
GitHub
parent
92cc10f983
commit
c33a53a47a
@@ -308,9 +308,6 @@ func (b *backend) WriteEvent(ctx context.Context, event resource.WriteEvent) (in
|
||||
// TODO: validate key ?
|
||||
switch event.Type {
|
||||
case resource.WatchEvent_ADDED:
|
||||
if event.ObjectOld != nil {
|
||||
return b.restore(ctx, event)
|
||||
}
|
||||
return b.create(ctx, event)
|
||||
case resource.WatchEvent_MODIFIED:
|
||||
return b.update(ctx, event)
|
||||
@@ -488,73 +485,6 @@ func (b *backend) delete(ctx context.Context, event resource.WriteEvent) (int64,
|
||||
return rv, nil
|
||||
}
|
||||
|
||||
func (b *backend) restore(ctx context.Context, event resource.WriteEvent) (int64, error) {
|
||||
ctx, span := b.tracer.Start(ctx, tracePrefix+"Restore")
|
||||
defer span.End()
|
||||
guid := uuid.New().String()
|
||||
folder := ""
|
||||
if event.Object != nil {
|
||||
folder = event.Object.GetFolder()
|
||||
}
|
||||
rv, err := b.rvManager.ExecWithRV(ctx, event.Key, func(tx db.Tx) (string, error) {
|
||||
// 1. Re-create resource
|
||||
// Note: we may want to replace the write event with a create event, tbd.
|
||||
if _, err := dbutil.Exec(ctx, tx, sqlResourceInsert, sqlResourceRequest{
|
||||
SQLTemplate: sqltemplate.New(b.dialect),
|
||||
WriteEvent: event,
|
||||
Folder: folder,
|
||||
GUID: guid,
|
||||
}); err != nil {
|
||||
return guid, fmt.Errorf("insert into resource: %w", err)
|
||||
}
|
||||
|
||||
// 2. Insert into resource history
|
||||
if _, err := dbutil.Exec(ctx, tx, sqlResourceHistoryInsert, sqlResourceRequest{
|
||||
SQLTemplate: sqltemplate.New(b.dialect),
|
||||
WriteEvent: event,
|
||||
Folder: folder,
|
||||
GUID: guid,
|
||||
}); err != nil {
|
||||
return guid, fmt.Errorf("insert into resource history: %w", err)
|
||||
}
|
||||
_ = b.historyPruner.Add(pruningKey{
|
||||
namespace: event.Key.Namespace,
|
||||
group: event.Key.Group,
|
||||
resource: event.Key.Resource,
|
||||
name: event.Key.Name,
|
||||
})
|
||||
|
||||
// 3. Update all resource history entries with the new UID
|
||||
// Note: we do not update any history entries that have a deletion timestamp included. This will become
|
||||
// important once we start using finalizers, as the initial delete will show up as an update with a deletion timestamp included.
|
||||
if _, err := dbutil.Exec(ctx, tx, sqlResoureceHistoryUpdateUid, sqlResourceHistoryUpdateRequest{
|
||||
SQLTemplate: sqltemplate.New(b.dialect),
|
||||
WriteEvent: event,
|
||||
OldUID: string(event.ObjectOld.GetUID()),
|
||||
NewUID: string(event.Object.GetUID()),
|
||||
}); err != nil {
|
||||
return guid, fmt.Errorf("update history uid: %w", err)
|
||||
}
|
||||
|
||||
return guid, nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
b.notifier.send(ctx, &resource.WrittenEvent{
|
||||
Type: event.Type,
|
||||
Key: event.Key,
|
||||
PreviousRV: event.PreviousRV,
|
||||
Value: event.Value,
|
||||
ResourceVersion: rv,
|
||||
Folder: folder,
|
||||
})
|
||||
|
||||
return rv, nil
|
||||
}
|
||||
|
||||
func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *resource.BackendReadResponse {
|
||||
_, span := b.tracer.Start(ctx, tracePrefix+".Read")
|
||||
defer span.End()
|
||||
@@ -577,17 +507,6 @@ func (b *backend) ReadResource(ctx context.Context, req *resource.ReadRequest) *
|
||||
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)
|
||||
// if not found, look for latest deleted version (if requested)
|
||||
if errors.Is(err, sql.ErrNoRows) && req.IncludeDeleted {
|
||||
sr = sqlResourceHistoryRead
|
||||
readReq2 := &sqlResourceReadRequest{
|
||||
SQLTemplate: sqltemplate.New(b.dialect),
|
||||
Request: req,
|
||||
Response: NewReadResponse(),
|
||||
}
|
||||
res, err = dbutil.QueryRow(ctx, tx, sr, readReq2)
|
||||
return err
|
||||
}
|
||||
return err
|
||||
})
|
||||
|
||||
|
||||
@@ -376,88 +376,6 @@ func TestBackend_delete(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestBackend_restore(t *testing.T) {
|
||||
t.Parallel()
|
||||
meta, err := utils.MetaAccessor(&unstructured.Unstructured{
|
||||
Object: map[string]any{},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
meta.SetUID("new-uid")
|
||||
oldMeta, err := utils.MetaAccessor(&unstructured.Unstructured{
|
||||
Object: map[string]any{},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
oldMeta.SetUID("old-uid")
|
||||
event := resource.WriteEvent{
|
||||
Type: resource.WatchEvent_ADDED,
|
||||
Key: resKey,
|
||||
Object: meta,
|
||||
ObjectOld: oldMeta,
|
||||
}
|
||||
|
||||
t.Run("happy path", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
b, ctx := setupBackendTest(t)
|
||||
|
||||
b.SQLMock.ExpectBegin()
|
||||
expectSuccessfulResourceVersionExec(t, b.TestDBProvider,
|
||||
func() { b.ExecWithResult("insert resource", 0, 1) },
|
||||
func() { b.ExecWithResult("insert resource_history", 0, 1) },
|
||||
func() { b.ExecWithResult("update resource_history", 0, 1) },
|
||||
)
|
||||
b.SQLMock.ExpectCommit()
|
||||
|
||||
v, err := b.restore(ctx, event)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(200), v)
|
||||
})
|
||||
|
||||
t.Run("error restoring resource", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
b, ctx := setupBackendTest(t)
|
||||
|
||||
b.SQLMock.ExpectBegin()
|
||||
b.ExecWithErr("insert resource", errTest)
|
||||
b.SQLMock.ExpectRollback()
|
||||
|
||||
v, err := b.restore(ctx, event)
|
||||
require.Zero(t, v)
|
||||
require.Error(t, err)
|
||||
require.ErrorContains(t, err, "insert into resource")
|
||||
})
|
||||
|
||||
t.Run("error inserting into resource history", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
b, ctx := setupBackendTest(t)
|
||||
|
||||
b.SQLMock.ExpectBegin()
|
||||
b.ExecWithResult("insert resource", 0, 1)
|
||||
b.ExecWithErr("insert resource_history", errTest)
|
||||
b.SQLMock.ExpectRollback()
|
||||
|
||||
v, err := b.restore(ctx, event)
|
||||
require.Zero(t, v)
|
||||
require.Error(t, err)
|
||||
require.ErrorContains(t, err, "insert into resource history")
|
||||
})
|
||||
|
||||
t.Run("error updating resource history uid", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
b, ctx := setupBackendTest(t)
|
||||
|
||||
b.SQLMock.ExpectBegin()
|
||||
b.ExecWithResult("insert resource", 0, 1)
|
||||
b.ExecWithResult("insert resource_history", 0, 1)
|
||||
b.ExecWithErr("update resource_history", errTest)
|
||||
b.SQLMock.ExpectRollback()
|
||||
|
||||
v, err := b.restore(ctx, event)
|
||||
require.Zero(t, v)
|
||||
require.Error(t, err)
|
||||
require.ErrorContains(t, err, "update history uid")
|
||||
})
|
||||
}
|
||||
|
||||
func TestBackend_getHistory(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
@@ -14,12 +14,8 @@ SELECT
|
||||
AND {{ .Ident "group" }} = {{ .Arg .Request.Key.Group }}
|
||||
AND {{ .Ident "resource" }} = {{ .Arg .Request.Key.Resource }}
|
||||
AND {{ .Ident "name" }} = {{ .Arg .Request.Key.Name }}
|
||||
{{ if .Request.IncludeDeleted }}
|
||||
AND {{ .Ident "action" }} != 3
|
||||
AND {{ .Ident "value" }} NOT LIKE '%deletionTimestamp%'
|
||||
{{ end }}
|
||||
{{ if gt .Request.ResourceVersion 0 }}
|
||||
AND {{ .Ident "resource_version" }} {{ if .Request.IncludeDeleted }}={{ else }}<={{ end }} {{ .Arg .Request.ResourceVersion }}
|
||||
AND {{ .Ident "resource_version" }} <= {{ .Arg .Request.ResourceVersion }}
|
||||
{{ end }}
|
||||
ORDER BY {{ .Ident "resource_version" }} DESC
|
||||
LIMIT 1
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
UPDATE {{ .Ident "resource_history" }}
|
||||
SET {{ .Ident "value" }} = REPLACE({{ .Ident "value" }}, CONCAT('"uid":"', {{ .Arg .OldUID }}, '"'), CONCAT('"uid":"', {{ .Arg .NewUID }}, '"'))
|
||||
WHERE {{ .Ident "name" }} = {{ .Arg .WriteEvent.Key.Name }}
|
||||
AND {{ .Ident "namespace" }} = {{ .Arg .WriteEvent.Key.Namespace }}
|
||||
AND {{ .Ident "group" }} = {{ .Arg .WriteEvent.Key.Group }}
|
||||
AND {{ .Ident "resource" }} = {{ .Arg .WriteEvent.Key.Resource }}
|
||||
AND {{ .Ident "action" }} != 3
|
||||
AND {{ .Ident "value" }} NOT LIKE '%deletionTimestamp%';
|
||||
@@ -39,7 +39,6 @@ var (
|
||||
sqlResourceUpdateRV = mustTemplate("resource_update_rv.sql")
|
||||
sqlResourceHistoryRead = mustTemplate("resource_history_read.sql")
|
||||
sqlResourceHistoryUpdateRV = mustTemplate("resource_history_update_rv.sql")
|
||||
sqlResoureceHistoryUpdateUid = mustTemplate("resource_history_update_uid.sql")
|
||||
sqlResourceHistoryInsert = mustTemplate("resource_history_insert.sql")
|
||||
sqlResourceHistoryPoll = mustTemplate("resource_history_poll.sql")
|
||||
sqlResourceHistoryGet = mustTemplate("resource_history_get.sql")
|
||||
@@ -281,19 +280,6 @@ func (r *sqlPruneHistoryRequest) Validate() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// update resource history
|
||||
|
||||
type sqlResourceHistoryUpdateRequest struct {
|
||||
sqltemplate.SQLTemplate
|
||||
WriteEvent resource.WriteEvent
|
||||
OldUID string
|
||||
NewUID string
|
||||
}
|
||||
|
||||
func (r sqlResourceHistoryUpdateRequest) Validate() error {
|
||||
return nil // TODO
|
||||
}
|
||||
|
||||
type sqlResourceBlobInsertRequest struct {
|
||||
sqltemplate.SQLTemplate
|
||||
Now time.Time
|
||||
|
||||
@@ -176,26 +176,6 @@ func TestUnifiedStorageQueries(t *testing.T) {
|
||||
},
|
||||
},
|
||||
|
||||
sqlResoureceHistoryUpdateUid: {
|
||||
{
|
||||
Name: "modify uids in history",
|
||||
Data: &sqlResourceHistoryUpdateRequest{
|
||||
SQLTemplate: mocks.NewTestingSQLTemplate(),
|
||||
WriteEvent: resource.WriteEvent{
|
||||
Key: &resource.ResourceKey{
|
||||
Namespace: "nn",
|
||||
Group: "gg",
|
||||
Resource: "rr",
|
||||
Name: "name",
|
||||
},
|
||||
PreviousRV: 1234,
|
||||
},
|
||||
OldUID: "old-uid",
|
||||
NewUID: "new-uid",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
sqlResourceHistoryInsert: {
|
||||
{
|
||||
Name: "insert into resource_history",
|
||||
|
||||
Vendored
-8
@@ -1,8 +0,0 @@
|
||||
UPDATE `resource_history`
|
||||
SET `value` = REPLACE(`value`, CONCAT('"uid":"', 'old-uid', '"'), CONCAT('"uid":"', 'new-uid', '"'))
|
||||
WHERE `name` = 'name'
|
||||
AND `namespace` = 'nn'
|
||||
AND `group` = 'gg'
|
||||
AND `resource` = 'rr'
|
||||
AND `action` != 3
|
||||
AND `value` NOT LIKE '%deletionTimestamp%';
|
||||
Vendored
-8
@@ -1,8 +0,0 @@
|
||||
UPDATE "resource_history"
|
||||
SET "value" = REPLACE("value", CONCAT('"uid":"', 'old-uid', '"'), CONCAT('"uid":"', 'new-uid', '"'))
|
||||
WHERE "name" = 'name'
|
||||
AND "namespace" = 'nn'
|
||||
AND "group" = 'gg'
|
||||
AND "resource" = 'rr'
|
||||
AND "action" != 3
|
||||
AND "value" NOT LIKE '%deletionTimestamp%';
|
||||
Vendored
-8
@@ -1,8 +0,0 @@
|
||||
UPDATE "resource_history"
|
||||
SET "value" = REPLACE("value", CONCAT('"uid":"', 'old-uid', '"'), CONCAT('"uid":"', 'new-uid', '"'))
|
||||
WHERE "name" = 'name'
|
||||
AND "namespace" = 'nn'
|
||||
AND "group" = 'gg'
|
||||
AND "resource" = 'rr'
|
||||
AND "action" != 3
|
||||
AND "value" NOT LIKE '%deletionTimestamp%';
|
||||
Reference in New Issue
Block a user