Merge pull request #6547 from reasonerjt/del-moved-snapshot

Delete moved snapshots when the backup is deleted
This commit is contained in:
Xun Jiang/Bruce Jiang
2023-07-27 15:10:33 +08:00
committed by GitHub
10 changed files with 257 additions and 11 deletions
@@ -22,6 +22,11 @@ import (
"fmt"
"time"
corev1 "k8s.io/api/core/v1"
velerov2alpha1 "github.com/vmware-tanzu/velero/pkg/apis/velero/v2alpha1"
"github.com/vmware-tanzu/velero/pkg/util/boolptr"
jsonpatch "github.com/evanphx/json-patch"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
@@ -315,6 +320,33 @@ func (r *backupDeletionReconciler) Reconcile(ctx context.Context, req ctrl.Reque
}
}
if boolptr.IsSetToTrue(backup.Spec.SnapshotMoveData) {
log.Info("Removing snapshot data by data mover")
if deleteErrs := r.deleteMovedSnapshots(ctx, backup); len(deleteErrs) > 0 {
for _, err := range deleteErrs {
errs = append(errs, err.Error())
}
}
duList := &velerov2alpha1.DataUploadList{}
log.Info("Removing local datauploads")
if err := r.Client.List(ctx, duList, &client.ListOptions{
Namespace: backup.Namespace,
LabelSelector: labels.SelectorFromSet(map[string]string{
velerov1api.BackupNameLabel: label.GetValidName(backup.Name),
}),
}); err != nil {
log.WithError(err).Error("Error listing datauploads")
errs = append(errs, err.Error())
} else {
for i := range duList.Items {
du := duList.Items[i]
if err := r.Delete(ctx, &du); err != nil {
errs = append(errs, err.Error())
}
}
}
}
if backupStore != nil {
log.Info("Removing backup from backup storage")
if err := backupStore.DeleteBackup(backup.Name); err != nil {
@@ -470,6 +502,41 @@ func (r *backupDeletionReconciler) deletePodVolumeSnapshots(ctx context.Context,
return errs
}
func (r *backupDeletionReconciler) deleteMovedSnapshots(ctx context.Context, backup *velerov1api.Backup) []error {
if r.repoMgr == nil {
return nil
}
list := &corev1.ConfigMapList{}
if err := r.Client.List(ctx, list, &client.ListOptions{
Namespace: backup.Namespace,
LabelSelector: labels.SelectorFromSet(
map[string]string{
velerov1api.BackupNameLabel: label.GetValidName(backup.Name),
velerov1api.DataUploadSnapshotInfoLabel: "true",
}),
}); err != nil {
return []error{errors.Wrapf(err, "failed to retrieve config for snapshot info")}
}
var errs []error
for i := range list.Items {
cm := list.Items[i]
snapshot := repository.SnapshotIdentifier{}
b, _ := json.Marshal(cm.Data)
if err := json.Unmarshal(b, &snapshot); err != nil {
errs = append(errs, errors.Wrapf(err, "failed to unmarshal snapshot info"))
continue
}
if err := r.repoMgr.Forget(ctx, snapshot); err != nil {
errs = append(errs, errors.Wrapf(err, "failed to delete snapshot %s, namespace: %s", snapshot.SnapshotID, snapshot.VolumeNamespace))
}
r.logger.Infof("Deleted snapshot %s, namespace: %s, repo type: %s", snapshot.SnapshotID, snapshot.VolumeNamespace, snapshot.RepositoryType)
if err := r.Client.Delete(ctx, &cm); err != nil {
r.logger.Warnf("Failed to delete snapshot info configmap %s/%s: %v", cm.Namespace, cm.Name, err)
}
}
return errs
}
func (r *backupDeletionReconciler) patchDeleteBackupRequest(ctx context.Context, req *velerov1api.DeleteBackupRequest, mutate func(*velerov1api.DeleteBackupRequest)) (*velerov1api.DeleteBackupRequest, error) {
original := req.DeepCopy()
mutate(req)
+1 -1
View File
@@ -109,7 +109,7 @@ func (r *DataDownloadReconciler) Reconcile(ctx context.Context, req ctrl.Request
return ctrl.Result{}, err
}
if dd.Spec.DataMover != "" && dd.Spec.DataMover != dataMoverType {
if !datamover.IsBuiltInUploader(dd.Spec.DataMover) {
log.WithField("data mover", dd.Spec.DataMover).Info("it is not one built-in data mover which is not supported by Velero")
return ctrl.Result{}, nil
}
+5 -5
View File
@@ -53,10 +53,10 @@ import (
"github.com/vmware-tanzu/velero/pkg/util/kube"
)
const dataMoverType string = "velero"
const dataUploadDownloadRequestor string = "snapshot-data-upload-download"
const preparingMonitorFrequency time.Duration = time.Minute
const (
dataUploadDownloadRequestor string = "snapshot-data-upload-download"
preparingMonitorFrequency time.Duration = time.Minute
)
// DataUploadReconciler reconciles a DataUpload object
type DataUploadReconciler struct {
@@ -116,7 +116,7 @@ func (r *DataUploadReconciler) Reconcile(ctx context.Context, req ctrl.Request)
return ctrl.Result{}, errors.Wrap(err, "getting DataUpload")
}
if du.Spec.DataMover != "" && du.Spec.DataMover != dataMoverType {
if !datamover.IsBuiltInUploader(du.Spec.DataMover) {
log.WithField("Data mover", du.Spec.DataMover).Debug("it is not one built-in data mover which is not supported by Velero")
return ctrl.Result{}, nil
}