diff --git a/pkg/controller/backup_deletion_controller.go b/pkg/controller/backup_deletion_controller.go index c52a8cc5c..90de1e011 100644 --- a/pkg/controller/backup_deletion_controller.go +++ b/pkg/controller/backup_deletion_controller.go @@ -133,6 +133,7 @@ func (c *backupDeletionController) processRequest(req *v1.DeleteBackupRequest) e "backup": req.Spec.BackupName, }) + // Make sure we have the backup name if req.Spec.BackupName == "" { _, err := c.patchDeleteBackupRequest(req, func(r *v1.DeleteBackupRequest) { r.Status.Phase = v1.DeleteBackupRequestPhaseProcessed @@ -143,9 +144,13 @@ func (c *backupDeletionController) processRequest(req *v1.DeleteBackupRequest) e var err error - // Update status to InProgress + // Update status to InProgress and set backup-name label if needed req, err = c.patchDeleteBackupRequest(req, func(r *v1.DeleteBackupRequest) { r.Status.Phase = v1.DeleteBackupRequestPhaseInProgress + + if req.Labels[v1.BackupNameLabel] == "" { + req.Labels[v1.BackupNameLabel] = req.Spec.BackupName + } }) if err != nil { return err @@ -166,6 +171,16 @@ func (c *backupDeletionController) processRequest(req *v1.DeleteBackupRequest) e return errors.Wrap(err, "error getting Backup") } + // Set backup-uid label if needed + if req.Labels[v1.BackupUIDLabel] == "" { + req, err = c.patchDeleteBackupRequest(req, func(r *v1.DeleteBackupRequest) { + req.Labels[v1.BackupUIDLabel] = string(backup.UID) + }) + if err != nil { + return err + } + } + // If the backup includes snapshots but we don't currently have a PVProvider, we don't // want to orphan the snapshots so skip deletion. if c.snapshotService == nil && len(backup.Status.VolumeBackups) > 0 { diff --git a/pkg/controller/backup_deletion_controller_test.go b/pkg/controller/backup_deletion_controller_test.go index d91086586..61c78f082 100644 --- a/pkg/controller/backup_deletion_controller_test.go +++ b/pkg/controller/backup_deletion_controller_test.go @@ -334,6 +334,9 @@ func TestBackupDeletionControllerProcessRequest(t *testing.T) { defer td.backupService.AssertExpectations(t) + // Clear out req labels to make sure the controller adds them + td.req.Labels = make(map[string]string) + td.client.PrependReactor("get", "backups", func(action core.Action) (bool, runtime.Object, error) { return true, backup, nil }) @@ -357,13 +360,19 @@ func TestBackupDeletionControllerProcessRequest(t *testing.T) { v1.SchemeGroupVersion.WithResource("deletebackuprequests"), td.req.Namespace, td.req.Name, - []byte(`{"status":{"phase":"InProgress"}}`), + []byte(`{"metadata":{"labels":{"ark.heptio.com/backup-name":"foo"}},"status":{"phase":"InProgress"}}`), ), core.NewGetAction( v1.SchemeGroupVersion.WithResource("backups"), td.req.Namespace, td.req.Spec.BackupName, ), + core.NewPatchAction( + v1.SchemeGroupVersion.WithResource("deletebackuprequests"), + td.req.Namespace, + td.req.Name, + []byte(`{"metadata":{"labels":{"ark.heptio.com/backup-uid":"uid"}}}`), + ), core.NewPatchAction( v1.SchemeGroupVersion.WithResource("backups"), td.req.Namespace, @@ -412,6 +421,19 @@ func TestBackupDeletionControllerProcessRequest(t *testing.T) { } } + for _, a := range td.client.Actions() { + found := false + for _, e := range expectedActions { + if reflect.DeepEqual(e, a) { + found = true + break + } + } + if !found { + t.Errorf("unexpected action %#v", a) + } + } + // Make sure snapshot was deleted assert.Equal(t, 0, td.snapshotService.SnapshotsTaken.Len()) })