@@ -17,6 +17,7 @@ package bucket
17
17
18
18
import (
19
19
"context"
20
+ "fmt"
20
21
"strings"
21
22
22
23
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -66,9 +67,13 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
66
67
var err error
67
68
68
69
klog .V (3 ).InfoS ("Add Bucket" ,
69
- "name" , bucket .ObjectMeta .Name ,
70
- "bucketclass" , bucket .Spec .BucketClassName ,
71
- )
70
+ "name" , bucket .ObjectMeta .Name )
71
+
72
+ if bucket .Spec .BucketClassName == "" {
73
+ err = errors .New (fmt .Sprintf ("BucketClassName not defined for bucket %s" , bucket .ObjectMeta .Name ))
74
+ klog .V (3 ).ErrorS (err , "BucketClassName not defined" )
75
+ return err
76
+ }
72
77
73
78
if ! strings .EqualFold (bucket .Spec .DriverName , b .driverName ) {
74
79
klog .V (5 ).InfoS ("Skipping bucket for driver" ,
@@ -93,6 +98,24 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
93
98
if bucket .Spec .ExistingBucketID != "" {
94
99
bucketReady = true
95
100
bucketID = bucket .Spec .ExistingBucketID
101
+ if bucket .Spec .Parameters == nil {
102
+ bucketClass , err := b .bucketClasses ().Get (ctx , bucket .Spec .BucketClassName , metav1.GetOptions {})
103
+ if err != nil {
104
+ klog .V (3 ).ErrorS (err , "Error fetching bucketClass" ,
105
+ "bucketClass" , bucket .Spec .BucketClassName ,
106
+ "bucket" , bucket .ObjectMeta .Name )
107
+ return err
108
+ }
109
+
110
+ if bucketClass .Parameters != nil {
111
+ var param map [string ]string
112
+ for k , v := range bucketClass .Parameters {
113
+ param [k ] = v
114
+ }
115
+
116
+ bucket .Spec .Parameters = param
117
+ }
118
+ }
96
119
} else {
97
120
req := & cosi.DriverCreateBucketRequest {
98
121
Parameters : bucket .Spec .Parameters ,
@@ -110,7 +133,7 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
110
133
}
111
134
112
135
if rsp == nil {
113
- err = errors .New ("DriverCreateBucket returned a nil response" )
136
+ err = errors .New (fmt . Sprintf ( "DriverCreateBucket returned a nil response for bucket: %s" , bucket . ObjectMeta . Name ) )
114
137
klog .V (3 ).ErrorS (err , "Internal Error from driver" ,
115
138
"bucket" , bucket .ObjectMeta .Name )
116
139
return err
@@ -122,7 +145,7 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
122
145
} else {
123
146
klog .V (3 ).ErrorS (err , "DriverCreateBucket returned an empty bucketID" ,
124
147
"bucket" , bucket .ObjectMeta .Name )
125
- err = errors .New ("DriverCreateBucket returned an empty bucketID" )
148
+ err = errors .New (fmt . Sprintf ( "DriverCreateBucket returned an empty bucketID for bucket: %s" , bucket . ObjectMeta . Name ) )
126
149
return err
127
150
}
128
151
@@ -217,6 +240,16 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
217
240
if err != nil {
218
241
return err
219
242
}
243
+
244
+ controllerutil .RemoveFinalizer (bucket , consts .BucketFinalizer )
245
+ klog .V (5 ).Infof ("Successfully removed finalizer: %s of bucket: %s" , consts .BucketFinalizer , bucket .ObjectMeta .Name )
246
+ }
247
+
248
+ _ , err = b .buckets ().Update (ctx , bucket , metav1.UpdateOptions {})
249
+ if err != nil {
250
+ klog .V (3 ).ErrorS (err , "Error updating bucket after removing finalizers" ,
251
+ "bucket" , bucket .ObjectMeta .Name )
252
+ return err
220
253
}
221
254
}
222
255
@@ -227,14 +260,38 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
227
260
}
228
261
229
262
// Delete attemps to delete a bucket. This function must be idempotent
263
+ // Delete function is called when the bucket was not able to add finalizers while creation.
264
+ // Hence we will take care of removing the BucketClaim finalizer before deleting the Bucket object.
230
265
// Return values
231
266
// nil - Bucket successfully deleted
232
267
// non-nil err - Internal error [requeue'd with exponential backoff]
233
268
func (b * BucketListener ) Delete (ctx context.Context , inputBucket * v1alpha1.Bucket ) error {
234
269
klog .V (3 ).InfoS ("Delete Bucket" ,
235
270
"name" , inputBucket .ObjectMeta .Name ,
236
- "bucketclass" , inputBucket .Spec .BucketClassName ,
237
- )
271
+ "bucketclass" , inputBucket .Spec .BucketClassName )
272
+
273
+ if inputBucket .Spec .BucketClaim != nil {
274
+ ref := inputBucket .Spec .BucketClaim
275
+ klog .V (3 ).Infof ("Removing finalizer of bucketClaim: %s before deleting bucket: %s" , ref .Name , inputBucket .ObjectMeta .Name )
276
+
277
+ bucketClaim , err := b .bucketClaims (ref .Namespace ).Get (ctx , ref .Name , metav1.GetOptions {})
278
+ if err != nil {
279
+ klog .V (3 ).ErrorS (err , "Error getting bucketClaim for removing finalizer" ,
280
+ "bucket" , inputBucket .ObjectMeta .Name ,
281
+ "bucketClaim" , ref .Name )
282
+ return err
283
+ }
284
+
285
+ if controllerutil .RemoveFinalizer (bucketClaim , consts .BCFinalizer ) {
286
+ _ , err := b .bucketClaims (bucketClaim .ObjectMeta .Namespace ).Update (ctx , bucketClaim , metav1.UpdateOptions {})
287
+ if err != nil {
288
+ klog .V (3 ).ErrorS (err , "Error removing bucketClaim finalizer" ,
289
+ "bucket" , inputBucket .ObjectMeta .Name ,
290
+ "bucketClaim" , bucketClaim .ObjectMeta .Name )
291
+ return err
292
+ }
293
+ }
294
+ }
238
295
239
296
return nil
240
297
@@ -270,7 +327,8 @@ func (b *BucketListener) deleteBucketOp(ctx context.Context, bucket *v1alpha1.Bu
270
327
// only when the retain policy is set to Delete
271
328
if bucket .Spec .DeletionPolicy == v1alpha1 .DeletionPolicyDelete {
272
329
req := & cosi.DriverDeleteBucketRequest {
273
- BucketId : bucket .Status .BucketID ,
330
+ BucketId : bucket .Status .BucketID ,
331
+ DeleteContext : bucket .Spec .Parameters ,
274
332
}
275
333
276
334
if _ , err := b .provisionerClient .DriverDeleteBucket (ctx , req ); err != nil {
@@ -317,6 +375,13 @@ func (b *BucketListener) buckets() bucketapi.BucketInterface {
317
375
panic ("uninitialized listener" )
318
376
}
319
377
378
+ func (b * BucketListener ) bucketClasses () bucketapi.BucketClassInterface {
379
+ if b .bucketClient != nil {
380
+ return b .bucketClient .ObjectstorageV1alpha1 ().BucketClasses ()
381
+ }
382
+ panic ("uninitialized listener" )
383
+ }
384
+
320
385
func (b * BucketListener ) bucketClaims (namespace string ) bucketapi.BucketClaimInterface {
321
386
if b .bucketClient != nil {
322
387
return b .bucketClient .ObjectstorageV1alpha1 ().BucketClaims (namespace )
0 commit comments