From 79042f935136ecd5efdd6bf9a2ee54e99e079121 Mon Sep 17 00:00:00 2001 From: Aleksei Sviridkin Date: Wed, 3 Jun 2026 01:48:30 +0300 Subject: [PATCH] fix(objectstorage-controller): propagate Bucket readiness to BucketClaim The vendored COSI controller (v0.2.2) sets only BucketClaim.status.bucketName in the dynamic-provisioning path and hardcodes bucketReady=false, never re-reading the Bucket afterwards. The controller does not watch Buckets, so the readiness transition the sidecar performs (false->true) is never reflected on the BucketClaim: bucketReady stays false forever and BucketAccess is never granted, leaving provisioned buckets without credentials. Re-read the live Bucket after create and propagate its readiness, so the periodic resync converges the BucketClaim to ready. This matches the behavior the rewritten upstream controller already has on its main branch. Assisted-By: Claude Signed-off-by: Aleksei Sviridkin (cherry picked from commit ed20a4322a45dbbd560d68a1f3dc8bf13f4e012d) --- .../92-bucketclaim-propagate-ready.diff | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 packages/system/objectstorage-controller/images/objectstorage/patches/92-bucketclaim-propagate-ready.diff diff --git a/packages/system/objectstorage-controller/images/objectstorage/patches/92-bucketclaim-propagate-ready.diff b/packages/system/objectstorage-controller/images/objectstorage/patches/92-bucketclaim-propagate-ready.diff new file mode 100644 index 000000000..e5fc92431 --- /dev/null +++ b/packages/system/objectstorage-controller/images/objectstorage/patches/92-bucketclaim-propagate-ready.diff @@ -0,0 +1,29 @@ +diff --git a/controller/pkg/bucketclaim/bucketclaim.go b/controller/pkg/bucketclaim/bucketclaim.go +index 2b55c49..038cf28 100644 +--- a/controller/pkg/bucketclaim/bucketclaim.go ++++ b/controller/pkg/bucketclaim/bucketclaim.go +@@ -213,8 +213,23 @@ func (b *BucketClaimListener) provisionBucketClaimOperation(ctx context.Context, + return b.recordError(inputBucketClaim, v1.EventTypeWarning, v1alpha1.FailedCreateBucket, err) + } + ++ // The Bucket for this claim may already exist from an earlier reconcile, ++ // in which case the sidecar may have provisioned the backend and flipped ++ // the Bucket to ready in the meantime. The controller does not watch ++ // Buckets, so re-read the live object and propagate its readiness here; ++ // otherwise the BucketClaim stays BucketReady=false forever (each resync ++ // re-enters this branch, Create returns AlreadyExists, and the readiness ++ // transition is never reflected), so BucketAccess can never be granted. ++ createdBucket, getErr := b.buckets().Get(ctx, bucketName, metav1.GetOptions{}) ++ if getErr != nil { ++ klog.V(3).ErrorS(getErr, "Error reading bucket after create", ++ "bucket", bucketName, ++ "bucketClaim", bucketClaim.ObjectMeta.Name) ++ return b.recordError(inputBucketClaim, v1.EventTypeWarning, v1alpha1.FailedCreateBucket, getErr) ++ } ++ + bucketClaim.Status.BucketName = bucketName +- bucketClaim.Status.BucketReady = false ++ bucketClaim.Status.BucketReady = createdBucket.Status.BucketReady + } + + // Update status with retry logic for conflict errors