From ca72c2e7e2cc448fb071d2df756fd44f0295ce4e Mon Sep 17 00:00:00 2001 From: AftAb-25 Date: Tue, 4 Aug 2026 22:36:45 +0530 Subject: [PATCH] Fix missing `gcFailureBSLUnavailable` label during garbage collection (#10154) * Fix gcFailureBSLUnavailable label not applied (Issue #10153) Signed-off-by: aftab * Fix linter error: use require.NoError before checking label Signed-off-by: aftab --------- Signed-off-by: aftab --- pkg/controller/gc_controller.go | 4 ++++ pkg/controller/gc_controller_test.go | 27 ++++++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/pkg/controller/gc_controller.go b/pkg/controller/gc_controller.go index 6b3ade484..f477ae9c6 100644 --- a/pkg/controller/gc_controller.go +++ b/pkg/controller/gc_controller.go @@ -156,6 +156,10 @@ func (c *gcReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Re if !veleroutil.BSLIsAvailable(*loc) { log.Infof("BSL %s is unavailable, cannot gc backup", loc.Name) + backup.Labels[garbageCollectionFailure] = gcFailureBSLUnavailable + if err := c.Update(ctx, backup); err != nil { + log.WithError(err).Error("error updating backup labels") + } return ctrl.Result{}, fmt.Errorf("bsl %s is unavailable, cannot gc backup", loc.Name) } diff --git a/pkg/controller/gc_controller_test.go b/pkg/controller/gc_controller_test.go index 754b46e0a..be7553888 100644 --- a/pkg/controller/gc_controller_test.go +++ b/pkg/controller/gc_controller_test.go @@ -21,6 +21,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -48,11 +49,12 @@ func TestGCReconcile(t *testing.T) { defaultBackupLocation := builder.ForBackupStorageLocation(velerov1api.DefaultNamespace, "default").Phase(velerov1api.BackupStorageLocationPhaseAvailable).Result() tests := []struct { - name string - backup *velerov1api.Backup - deleteBackupRequests []*velerov1api.DeleteBackupRequest - backupLocation *velerov1api.BackupStorageLocation - expectError bool + name string + backup *velerov1api.Backup + deleteBackupRequests []*velerov1api.DeleteBackupRequest + backupLocation *velerov1api.BackupStorageLocation + expectError bool + expectedGCFailureLabel string }{ { name: "can't find backup - no error", @@ -118,10 +120,11 @@ func TestGCReconcile(t *testing.T) { }, }, { - name: "BSL is unavailable", - backup: defaultBackup().Expiration(fakeClock.Now().Add(-time.Second)).StorageLocation("default").Result(), - backupLocation: builder.ForBackupStorageLocation(velerov1api.DefaultNamespace, "default").Phase(velerov1api.BackupStorageLocationPhaseUnavailable).Result(), - expectError: true, + name: "BSL is unavailable", + backup: defaultBackup().Expiration(fakeClock.Now().Add(-time.Second)).StorageLocation("default").Result(), + backupLocation: builder.ForBackupStorageLocation(velerov1api.DefaultNamespace, "default").Phase(velerov1api.BackupStorageLocationPhaseUnavailable).Result(), + expectError: true, + expectedGCFailureLabel: gcFailureBSLUnavailable, }, } @@ -147,6 +150,12 @@ func TestGCReconcile(t *testing.T) { _, err := reconciler.Reconcile(t.Context(), ctrl.Request{NamespacedName: types.NamespacedName{Namespace: test.backup.Namespace, Name: test.backup.Name}}) gotErr := err != nil assert.Equal(t, test.expectError, gotErr) + + if test.expectedGCFailureLabel != "" { + updatedBackup := &velerov1api.Backup{} + require.NoError(t, fakeClient.Get(t.Context(), types.NamespacedName{Namespace: test.backup.Namespace, Name: test.backup.Name}, updatedBackup)) + assert.Equal(t, test.expectedGCFailureLabel, updatedBackup.Labels[garbageCollectionFailure]) + } }) } }