@@ -17,6 +17,7 @@ package bucket
1717
1818import (
1919"context"
20+ "fmt"
2021"strings"
2122
2223metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -66,9 +67,13 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
6667var err error
6768
6869klog .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+ }
7277
7378if ! strings .EqualFold (bucket .Spec .DriverName , b .driverName ) {
7479klog .V (5 ).InfoS ("Skipping bucket for driver" ,
@@ -93,6 +98,24 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
9398if bucket .Spec .ExistingBucketID != "" {
9499bucketReady = true
95100bucketID = 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+ }
96119} else {
97120req := & cosi.DriverCreateBucketRequest {
98121Parameters : bucket .Spec .Parameters ,
@@ -110,7 +133,7 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
110133}
111134
112135if 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 ) )
114137klog .V (3 ).ErrorS (err , "Internal Error from driver" ,
115138"bucket" , bucket .ObjectMeta .Name )
116139return err
@@ -122,7 +145,7 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
122145} else {
123146klog .V (3 ).ErrorS (err , "DriverCreateBucket returned an empty bucketID" ,
124147"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 ) )
126149return err
127150}
128151
@@ -217,6 +240,16 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
217240if err != nil {
218241return err
219242}
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
220253}
221254}
222255
@@ -227,14 +260,38 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
227260}
228261
229262// 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.
230265// Return values
231266// nil - Bucket successfully deleted
232267// non-nil err - Internal error [requeue'd with exponential backoff]
233268func (b * BucketListener ) Delete (ctx context.Context , inputBucket * v1alpha1.Bucket ) error {
234269klog .V (3 ).InfoS ("Delete Bucket" ,
235270"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+ }
238295
239296return nil
240297
@@ -270,7 +327,8 @@ func (b *BucketListener) deleteBucketOp(ctx context.Context, bucket *v1alpha1.Bu
270327// only when the retain policy is set to Delete
271328if bucket .Spec .DeletionPolicy == v1alpha1 .DeletionPolicyDelete {
272329req := & cosi.DriverDeleteBucketRequest {
273- BucketId : bucket .Status .BucketID ,
330+ BucketId : bucket .Status .BucketID ,
331+ DeleteContext : bucket .Spec .Parameters ,
274332}
275333
276334if _ , err := b .provisionerClient .DriverDeleteBucket (ctx , req ); err != nil {
@@ -317,6 +375,13 @@ func (b *BucketListener) buckets() bucketapi.BucketInterface {
317375panic ("uninitialized listener" )
318376}
319377
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+
320385func (b * BucketListener ) bucketClaims (namespace string ) bucketapi.BucketClaimInterface {
321386if b .bucketClient != nil {
322387return b .bucketClient .ObjectstorageV1alpha1 ().BucketClaims (namespace )
0 commit comments