@@ -36,7 +36,7 @@ import (
3636)
3737
3838const (
39- brFinalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
39+ bcFinalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
4040)
4141
4242// BucketListener manages Bucket objects
@@ -67,74 +67,83 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
6767 bucket := inputBucket .DeepCopy ()
6868
6969 klog .V (3 ).InfoS ("Add Bucket" ,
70- "name" , bucket .Name ,
70+ "name" , bucket .ObjectMeta . Name ,
7171 "bucketclass" , bucket .Spec .BucketClassName ,
7272 )
7373
7474 if ! strings .EqualFold (bucket .Spec .DriverName , b .driverName ) {
7575 klog .V (5 ).InfoS ("Skipping bucket for driver" ,
76- "bucket" , bucket .Name ,
76+ "bucket" , bucket .ObjectMeta . Name ,
7777 "driver" , bucket .Spec .DriverName ,
7878 )
7979 return nil
8080 }
8181
82- if bucket .Status .BucketAvailable {
82+ if bucket .Status .BucketReady {
8383 klog .V (5 ).InfoS ("BucketExists" ,
84- "bucket" , bucket .Name ,
84+ "bucket" , bucket .ObjectMeta . Name ,
8585 "driver" , bucket .Spec .DriverName ,
8686 )
87- return nil
88- }
8987
90- req := & cosi.DriverCreateBucketRequest {
91- Parameters : bucket .Spec .Parameters ,
92- Name : bucket .Name ,
88+ return nil
9389 }
9490
95- rsp , err := b .provisionerClient .DriverCreateBucket (ctx , req )
96- if err != nil {
97- if status .Code (err ) != codes .AlreadyExists {
98- klog .ErrorS (err , "Failed to create bucket" ,
99- "bucket" , bucket .Name )
100- return errors .Wrap (err , "Failed to create bucket" )
91+ if bucket .Spec .ExistingBucketID != nil {
92+ bucket .Status .BucketReady = true
93+ bucket .Status .BucketID = bucket .Spec .ExistingBucketID
94+ } else {
95+ req := & cosi.DriverCreateBucketRequest {
96+ Parameters : bucket .Spec .Parameters ,
97+ Name : bucket .ObjectMeta .Name ,
10198 }
10299
103- }
104- if rsp == nil {
105- err := errors .New ("DriverCreateBucket returned a nil response" )
106- klog .ErrorS (err , "Internal Error" )
107- return err
108- }
109-
110- if rsp .BucketId != "" {
111- bucket .Status .BucketID = rsp .BucketId
112- }
100+ rsp , err := b .provisionerClient .DriverCreateBucket (ctx , req )
101+ if err != nil {
102+ if status .Code (err ) != codes .AlreadyExists {
103+ klog .ErrorS (err , "Failed to create bucket" ,
104+ "bucket" , bucket .ObjectMeta .Name )
105+ return errors .Wrap (err , "Failed to create bucket" )
106+ }
113107
114- bucket . Status . BucketReady = true
108+ }
115109
116- // if this step fails, then controller will retry with backoff
117- if _ , err := b .Buckets ().UpdateStatus (ctx , bucket , metav1.UpdateOptions {}); err != nil {
118- klog .ErrorS (err , "Failed to update bucket status" ,
119- "bucket" , bucket .Name )
120- return errors .Wrap (err , "Failed to update bucket status" )
121- }
110+ if rsp == nil {
111+ err = errors .New ("DriverCreateBucket returned a nil response" )
112+ klog .ErrorS (err , "Internal Error" )
113+ return err
114+ }
122115
123- // Now we update the BucketReady status of BucketClaim
124- if bucket .Spec . BucketClaim != nil {
125- ref := bucket .Spec . BucketClaim
126- bucketClaim , err := b . BucketClaims ( ref . Namespace ). Get ( ctx , ref . Name , metav1. GetOptions {})
127- if err != nil {
116+ if rsp . BucketId != "" {
117+ bucket .Status . BucketID = rsp . BucketId
118+ bucket .Status . BucketReady = true
119+ } else {
120+ err = errors . New ( "DriverCreateBucket returned an empty bucketID" )
128121 return err
129122 }
130123
131- bucketClaim .Status .BucketReady = true
132124
133- if _ , err := b .BucketClaims (bucketClaim .Namespace ).Update (ctx , bucketClaim , metav1.UpdateOptions {}); err != nil {
134- return err
125+ // Now we update the BucketReady status of BucketClaim
126+ if bucket .Spec .BucketClaim != nil {
127+ ref := bucket .Spec .BucketClaim
128+ bucketClaim , err := b .BucketClaims (ref .Namespace ).Get (ctx , ref .Name , metav1.GetOptions {})
129+ if err != nil {
130+ return err
131+ }
132+
133+ bucketClaim .Status .BucketReady = true
134+ if _ , err = b .BucketClaims (bucketClaim .Namespace ).Update (ctx , bucketClaim , metav1.UpdateOptions {}); err != nil {
135+ return err
136+ }
135137 }
136138 }
137139
140+ // if this step fails, then controller will retry with backoff
141+ if _ , err = b .Buckets ().UpdateStatus (ctx , bucket , metav1.UpdateOptions {}); err != nil {
142+ klog .ErrorS (err , "Failed to update bucket status" ,
143+ "bucket" , bucket .ObjectMeta .Name )
144+ return errors .Wrap (err , "Failed to update bucket status" )
145+ }
146+
138147 return nil
139148}
140149
@@ -146,6 +155,23 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
146155 klog .V (3 ).InfoS ("Update Bucket" ,
147156 "name" , old .Name )
148157
158+ if ! new .GetDeletionTimestamp .IsZero () {
159+ if len (new .ObjectMeta .Finalizers ) > 0 {
160+ bucketClaimNs := new .Spec .BucketClaim .Namespace
161+ bucketClaimName := new .Spec .BucketClaim .Name
162+ bucketAccessList , err := b .BucketAccesses (bucketClaimNs ).List (ctx , ListOptions {})
163+
164+ for _ , bucketAccess := range bucketAccessList .Items {
165+ if strings .EqualFold (bucketAccess .Spec .BucketClaimName , bucketClaimName ) {
166+ err = b .BucketAccesses (bucketClaimNs ).Delete (ctx , bucketAccess .Name , metav1.DeleteOptions {})
167+ if err != nil {
168+ return err
169+ }
170+ }
171+ }
172+ }
173+ }
174+
149175 return nil
150176}
151177
@@ -157,13 +183,13 @@ func (b *BucketListener) Delete(ctx context.Context, inputBucket *v1alpha1.Bucke
157183 bucket := inputBucket .DeepCopy ()
158184
159185 klog .V (3 ).InfoS ("Delete Bucket" ,
160- "name" , bucket .Name ,
186+ "name" , bucket .ObjectMeta . Name ,
161187 "bucketclass" , bucket .Spec .BucketClassName ,
162188 )
163189
164190 if ! strings .EqualFold (bucket .Spec .DriverName , b .driverName ) {
165191 klog .V (5 ).InfoS ("Skipping bucket for provisiner" ,
166- "bucket" , bucket .Name ,
192+ "bucket" , bucket .ObjectMeta . Name ,
167193 "driver" , bucket .Spec .DriverName ,
168194 )
169195 return nil
@@ -179,33 +205,24 @@ func (b *BucketListener) Delete(ctx context.Context, inputBucket *v1alpha1.Bucke
179205 if _ , err := b .provisionerClient .DriverDeleteBucket (ctx , req ); err != nil {
180206 if status .Code (err ) != codes .NotFound {
181207 klog .ErrorS (err , "Failed to delete bucket" ,
182- "bucket" , bucket .Name ,
208+ "bucket" , bucket .ObjectMeta . Name ,
183209 )
184210 return err
185211 }
186212 }
187213 }
188214
189- bucket .Status .BucketAvailable = false
190- bucket .Status .BucketID = ""
191-
192- // if this step fails, then controller will retry with backoff
193- if _ , err := b .Buckets ().UpdateStatus (ctx , bucket , metav1.UpdateOptions {}); err != nil {
194- klog .ErrorS (err , "Failed to update bucket" ,
195- "bucket" , bucket .Name )
196- return errors .Wrap (err , "Failed to update bucket" )
197- }
198-
199215 if bucket .Spec .BucketClaim != nil {
200216 ref := bucket .Spec .BucketClaim
201217 bucketClaim , err := b .BucketClaims (ref .Namespace ).Get (ctx , ref .Name , metav1.GetOptions {})
202218 if err != nil {
203219 return err
204220 }
205221
206- controllerutil .RemoveFinalizer (bucketClaim , brFinalizer )
207- if _ , err := b .BucketClaims (bucketClaim .Namespace ).Update (ctx , bucketClaim , metav1.UpdateOptions {}); err != nil {
208- return err
222+ if controllerutil .RemoveFinalizer (bucketClaim , bcFinalizer ) {
223+ if _ , err := b .BucketClaims (bucketClaim .Namespace ).Update (ctx , bucketClaim , metav1.UpdateOptions {}); err != nil {
224+ return err
225+ }
209226 }
210227 }
211228
@@ -227,6 +244,14 @@ func (b *BucketListener) BucketClaims(namespace string) bucketapi.BucketClaimInt
227244 panic ("uninitialized listener" )
228245}
229246
247+
248+ func (b * BucketListener ) BucketAccesses (namespace string ) bucketapi.BucketAccessInterface {
249+ if b .bucketClient != nil {
250+ return b .bucketClient .ObjectstorageV1alpha1 ().BucketAccesses (namespace )
251+ }
252+ panic ("uninitialized listener" )
253+ }
254+
230255// InitializeKubeClient initializes the kubernetes client
231256func (b * BucketListener ) InitializeKubeClient (k kube.Interface ) {
232257 b .kubeClient = k
0 commit comments