@@ -20,7 +20,9 @@ import (
20
20
"context"
21
21
"time"
22
22
23
+ snapshotv1api "github.com/kubernetes-csi/external-snapshotter/client/v4/apis/volumesnapshot/v1"
23
24
snapshotterClientSet "github.com/kubernetes-csi/external-snapshotter/client/v4/clientset/versioned"
25
+ snapshotv1listers "github.com/kubernetes-csi/external-snapshotter/client/v4/listers/volumesnapshot/v1"
24
26
"github.com/pkg/errors"
25
27
"github.com/sirupsen/logrus"
26
28
kuberrs "k8s.io/apimachinery/pkg/api/errors"
@@ -29,6 +31,8 @@ import (
29
31
"k8s.io/apimachinery/pkg/util/sets"
30
32
"k8s.io/client-go/kubernetes"
31
33
34
+ "github.com/vmware-tanzu/velero/pkg/util/kube"
35
+
32
36
"github.com/vmware-tanzu/velero/internal/storage"
33
37
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
34
38
"github.com/vmware-tanzu/velero/pkg/features"
@@ -48,6 +52,7 @@ type backupSyncController struct {
48
52
kbClient client.Client
49
53
podVolumeBackupClient velerov1client.PodVolumeBackupsGetter
50
54
backupLister velerov1listers.BackupLister
55
+ csiVSLister snapshotv1listers.VolumeSnapshotLister
51
56
csiSnapshotClient * snapshotterClientSet.Clientset
52
57
kubeClient kubernetes.Interface
53
58
namespace string
@@ -62,6 +67,7 @@ func NewBackupSyncController(
62
67
kbClient client.Client ,
63
68
podVolumeBackupClient velerov1client.PodVolumeBackupsGetter ,
64
69
backupLister velerov1listers.BackupLister ,
70
+ csiVSLister snapshotv1listers.VolumeSnapshotLister ,
65
71
syncPeriod time.Duration ,
66
72
namespace string ,
67
73
csiSnapshotClient * snapshotterClientSet.Clientset ,
@@ -85,6 +91,7 @@ func NewBackupSyncController(
85
91
defaultBackupLocation : defaultBackupLocation ,
86
92
defaultBackupSyncPeriod : syncPeriod ,
87
93
backupLister : backupLister ,
94
+ csiVSLister : csiVSLister ,
88
95
csiSnapshotClient : csiSnapshotClient ,
89
96
kubeClient : kubeClient ,
90
97
@@ -358,11 +365,34 @@ func (c *backupSyncController) deleteOrphanedBackups(locationName string, backup
358
365
if backup .Status .Phase != velerov1api .BackupPhaseCompleted || backupStoreBackups .Has (backup .Name ) {
359
366
continue
360
367
}
361
-
362
368
if err := c .backupClient .Backups (backup .Namespace ).Delete (context .TODO (), backup .Name , metav1.DeleteOptions {}); err != nil {
363
369
log .WithError (errors .WithStack (err )).Error ("Error deleting orphaned backup from cluster" )
364
370
} else {
365
371
log .Debug ("Deleted orphaned backup from cluster" )
372
+ c .deleteCSISnapshotsByBackup (backup .Name , log )
373
+ }
374
+ }
375
+ }
376
+
377
+ func (c * backupSyncController ) deleteCSISnapshotsByBackup (backupName string , log logrus.FieldLogger ) {
378
+ if ! features .IsEnabled (velerov1api .CSIFeatureFlag ) {
379
+ return
380
+ }
381
+ m := client.MatchingLabels {velerov1api .BackupNameLabel : label .GetValidName (backupName )}
382
+ if vsList , err := c .csiVSLister .List (label .NewSelectorForBackup (label .GetValidName (backupName ))); err != nil {
383
+ log .WithError (err ).Warnf ("Failed to list volumesnapshots for backup: %s, the deletion will be skipped" , backupName )
384
+ } else {
385
+ for _ , vs := range vsList {
386
+ name := kube .NamespaceAndName (vs .GetObjectMeta ())
387
+ log .Debugf ("Deleting volumesnapshot %s" , name )
388
+ if err := c .kbClient .Delete (context .TODO (), vs ); err != nil {
389
+ log .WithError (err ).Warnf ("Failed to delete volumesnapshot %s" , name )
390
+ }
366
391
}
367
392
}
393
+ vsc := & snapshotv1api.VolumeSnapshotContent {}
394
+ log .Debugf ("Deleting volumesnapshotcontents for backup: %s" , backupName )
395
+ if err := c .kbClient .DeleteAllOf (context .TODO (), vsc , m ); err != nil {
396
+ log .WithError (err ).Warnf ("Failed to delete volumesnapshotcontents for backup: %s" , backupName )
397
+ }
368
398
}
0 commit comments