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 <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit ed20a4322a)
This commit is contained in:
Aleksei Sviridkin authored and github-actions[bot] committed 2026-06-05 08:10:36 +00:00
1 parent 7e91f1ba3b
commit 79042f9351
1 file changed
+29
@@ -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