2018-03-14 18:17:27 +00:00
/ *
2020-08-21 00:24:29 +00:00
Copyright 2020 the Velero contributors .
2018-03-14 18:17:27 +00:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package controller
import (
2018-06-22 19:07:23 +00:00
"context"
2018-03-14 18:17:27 +00:00
"encoding/json"
2019-05-29 18:21:25 +00:00
"fmt"
2018-04-04 15:27:33 +00:00
"time"
2018-03-14 18:17:27 +00:00
2019-05-29 18:21:25 +00:00
jsonpatch "github.com/evanphx/json-patch"
2020-05-01 20:05:20 +00:00
snapshotterClientSet "github.com/kubernetes-csi/external-snapshotter/v2/pkg/client/clientset/versioned"
snapshotter "github.com/kubernetes-csi/external-snapshotter/v2/pkg/client/clientset/versioned/typed/volumesnapshot/v1beta1"
snapshotv1beta1listers "github.com/kubernetes-csi/external-snapshotter/v2/pkg/client/listers/volumesnapshot/v1beta1"
2018-10-23 14:36:11 +00:00
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/clock"
kubeerrs "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/client-go/tools/cache"
2020-08-21 00:24:29 +00:00
"github.com/vmware-tanzu/velero/internal/delete"
2020-05-01 20:05:20 +00:00
velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1"
2019-09-30 21:26:56 +00:00
pkgbackup "github.com/vmware-tanzu/velero/pkg/backup"
2020-08-21 00:24:29 +00:00
"github.com/vmware-tanzu/velero/pkg/discovery"
2020-05-01 20:05:20 +00:00
"github.com/vmware-tanzu/velero/pkg/features"
2019-09-30 21:26:56 +00:00
velerov1client "github.com/vmware-tanzu/velero/pkg/generated/clientset/versioned/typed/velero/v1"
2020-02-25 20:01:24 +00:00
velerov1informers "github.com/vmware-tanzu/velero/pkg/generated/informers/externalversions/velero/v1"
velerov1listers "github.com/vmware-tanzu/velero/pkg/generated/listers/velero/v1"
2019-09-30 21:26:56 +00:00
"github.com/vmware-tanzu/velero/pkg/label"
"github.com/vmware-tanzu/velero/pkg/metrics"
"github.com/vmware-tanzu/velero/pkg/persistence"
"github.com/vmware-tanzu/velero/pkg/plugin/clientmgmt"
"github.com/vmware-tanzu/velero/pkg/plugin/velero"
"github.com/vmware-tanzu/velero/pkg/restic"
2020-08-21 00:24:29 +00:00
"github.com/vmware-tanzu/velero/pkg/util/filesystem"
2019-09-30 21:26:56 +00:00
"github.com/vmware-tanzu/velero/pkg/util/kube"
2020-06-24 16:55:18 +00:00
"sigs.k8s.io/controller-runtime/pkg/client"
2018-03-14 18:17:27 +00:00
)
2018-06-22 19:07:23 +00:00
const resticTimeout = time . Minute
2018-03-14 18:17:27 +00:00
type backupDeletionController struct {
* genericController
2019-01-25 03:33:07 +00:00
deleteBackupRequestClient velerov1client . DeleteBackupRequestsGetter
2020-02-25 20:01:24 +00:00
deleteBackupRequestLister velerov1listers . DeleteBackupRequestLister
2019-01-25 03:33:07 +00:00
backupClient velerov1client . BackupsGetter
2020-02-25 20:01:24 +00:00
restoreLister velerov1listers . RestoreLister
2019-01-25 03:33:07 +00:00
restoreClient velerov1client . RestoresGetter
2018-04-06 17:08:39 +00:00
backupTracker BackupTracker
2018-02-28 01:35:35 +00:00
resticMgr restic . RepositoryManager
2020-02-25 20:01:24 +00:00
podvolumeBackupLister velerov1listers . PodVolumeBackupLister
2020-06-24 16:55:18 +00:00
kbClient client . Client
2020-02-25 20:01:24 +00:00
snapshotLocationLister velerov1listers . VolumeSnapshotLocationLister
2020-05-01 20:05:20 +00:00
csiSnapshotLister snapshotv1beta1listers . VolumeSnapshotLister
2020-05-04 19:41:27 +00:00
csiSnapshotContentLister snapshotv1beta1listers . VolumeSnapshotContentLister
2020-05-01 20:05:20 +00:00
csiSnapshotClient * snapshotterClientSet . Clientset
processRequestFunc func ( * velerov1api . DeleteBackupRequest ) error
2018-08-15 23:27:27 +00:00
clock clock . Clock
2019-03-15 18:32:11 +00:00
newPluginManager func ( logrus . FieldLogger ) clientmgmt . Manager
2020-05-01 20:05:20 +00:00
newBackupStore func ( * velerov1api . BackupStorageLocation , persistence . ObjectStoreGetter , logrus . FieldLogger ) ( persistence . BackupStore , error )
2019-04-04 18:25:59 +00:00
metrics * metrics . ServerMetrics
2020-08-21 00:24:29 +00:00
helper discovery . Helper
2018-03-14 18:17:27 +00:00
}
// NewBackupDeletionController creates a new backup deletion controller.
func NewBackupDeletionController (
logger logrus . FieldLogger ,
2020-02-25 20:01:24 +00:00
deleteBackupRequestInformer velerov1informers . DeleteBackupRequestInformer ,
2019-01-25 03:33:07 +00:00
deleteBackupRequestClient velerov1client . DeleteBackupRequestsGetter ,
backupClient velerov1client . BackupsGetter ,
2020-02-25 20:01:24 +00:00
restoreLister velerov1listers . RestoreLister ,
2019-01-25 03:33:07 +00:00
restoreClient velerov1client . RestoresGetter ,
2018-04-06 17:08:39 +00:00
backupTracker BackupTracker ,
2018-02-28 01:35:35 +00:00
resticMgr restic . RepositoryManager ,
2020-02-25 20:01:24 +00:00
podvolumeBackupLister velerov1listers . PodVolumeBackupLister ,
2020-06-24 16:55:18 +00:00
kbClient client . Client ,
2020-02-25 20:01:24 +00:00
snapshotLocationLister velerov1listers . VolumeSnapshotLocationLister ,
2020-05-01 20:05:20 +00:00
csiSnapshotLister snapshotv1beta1listers . VolumeSnapshotLister ,
2020-05-04 19:41:27 +00:00
csiSnapshotContentLister snapshotv1beta1listers . VolumeSnapshotContentLister ,
2020-05-01 20:05:20 +00:00
csiSnapshotClient * snapshotterClientSet . Clientset ,
2019-03-15 18:32:11 +00:00
newPluginManager func ( logrus . FieldLogger ) clientmgmt . Manager ,
2019-04-04 18:25:59 +00:00
metrics * metrics . ServerMetrics ,
2020-08-21 00:24:29 +00:00
helper discovery . Helper ,
2018-03-14 18:17:27 +00:00
) Interface {
c := & backupDeletionController {
2020-10-06 17:58:56 +00:00
genericController : newGenericController ( BackupDeletion , logger ) ,
2018-03-14 18:17:27 +00:00
deleteBackupRequestClient : deleteBackupRequestClient ,
deleteBackupRequestLister : deleteBackupRequestInformer . Lister ( ) ,
backupClient : backupClient ,
2020-02-25 20:01:24 +00:00
restoreLister : restoreLister ,
2018-03-14 18:17:27 +00:00
restoreClient : restoreClient ,
2018-04-06 17:08:39 +00:00
backupTracker : backupTracker ,
2018-02-28 01:35:35 +00:00
resticMgr : resticMgr ,
2020-02-25 20:01:24 +00:00
podvolumeBackupLister : podvolumeBackupLister ,
2020-06-24 16:55:18 +00:00
kbClient : kbClient ,
2020-02-25 20:01:24 +00:00
snapshotLocationLister : snapshotLocationLister ,
2020-05-01 20:05:20 +00:00
csiSnapshotLister : csiSnapshotLister ,
2020-05-04 19:41:27 +00:00
csiSnapshotContentLister : csiSnapshotContentLister ,
2020-05-01 20:05:20 +00:00
csiSnapshotClient : csiSnapshotClient ,
2019-04-04 18:25:59 +00:00
metrics : metrics ,
2020-08-21 00:24:29 +00:00
helper : helper ,
2018-08-15 23:27:27 +00:00
// use variables to refer to these functions so they can be
// replaced with fakes for testing.
2018-08-25 19:53:56 +00:00
newPluginManager : newPluginManager ,
2018-08-20 23:29:54 +00:00
newBackupStore : persistence . NewObjectBackupStore ,
2018-05-13 13:28:09 +00:00
2018-08-15 23:27:27 +00:00
clock : & clock . RealClock { } ,
2018-03-14 18:17:27 +00:00
}
c . syncHandler = c . processQueueItem
c . processRequestFunc = c . processRequest
deleteBackupRequestInformer . Informer ( ) . AddEventHandler (
cache . ResourceEventHandlerFuncs {
2018-07-19 23:06:12 +00:00
AddFunc : c . enqueue ,
2018-03-14 18:17:27 +00:00
} ,
)
2018-04-04 15:27:33 +00:00
c . resyncPeriod = time . Hour
c . resyncFunc = c . deleteExpiredRequests
2018-03-14 18:17:27 +00:00
return c
}
func ( c * backupDeletionController ) processQueueItem ( key string ) error {
log := c . logger . WithField ( "key" , key )
log . Debug ( "Running processItem" )
ns , name , err := cache . SplitMetaNamespaceKey ( key )
if err != nil {
return errors . Wrap ( err , "error splitting queue key" )
}
req , err := c . deleteBackupRequestLister . DeleteBackupRequests ( ns ) . Get ( name )
if apierrors . IsNotFound ( err ) {
log . Debug ( "Unable to find DeleteBackupRequest" )
return nil
}
if err != nil {
return errors . Wrap ( err , "error getting DeleteBackupRequest" )
}
switch req . Status . Phase {
2020-05-01 20:05:20 +00:00
case velerov1api . DeleteBackupRequestPhaseProcessed :
2018-03-14 18:17:27 +00:00
// Don't do anything because it's already been processed
default :
// Don't mutate the shared cache
reqCopy := req . DeepCopy ( )
return c . processRequestFunc ( reqCopy )
}
return nil
}
2020-05-01 20:05:20 +00:00
func ( c * backupDeletionController ) processRequest ( req * velerov1api . DeleteBackupRequest ) error {
2018-03-14 18:17:27 +00:00
log := c . logger . WithFields ( logrus . Fields {
"namespace" : req . Namespace ,
"name" : req . Name ,
"backup" : req . Spec . BackupName ,
} )
2018-04-06 17:08:39 +00:00
var err error
2018-04-05 19:38:44 +00:00
// Make sure we have the backup name
2018-04-05 18:53:10 +00:00
if req . Spec . BackupName == "" {
2020-05-01 20:05:20 +00:00
_ , err = c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseProcessed
2018-04-05 18:53:10 +00:00
r . Status . Errors = [ ] string { "spec.backupName is required" }
} )
return err
}
2018-07-19 23:06:12 +00:00
// Remove any existing deletion requests for this backup so we only have
// one at a time
if errs := c . deleteExistingDeletionRequests ( req , log ) ; errs != nil {
return kubeerrs . NewAggregate ( errs )
}
2018-04-06 17:08:39 +00:00
// Don't allow deleting an in-progress backup
if c . backupTracker . Contains ( req . Namespace , req . Spec . BackupName ) {
2020-05-01 20:05:20 +00:00
_ , err = c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseProcessed
2018-04-06 17:08:39 +00:00
r . Status . Errors = [ ] string { "backup is still in progress" }
} )
return err
}
2018-03-14 18:17:27 +00:00
// Get the backup we're trying to delete
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
backup , err := c . backupClient . Backups ( req . Namespace ) . Get ( context . TODO ( ) , req . Spec . BackupName , metav1 . GetOptions { } )
2018-03-14 18:17:27 +00:00
if apierrors . IsNotFound ( err ) {
// Couldn't find backup - update status to Processed and record the not-found error
2020-05-01 20:05:20 +00:00
req , err = c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseProcessed
2018-03-14 18:17:27 +00:00
r . Status . Errors = [ ] string { "backup not found" }
} )
return err
}
if err != nil {
2019-05-29 18:21:25 +00:00
return errors . Wrap ( err , "error getting backup" )
}
// Don't allow deleting backups in read-only storage locations
2020-06-24 16:55:18 +00:00
location := & velerov1api . BackupStorageLocation { }
if err := c . kbClient . Get ( context . Background ( ) , client . ObjectKey {
Namespace : backup . Namespace ,
Name : backup . Spec . StorageLocation ,
} , location ) ; err != nil {
if apierrors . IsNotFound ( err ) {
_ , err := c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseProcessed
r . Status . Errors = append ( r . Status . Errors , fmt . Sprintf ( "backup storage location %s not found" , backup . Spec . StorageLocation ) )
} )
return err
}
2019-05-29 18:21:25 +00:00
return errors . Wrap ( err , "error getting backup storage location" )
}
2020-05-01 20:05:20 +00:00
if location . Spec . AccessMode == velerov1api . BackupStorageLocationAccessModeReadOnly {
_ , err := c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseProcessed
2019-05-29 18:21:25 +00:00
r . Status . Errors = append ( r . Status . Errors , fmt . Sprintf ( "cannot delete backup because backup storage location %s is currently in read-only mode" , location . Name ) )
} )
return err
}
2019-06-10 17:04:52 +00:00
// if the request object has no labels defined, initialise an empty map since
// we will be updating labels
if req . Labels == nil {
req . Labels = map [ string ] string { }
}
2019-05-29 18:21:25 +00:00
// Update status to InProgress and set backup-name label if needed
2020-05-01 20:05:20 +00:00
req , err = c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseInProgress
2019-05-29 18:21:25 +00:00
2020-05-01 20:05:20 +00:00
if req . Labels [ velerov1api . BackupNameLabel ] == "" {
req . Labels [ velerov1api . BackupNameLabel ] = label . GetValidName ( req . Spec . BackupName )
2019-05-29 18:21:25 +00:00
}
} )
if err != nil {
return err
2018-03-14 18:17:27 +00:00
}
2018-04-05 19:38:44 +00:00
// Set backup-uid label if needed
2020-05-01 20:05:20 +00:00
if req . Labels [ velerov1api . BackupUIDLabel ] == "" {
req , err = c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
req . Labels [ velerov1api . BackupUIDLabel ] = string ( backup . UID )
2018-04-05 19:38:44 +00:00
} )
if err != nil {
return err
}
}
2018-03-14 18:17:27 +00:00
// Set backup status to Deleting
2020-05-01 20:05:20 +00:00
backup , err = c . patchBackup ( backup , func ( b * velerov1api . Backup ) {
b . Status . Phase = velerov1api . BackupPhaseDeleting
2018-03-14 18:17:27 +00:00
} )
if err != nil {
log . WithError ( errors . WithStack ( err ) ) . Error ( "Error setting backup phase to deleting" )
2018-05-17 15:37:08 +00:00
return err
2018-03-14 18:17:27 +00:00
}
2020-05-01 20:05:20 +00:00
backupScheduleName := backup . GetLabels ( ) [ velerov1api . ScheduleNameLabel ]
2019-04-04 18:25:59 +00:00
c . metrics . RegisterBackupDeletionAttempt ( backupScheduleName )
2018-03-14 18:17:27 +00:00
var errs [ ] string
2018-10-16 21:49:37 +00:00
pluginManager := c . newPluginManager ( log )
defer pluginManager . CleanupClients ( )
2019-05-29 18:21:25 +00:00
backupStore , err := c . newBackupStore ( location , pluginManager , log )
if err != nil {
errs = append ( errs , err . Error ( ) )
2018-10-16 21:49:37 +00:00
}
2020-08-21 00:24:29 +00:00
actions , err := pluginManager . GetDeleteItemActions ( )
log . Debugf ( "%d actions before invoking actions" , len ( actions ) )
if err != nil {
return errors . Wrap ( err , "error getting delete item actions" )
}
// don't defer CleanupClients here, since it was already called above.
2020-11-30 18:58:34 +00:00
if len ( actions ) > 0 {
// Download the tarball
backupFile , err := downloadToTempFile ( backup . Name , backupStore , log )
defer closeAndRemoveFile ( backupFile , c . logger )
2020-08-21 00:24:29 +00:00
2020-11-30 18:58:34 +00:00
if err != nil {
log . WithError ( err ) . Errorf ( "Unable to download tarball for backup %s, skipping associated DeleteItemAction plugins" , backup . Name )
} else {
ctx := & delete . Context {
Backup : backup ,
BackupReader : backupFile ,
Actions : actions ,
Log : c . logger ,
DiscoveryHelper : c . helper ,
Filesystem : filesystem . NewFileSystem ( ) ,
}
// Optimization: wrap in a gofunc? Would be useful for large backups with lots of objects.
// but what do we do with the error returned? We can't just swallow it as that may lead to dangling resources.
err = delete . InvokeDeleteActions ( ctx )
if err != nil {
return errors . Wrap ( err , "error invoking delete item actions" )
}
}
2020-08-21 00:24:29 +00:00
}
2018-10-16 21:54:05 +00:00
if backupStore != nil {
log . Info ( "Removing PV snapshots" )
2019-04-11 19:57:17 +00:00
if snapshots , err := backupStore . GetBackupVolumeSnapshots ( backup . Name ) ; err != nil {
errs = append ( errs , errors . Wrap ( err , "error getting backup's volume snapshots" ) . Error ( ) )
2018-10-19 18:54:24 +00:00
} else {
2019-04-11 19:57:17 +00:00
volumeSnapshotters := make ( map [ string ] velero . VolumeSnapshotter )
for _ , snapshot := range snapshots {
log . WithField ( "providerSnapshotID" , snapshot . Status . ProviderSnapshotID ) . Info ( "Removing snapshot associated with backup" )
2018-10-16 21:49:37 +00:00
2019-04-11 19:57:17 +00:00
volumeSnapshotter , ok := volumeSnapshotters [ snapshot . Spec . Location ]
if ! ok {
if volumeSnapshotter , err = volumeSnapshotterForSnapshotLocation ( backup . Namespace , snapshot . Spec . Location , c . snapshotLocationLister , pluginManager ) ; err != nil {
errs = append ( errs , err . Error ( ) )
continue
2018-10-19 18:54:24 +00:00
}
2019-04-11 19:57:17 +00:00
volumeSnapshotters [ snapshot . Spec . Location ] = volumeSnapshotter
}
if err := volumeSnapshotter . DeleteSnapshot ( snapshot . Status . ProviderSnapshotID ) ; err != nil {
errs = append ( errs , errors . Wrapf ( err , "error deleting snapshot %s" , snapshot . Status . ProviderSnapshotID ) . Error ( ) )
2018-10-16 21:54:05 +00:00
}
2018-10-16 21:49:37 +00:00
}
2018-03-14 18:17:27 +00:00
}
}
2018-02-28 01:35:35 +00:00
log . Info ( "Removing restic snapshots" )
2018-06-22 19:07:23 +00:00
if deleteErrs := c . deleteResticSnapshots ( backup ) ; len ( deleteErrs ) > 0 {
for _ , err := range deleteErrs {
errs = append ( errs , err . Error ( ) )
2018-02-28 01:35:35 +00:00
}
}
2018-10-16 21:54:05 +00:00
if backupStore != nil {
log . Info ( "Removing backup from backup storage" )
if err := backupStore . DeleteBackup ( backup . Name ) ; err != nil {
errs = append ( errs , err . Error ( ) )
}
2018-03-14 18:17:27 +00:00
}
2020-05-01 20:05:20 +00:00
if features . IsEnabled ( velerov1api . CSIFeatureFlag ) {
log . Info ( "Removing CSI volumesnapshots" )
2020-05-04 19:41:27 +00:00
if csiErrs := deleteCSIVolumeSnapshots ( backup . Name , c . csiSnapshotLister , c . csiSnapshotClient . SnapshotV1beta1 ( ) , log ) ; len ( csiErrs ) > 0 {
for _ , err := range csiErrs {
errs = append ( errs , err . Error ( ) )
}
}
log . Info ( "Removing CSI volumesnapshotcontents" )
if csiErrs := deleteCSIVolumeSnapshotContents ( backup . Name , c . csiSnapshotContentLister , c . csiSnapshotClient . SnapshotV1beta1 ( ) , log ) ; len ( csiErrs ) > 0 {
2020-05-01 20:05:20 +00:00
for _ , err := range csiErrs {
errs = append ( errs , err . Error ( ) )
}
}
}
2018-03-14 18:17:27 +00:00
log . Info ( "Removing restores" )
if restores , err := c . restoreLister . Restores ( backup . Namespace ) . List ( labels . Everything ( ) ) ; err != nil {
log . WithError ( errors . WithStack ( err ) ) . Error ( "Error listing restore API objects" )
} else {
for _ , restore := range restores {
if restore . Spec . BackupName != backup . Name {
continue
}
restoreLog := log . WithField ( "restore" , kube . NamespaceAndName ( restore ) )
2018-09-18 15:56:45 +00:00
restoreLog . Info ( "Deleting restore log/results from backup storage" )
if err := backupStore . DeleteRestore ( restore . Name ) ; err != nil {
errs = append ( errs , err . Error ( ) )
// if we couldn't delete the restore files, don't delete the API object
continue
}
2018-03-14 18:17:27 +00:00
restoreLog . Info ( "Deleting restore referencing backup" )
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
if err := c . restoreClient . Restores ( restore . Namespace ) . Delete ( context . TODO ( ) , restore . Name , metav1 . DeleteOptions { } ) ; err != nil {
2018-03-14 18:17:27 +00:00
errs = append ( errs , errors . Wrapf ( err , "error deleting restore %s" , kube . NamespaceAndName ( restore ) ) . Error ( ) )
}
}
}
if len ( errs ) == 0 {
// Only try to delete the backup object from kube if everything preceding went smoothly
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
err = c . backupClient . Backups ( backup . Namespace ) . Delete ( context . TODO ( ) , backup . Name , metav1 . DeleteOptions { } )
2018-03-14 18:17:27 +00:00
if err != nil {
errs = append ( errs , errors . Wrapf ( err , "error deleting backup %s" , kube . NamespaceAndName ( backup ) ) . Error ( ) )
}
}
2019-04-04 18:25:59 +00:00
if len ( errs ) == 0 {
c . metrics . RegisterBackupDeletionSuccess ( backupScheduleName )
} else {
c . metrics . RegisterBackupDeletionFailed ( backupScheduleName )
}
2018-03-14 18:17:27 +00:00
// Update status to processed and record errors
2020-05-01 20:05:20 +00:00
req , err = c . patchDeleteBackupRequest ( req , func ( r * velerov1api . DeleteBackupRequest ) {
r . Status . Phase = velerov1api . DeleteBackupRequestPhaseProcessed
2018-03-14 18:17:27 +00:00
r . Status . Errors = errs
} )
if err != nil {
return err
}
// Everything deleted correctly, so we can delete all DeleteBackupRequests for this backup
if len ( errs ) == 0 {
2018-04-05 18:21:45 +00:00
listOptions := pkgbackup . NewDeleteBackupRequestListOptions ( backup . Name , string ( backup . UID ) )
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
err = c . deleteBackupRequestClient . DeleteBackupRequests ( req . Namespace ) . DeleteCollection ( context . TODO ( ) , metav1 . DeleteOptions { } , listOptions )
2018-03-14 18:17:27 +00:00
if err != nil {
// If this errors, all we can do is log it.
c . logger . WithField ( "backup" , kube . NamespaceAndName ( backup ) ) . Error ( "error deleting all associated DeleteBackupRequests after successfully deleting the backup" )
}
}
return nil
}
2019-03-27 18:22:04 +00:00
func volumeSnapshotterForSnapshotLocation (
2018-10-16 21:49:37 +00:00
namespace , snapshotLocationName string ,
2020-02-25 20:01:24 +00:00
snapshotLocationLister velerov1listers . VolumeSnapshotLocationLister ,
2019-03-15 18:32:11 +00:00
pluginManager clientmgmt . Manager ,
2019-03-27 18:22:04 +00:00
) ( velero . VolumeSnapshotter , error ) {
2018-10-16 21:49:37 +00:00
snapshotLocation , err := snapshotLocationLister . VolumeSnapshotLocations ( namespace ) . Get ( snapshotLocationName )
if err != nil {
return nil , errors . Wrapf ( err , "error getting volume snapshot location %s" , snapshotLocationName )
}
2019-03-27 18:22:04 +00:00
volumeSnapshotter , err := pluginManager . GetVolumeSnapshotter ( snapshotLocation . Spec . Provider )
2018-10-16 21:49:37 +00:00
if err != nil {
2019-03-27 18:22:04 +00:00
return nil , errors . Wrapf ( err , "error getting volume snapshotter for provider %s" , snapshotLocation . Spec . Provider )
2018-10-16 21:49:37 +00:00
}
2019-03-27 18:22:04 +00:00
if err = volumeSnapshotter . Init ( snapshotLocation . Spec . Config ) ; err != nil {
return nil , errors . Wrapf ( err , "error initializing volume snapshotter for volume snapshot location %s" , snapshotLocationName )
2018-10-16 21:49:37 +00:00
}
2019-03-27 18:22:04 +00:00
return volumeSnapshotter , nil
2018-10-16 21:49:37 +00:00
}
2020-05-01 20:05:20 +00:00
func ( c * backupDeletionController ) deleteExistingDeletionRequests ( req * velerov1api . DeleteBackupRequest , log logrus . FieldLogger ) [ ] error {
2018-07-19 23:06:12 +00:00
log . Info ( "Removing existing deletion requests for backup" )
2020-05-07 18:56:13 +00:00
selector := label . NewSelectorForBackup ( req . Spec . BackupName )
2018-07-19 23:06:12 +00:00
dbrs , err := c . deleteBackupRequestLister . DeleteBackupRequests ( req . Namespace ) . List ( selector )
if err != nil {
return [ ] error { errors . Wrap ( err , "error listing existing DeleteBackupRequests for backup" ) }
}
var errs [ ] error
for _ , dbr := range dbrs {
if dbr . Name == req . Name {
continue
}
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
if err := c . deleteBackupRequestClient . DeleteBackupRequests ( req . Namespace ) . Delete ( context . TODO ( ) , dbr . Name , metav1 . DeleteOptions { } ) ; err != nil {
2018-07-19 23:06:12 +00:00
errs = append ( errs , errors . WithStack ( err ) )
}
}
return errs
}
2020-05-01 20:05:20 +00:00
func ( c * backupDeletionController ) deleteResticSnapshots ( backup * velerov1api . Backup ) [ ] error {
2018-06-22 19:07:23 +00:00
if c . resticMgr == nil {
return nil
}
snapshots , err := restic . GetSnapshotsInBackup ( backup , c . podvolumeBackupLister )
if err != nil {
return [ ] error { err }
}
ctx , cancelFunc := context . WithTimeout ( context . Background ( ) , resticTimeout )
defer cancelFunc ( )
var errs [ ] error
for _ , snapshot := range snapshots {
if err := c . resticMgr . Forget ( ctx , snapshot ) ; err != nil {
errs = append ( errs , err )
}
}
return errs
}
2020-05-04 19:41:27 +00:00
func setVolumeSnapshotContentDeletionPolicy ( vscName string , csiClient snapshotter . SnapshotV1beta1Interface , log * logrus . Entry ) error {
log . Infof ( "Setting DeletionPolicy of CSI volumesnapshotcontent %s to Delete" , vscName )
pb := [ ] byte ( ` { "spec": { "deletionPolicy":"Delete"}} ` )
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
_ , err := csiClient . VolumeSnapshotContents ( ) . Patch ( context . TODO ( ) , vscName , types . MergePatchType , pb , metav1 . PatchOptions { } )
2020-05-04 19:41:27 +00:00
if err != nil {
return err
}
return nil
}
func deleteCSIVolumeSnapshots ( backupName string , csiSnapshotLister snapshotv1beta1listers . VolumeSnapshotLister ,
2020-05-01 20:05:20 +00:00
csiClient snapshotter . SnapshotV1beta1Interface , log * logrus . Entry ) [ ] error {
errs := [ ] error { }
2020-05-07 18:56:13 +00:00
selector := label . NewSelectorForBackup ( backupName )
2020-05-01 20:05:20 +00:00
csiVolSnaps , err := csiSnapshotLister . List ( selector )
if err != nil {
return [ ] error { err }
}
log . Infof ( "Deleting %d CSI volumesnapshots" , len ( csiVolSnaps ) )
for _ , csiVS := range csiVolSnaps {
log . Infof ( "Deleting CSI volumesnapshot %s/%s" , csiVS . Namespace , csiVS . Name )
if csiVS . Status != nil && csiVS . Status . BoundVolumeSnapshotContentName != nil {
// we patch the DeletionPolicy of the volumesnapshotcontent to set it to Delete.
// This ensures that the volume snapshot in the storage provider is also deleted.
2020-05-04 19:41:27 +00:00
err := setVolumeSnapshotContentDeletionPolicy ( * csiVS . Status . BoundVolumeSnapshotContentName , csiClient , log )
2020-05-01 20:05:20 +00:00
if err != nil && ! apierrors . IsNotFound ( err ) {
2020-05-04 19:41:27 +00:00
log . Errorf ( "Skipping deletion of volumesnapshot %s/%s" , csiVS . Namespace , csiVS . Name )
errs = append ( errs , err )
2020-05-01 20:05:20 +00:00
continue
}
}
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
err := csiClient . VolumeSnapshots ( csiVS . Namespace ) . Delete ( context . TODO ( ) , csiVS . Name , metav1 . DeleteOptions { } )
2020-05-01 20:05:20 +00:00
if err != nil {
errs = append ( errs , err )
}
}
return errs
}
2020-05-04 19:41:27 +00:00
func deleteCSIVolumeSnapshotContents ( backupName string , csiVSCLister snapshotv1beta1listers . VolumeSnapshotContentLister ,
csiClient snapshotter . SnapshotV1beta1Interface , log * logrus . Entry ) [ ] error {
errs := [ ] error { }
2020-05-07 18:56:13 +00:00
selector := label . NewSelectorForBackup ( backupName )
2020-05-04 19:41:27 +00:00
csiVolSnapConts , err := csiVSCLister . List ( selector )
if err != nil {
return [ ] error { err }
}
// It is possible that by the time deleteCSIVolumeSnapshotContents is called after deleteCSIVolumeSnapshots
// that deletion of VSCs hasn't been completed, by the snapshot-controller (one of the CSI components).
// For that reason the csiVSCLister returned VSCs that are yet to be deleted. To handle this scenario,
// we swallow `IsNotFound` errors from the setVolumeSnapshotContentDeletionPolicy function and the
// csiClient.VolumeSnapshotContents().Delete(...)
log . Infof ( "Deleting %d CSI volumesnapshotcontents" , len ( csiVolSnapConts ) )
for _ , snapCont := range csiVolSnapConts {
err := setVolumeSnapshotContentDeletionPolicy ( snapCont . Name , csiClient , log )
if err != nil && ! apierrors . IsNotFound ( err ) {
log . Errorf ( "Failed to set DeletionPolicy on volumesnapshotcontent %s. Skipping deletion" , snapCont . Name )
errs = append ( errs , err )
continue
}
if apierrors . IsNotFound ( err ) {
log . Infof ( "volumesnapshotcontent %s not found" , snapCont . Name )
continue
}
log . Infof ( "Deleting volumesnapshotcontent %s" , snapCont . Name )
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
err = csiClient . VolumeSnapshotContents ( ) . Delete ( context . TODO ( ) , snapCont . Name , metav1 . DeleteOptions { } )
2020-05-04 19:41:27 +00:00
if err != nil && ! apierrors . IsNotFound ( err ) {
errs = append ( errs , err )
}
}
return errs
}
2018-04-04 15:27:33 +00:00
const deleteBackupRequestMaxAge = 24 * time . Hour
func ( c * backupDeletionController ) deleteExpiredRequests ( ) {
c . logger . Info ( "Checking for expired DeleteBackupRequests" )
defer c . logger . Info ( "Done checking for expired DeleteBackupRequests" )
// Our shared informer factory filters on a single namespace, so asking for all is ok here.
requests , err := c . deleteBackupRequestLister . List ( labels . Everything ( ) )
if err != nil {
c . logger . WithError ( err ) . Error ( "unable to check for expired DeleteBackupRequests" )
return
}
now := c . clock . Now ( )
for _ , req := range requests {
2020-05-01 20:05:20 +00:00
if req . Status . Phase != velerov1api . DeleteBackupRequestPhaseProcessed {
2018-04-04 15:27:33 +00:00
continue
}
age := now . Sub ( req . CreationTimestamp . Time )
if age >= deleteBackupRequestMaxAge {
reqLog := c . logger . WithFields ( logrus . Fields { "namespace" : req . Namespace , "name" : req . Name } )
reqLog . Info ( "Deleting expired DeleteBackupRequest" )
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
err = c . deleteBackupRequestClient . DeleteBackupRequests ( req . Namespace ) . Delete ( context . TODO ( ) , req . Name , metav1 . DeleteOptions { } )
2018-04-04 15:27:33 +00:00
if err != nil {
reqLog . WithError ( err ) . Error ( "Error deleting DeleteBackupRequest" )
}
}
}
}
2020-05-01 20:05:20 +00:00
func ( c * backupDeletionController ) patchDeleteBackupRequest ( req * velerov1api . DeleteBackupRequest , mutate func ( * velerov1api . DeleteBackupRequest ) ) ( * velerov1api . DeleteBackupRequest , error ) {
2018-03-14 18:17:27 +00:00
// Record original json
oldData , err := json . Marshal ( req )
if err != nil {
return nil , errors . Wrap ( err , "error marshalling original DeleteBackupRequest" )
}
// Mutate
mutate ( req )
// Record new json
newData , err := json . Marshal ( req )
if err != nil {
return nil , errors . Wrap ( err , "error marshalling updated DeleteBackupRequest" )
}
patchBytes , err := jsonpatch . CreateMergePatch ( oldData , newData )
if err != nil {
return nil , errors . Wrap ( err , "error creating json merge patch for DeleteBackupRequest" )
}
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
req , err = c . deleteBackupRequestClient . DeleteBackupRequests ( req . Namespace ) . Patch ( context . TODO ( ) , req . Name , types . MergePatchType , patchBytes , metav1 . PatchOptions { } )
2018-03-14 18:17:27 +00:00
if err != nil {
return nil , errors . Wrap ( err , "error patching DeleteBackupRequest" )
}
return req , nil
}
2020-05-01 20:05:20 +00:00
func ( c * backupDeletionController ) patchBackup ( backup * velerov1api . Backup , mutate func ( * velerov1api . Backup ) ) ( * velerov1api . Backup , error ) {
2018-03-14 18:17:27 +00:00
// Record original json
oldData , err := json . Marshal ( backup )
if err != nil {
return nil , errors . Wrap ( err , "error marshalling original Backup" )
}
// Mutate
mutate ( backup )
// Record new json
newData , err := json . Marshal ( backup )
if err != nil {
return nil , errors . Wrap ( err , "error marshalling updated Backup" )
}
patchBytes , err := jsonpatch . CreateMergePatch ( oldData , newData )
if err != nil {
return nil , errors . Wrap ( err , "error creating json merge patch for Backup" )
}
k8s 1.18 import (#2651)
* k8s 1.18 import wip
backup, cmd, controller, generated, restic, restore, serverstatusrequest, test and util
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go mod tidy
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* add changelog file
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* go fmt
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* update code-generator and controller-gen in CI
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* checkout proper code-generator version, regen
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix remaining calls
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* regenerate CRDs with ./hack/update-generated-crd-code.sh
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use existing context in restic and server
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* fix test cases by resetting resource version
also use main library go context, not golang.org/x/net/context, in pkg/restore/restore.go
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* clarify changelog message
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* use github.com/kubernetes-csi/external-snapshotter/v2@v2.2.0-rc1
Signed-off-by: Andrew Lavery <laverya@umich.edu>
* run 'go mod tidy' to remove old external-snapshotter version
Signed-off-by: Andrew Lavery <laverya@umich.edu>
2020-07-16 16:21:37 +00:00
backup , err = c . backupClient . Backups ( backup . Namespace ) . Patch ( context . TODO ( ) , backup . Name , types . MergePatchType , patchBytes , metav1 . PatchOptions { } )
2018-03-14 18:17:27 +00:00
if err != nil {
return nil , errors . Wrap ( err , "error patching Backup" )
}
return backup , nil
}