@@ -18,6 +18,7 @@ package reconciler
1818
1919import (
2020 "context"
21+ "errors"
2122 "fmt"
2223 "time"
2324
@@ -33,6 +34,7 @@ import (
3334 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3435
3536 cosiapi "sigs.k8s.io/container-object-storage-interface/client/apis/objectstorage/v1alpha2"
37+ cosierr "sigs.k8s.io/container-object-storage-interface/internal/errors"
3638 cosipredicate "sigs.k8s.io/container-object-storage-interface/internal/predicate"
3739)
3840
@@ -63,18 +65,18 @@ func (r *BucketClaimReconciler) Reconcile(ctx context.Context, req ctrl.Request)
6365 return ctrl.Result {}, err
6466 }
6567
66- retryError , err := r .reconcile (ctx , logger , claim )
68+ err := r .reconcile (ctx , logger , claim )
6769 if err != nil {
6870 // Record any error as a timestamped error in the status.
6971 claim .Status .Error = cosiapi .NewTimestampedError (time .Now (), err .Error ())
7072 if updErr := r .Status ().Update (ctx , claim ); updErr != nil {
7173 logger .Error (err , "failed to update BucketClaim status after reconcile error" , "updateError" , updErr )
7274 // If status update fails, we must retry the error regardless of the reconcile return.
73- // The reconcile needs to run again to make sure the status is eventually be updated.
75+ // The reconcile needs to run again to make sure the status is eventually updated.
7476 return reconcile.Result {}, err
7577 }
7678
77- if ! retryError {
79+ if errors . Is ( err , cosierr . NonRetryableError ( nil )) {
7880 return reconcile.Result {}, reconcile .TerminalError (err )
7981 }
8082 return reconcile.Result {}, err
@@ -112,31 +114,20 @@ func (r *BucketClaimReconciler) SetupWithManager(mgr ctrl.Manager) error {
112114 Complete (r )
113115}
114116
115- // Type definition enforces readability. true/false in code is hard to read/review/maintain.
116- type retryErrorType bool
117-
118- const (
119- RetryError retryErrorType = true // DO retry the error.
120- DoNotRetryError retryErrorType = false // Do NOT retry the error.
121- NoError retryErrorType = false // No error, don't retry. For readability.
122- )
123-
124- func (r * BucketClaimReconciler ) reconcile (
125- ctx context.Context , logger logr.Logger , claim * cosiapi.BucketClaim ,
126- ) (retryErrorType , error ) {
117+ func (r * BucketClaimReconciler ) reconcile (ctx context.Context , logger logr.Logger , claim * cosiapi.BucketClaim ) error {
127118 bucketName , err := determineBucketName (claim )
128119 if err != nil {
129120 // Opinion: It is best to not apply a missing finalizer when boundBucketName is degraded
130121 // (err returned here). When degraded, the user needs to delete and re-create the
131122 // BucketClaim to fix the degradation, which requires the finalizer be absent.
132123 logger .Error (err , "failed to determine Bucket name for claim" )
133- return DoNotRetryError , err
124+ return cosierr . NonRetryableError ( err )
134125 }
135126
136127 logger = logger .WithValues ("bucketName" , bucketName )
137128
138129 if claim .Spec .ExistingBucketName != "" {
139- return DoNotRetryError , fmt .Errorf ("static provisioning is not yet supported" ) // TODO
130+ return cosierr . NonRetryableError ( fmt .Errorf ("static provisioning is not yet supported" ) ) // TODO
140131 }
141132
142133 if ! claim .GetDeletionTimestamp ().IsZero () {
@@ -147,10 +138,10 @@ func (r *BucketClaimReconciler) reconcile(
147138 ctrlutil .RemoveFinalizer (claim , cosiapi .ProtectionFinalizer )
148139 if err := r .Update (ctx , claim ); err != nil {
149140 logger .Error (err , "failed to remove finalizer" )
150- return RetryError , fmt .Errorf ("failed to remove finalizer: %w" , err )
141+ return fmt .Errorf ("failed to remove finalizer: %w" , err )
151142 }
152143
153- return DoNotRetryError , fmt .Errorf ("deletion is not yet implemented" ) // TODO
144+ return cosierr . NonRetryableError ( fmt .Errorf ("deletion is not yet implemented" ) ) // TODO
154145 }
155146
156147 logger .V (1 ).Info ("reconciling BucketClaim" )
@@ -159,7 +150,7 @@ func (r *BucketClaimReconciler) reconcile(
159150 if didAdd {
160151 if err := r .Update (ctx , claim ); err != nil {
161152 logger .Error (err , "failed to add protection finalizer" )
162- return RetryError , fmt .Errorf ("failed to add protection finalizer: %w" , err )
153+ return fmt .Errorf ("failed to add protection finalizer: %w" , err )
163154 }
164155 }
165156
@@ -168,7 +159,7 @@ func (r *BucketClaimReconciler) reconcile(
168159 claim .Status .BoundBucketName = bucketName
169160 if err := r .Status ().Update (ctx , claim ); err != nil {
170161 logger .Error (err , "failed to bind BucketClaim to Bucket" )
171- return RetryError , fmt .Errorf ("failed to bind BucketClaim to Bucket: %w" , err )
162+ return fmt .Errorf ("failed to bind BucketClaim to Bucket: %w" , err )
172163 }
173164 }
174165
@@ -180,14 +171,14 @@ func (r *BucketClaimReconciler) reconcile(
180171 if err := r .Get (ctx , bucketNsName , bucket ); err != nil {
181172 if ! kerrors .IsNotFound (err ) {
182173 logger .Error (err , "failed to determine if Bucket exists" )
183- return RetryError , err
174+ return err
184175 }
185176
186177 // TODO: static provisioning: don't do this
187178 logger .Info ("creating intermediate Bucket" )
188- _ , retryErr , err := createIntermediateBucket (ctx , logger , r .Client , claim , bucketName )
179+ _ , err := createIntermediateBucket (ctx , logger , r .Client , claim , bucketName )
189180 if err != nil {
190- return retryErr , err
181+ return err
191182 }
192183 }
193184
@@ -205,7 +196,7 @@ func (r *BucketClaimReconciler) reconcile(
205196 // 1. Supported protocols
206197 // 2. `ReadyToUse`
207198
208- return NoError , nil
199+ return nil
209200}
210201
211202// Determine the bucket name that should go with the claim. No errors can be retried.
@@ -244,11 +235,11 @@ func createIntermediateBucket(
244235 client client.Client ,
245236 claim * cosiapi.BucketClaim ,
246237 bucketName string ,
247- ) (* cosiapi.Bucket , retryErrorType , error ) {
238+ ) (* cosiapi.Bucket , error ) {
248239 className := claim .Spec .BucketClassName
249240 if className == "" {
250241 logger .Error (nil , "BucketClaim cannot have empty bucketClassName" )
251- return nil , DoNotRetryError , fmt .Errorf ("BucketClaim cannot have empty bucketClassName" )
242+ return nil , cosierr . NonRetryableError ( fmt .Errorf ("BucketClaim cannot have empty bucketClassName" ) )
252243 }
253244
254245 logger = logger .WithValues ("bucketClassName" , className )
@@ -265,10 +256,10 @@ func createIntermediateBucket(
265256 // BucketClass reconciler that enqueues requests for BucketClaims that reference the
266257 // class and don't yet have a bound Bucket.
267258 logger .Error (err , "BucketClass not found" )
268- return nil , RetryError , err
259+ return nil , err
269260 }
270261 logger .Error (err , "failed to get BucketClass" )
271- return nil , RetryError , err
262+ return nil , err
272263 }
273264
274265 logger .V (1 ).Info ("using BucketClass for intermediate Bucket" )
@@ -279,13 +270,13 @@ func createIntermediateBucket(
279270 if kerrors .IsAlreadyExists (err ) {
280271 // Unlikely race condition. Error to allow the next reconcile to attempt to recover.
281272 logger .Error (err , "intermediate Bucket already exists" )
282- return nil , RetryError , err
273+ return nil , err
283274 }
284275 logger .Error (err , "failed to create intermediate Bucket" )
285- return nil , RetryError , err
276+ return nil , err
286277 }
287278
288- return bucket , NoError , nil
279+ return bucket , nil
289280}
290281
291282func generateIntermediateBucket (
0 commit comments