From 9e140fd0ed7d8da118dc998bf3dbdfd200514641 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 7 Jul 2023 22:18:10 +0800 Subject: [PATCH] Return PVC intactly when CSI is not present in PVC spec to avoid deleting useful annocations. Signed-off-by: Xun Jiang --- internal/restore/pvc_action.go | 18 ++++++++++-------- internal/restore/pvc_action_test.go | 8 ++++++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/internal/restore/pvc_action.go b/internal/restore/pvc_action.go index 8a4fa437..9b4b2a9b 100644 --- a/internal/restore/pvc_action.go +++ b/internal/restore/pvc_action.go @@ -167,7 +167,15 @@ func (p *PVCRestoreItemAction) Execute(input *velero.RestoreItemActionExecuteInp } logger.Infof("DataDownload %s/%s is created successfully.", dataDownload.Namespace, dataDownload.Name) } else { - if err := restoreFromVolumeSnapshot(&pvc, p.SnapshotClient, logger); err != nil { + volumeSnapshotName, ok := pvc.Annotations[util.VolumeSnapshotLabel] + if !ok { + logger.Info("Skipping PVCRestoreItemAction for PVC , PVC does not have a CSI volumesnapshot.") + // Make no change in the input PVC. + return &velero.RestoreItemActionExecuteOutput{ + UpdatedItem: input.Item, + }, nil + } + if err := restoreFromVolumeSnapshot(&pvc, p.SnapshotClient, volumeSnapshotName, logger); err != nil { logger.Errorf("Failed to restore PVC from VolumeSnapshot.") return nil, errors.WithStack(err) } @@ -385,13 +393,7 @@ func newDataDownload(restore *velerov1api.Restore, dataUploadResult *velerov2alp } func restoreFromVolumeSnapshot(pvc *corev1api.PersistentVolumeClaim, snapClient snapshotterClientSet.Interface, - logger logrus.FieldLogger) error { - volumeSnapshotName, ok := pvc.Annotations[util.VolumeSnapshotLabel] - if !ok { - logger.Info("Skipping PVCRestoreItemAction for PVC , PVC does not have a CSI volumesnapshot.") - return nil - } - + volumeSnapshotName string, logger logrus.FieldLogger) error { vs, err := snapClient.SnapshotV1().VolumeSnapshots(pvc.Namespace).Get(context.TODO(), volumeSnapshotName, metav1.GetOptions{}) if err != nil { return errors.Wrapf(err, fmt.Sprintf("Failed to get Volumesnapshot %s/%s to restore PVC %s/%s", pvc.Namespace, volumeSnapshotName, pvc.Namespace, pvc.Name)) diff --git a/internal/restore/pvc_action_test.go b/internal/restore/pvc_action_test.go index 98424226..4c89551c 100644 --- a/internal/restore/pvc_action_test.go +++ b/internal/restore/pvc_action_test.go @@ -566,6 +566,14 @@ func TestExecute(t *testing.T) { vs: builder.ForVolumeSnapshot("velero", "testVS").ObjectMeta(builder.WithAnnotations(util.VolumeSnapshotRestoreSize, "10Gi")).Result(), expectedPVC: builder.ForPersistentVolumeClaim("velero", "testPVC").ObjectMeta(builder.WithAnnotations("velero.io/volume-snapshot-name", "testVS")).Result(), }, + { + name: "Restore from VolumeSnapshot without volume-snapshot-name annotation", + backup: builder.ForBackup("velero", "testBackup").Result(), + restore: builder.ForRestore("velero", "testRestore").Backup("testBackup").Result(), + pvc: builder.ForPersistentVolumeClaim("velero", "testPVC").ObjectMeta(builder.WithAnnotations(AnnSelectedNode, "node1")).Result(), + vs: builder.ForVolumeSnapshot("velero", "testVS").ObjectMeta(builder.WithAnnotations(util.VolumeSnapshotRestoreSize, "10Gi")).Result(), + expectedPVC: builder.ForPersistentVolumeClaim("velero", "testPVC").ObjectMeta(builder.WithAnnotations(AnnSelectedNode, "node1")).Result(), + }, { name: "DataUploadResult cannot be found", backup: builder.ForBackup("velero", "testBackup").SnapshotMoveData(true).Result(),