@@ -36,7 +36,7 @@ import (
36
36
)
37
37
38
38
const (
39
- brFinalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
39
+ bcFinalizer = "cosi.objectstorage.k8s.io/bucketclaim-protection"
40
40
)
41
41
42
42
// BucketListener manages Bucket objects
@@ -67,74 +67,83 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
67
67
bucket := inputBucket .DeepCopy ()
68
68
69
69
klog .V (3 ).InfoS ("Add Bucket" ,
70
- "name" , bucket .Name ,
70
+ "name" , bucket .ObjectMeta . Name ,
71
71
"bucketclass" , bucket .Spec .BucketClassName ,
72
72
)
73
73
74
74
if ! strings .EqualFold (bucket .Spec .DriverName , b .driverName ) {
75
75
klog .V (5 ).InfoS ("Skipping bucket for driver" ,
76
- "bucket" , bucket .Name ,
76
+ "bucket" , bucket .ObjectMeta . Name ,
77
77
"driver" , bucket .Spec .DriverName ,
78
78
)
79
79
return nil
80
80
}
81
81
82
- if bucket .Status .BucketAvailable {
82
+ if bucket .Status .BucketReady {
83
83
klog .V (5 ).InfoS ("BucketExists" ,
84
- "bucket" , bucket .Name ,
84
+ "bucket" , bucket .ObjectMeta . Name ,
85
85
"driver" , bucket .Spec .DriverName ,
86
86
)
87
- return nil
88
- }
89
87
90
- req := & cosi.DriverCreateBucketRequest {
91
- Parameters : bucket .Spec .Parameters ,
92
- Name : bucket .Name ,
88
+ return nil
93
89
}
94
90
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 ,
101
98
}
102
99
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
+ }
113
107
114
- bucket . Status . BucketReady = true
108
+ }
115
109
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
+ }
122
115
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" )
128
121
return err
129
122
}
130
123
131
- bucketClaim .Status .BucketReady = true
132
124
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
+ }
135
137
}
136
138
}
137
139
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
+
138
147
return nil
139
148
}
140
149
@@ -146,6 +155,23 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
146
155
klog .V (3 ).InfoS ("Update Bucket" ,
147
156
"name" , old .Name )
148
157
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
+
149
175
return nil
150
176
}
151
177
@@ -157,13 +183,13 @@ func (b *BucketListener) Delete(ctx context.Context, inputBucket *v1alpha1.Bucke
157
183
bucket := inputBucket .DeepCopy ()
158
184
159
185
klog .V (3 ).InfoS ("Delete Bucket" ,
160
- "name" , bucket .Name ,
186
+ "name" , bucket .ObjectMeta . Name ,
161
187
"bucketclass" , bucket .Spec .BucketClassName ,
162
188
)
163
189
164
190
if ! strings .EqualFold (bucket .Spec .DriverName , b .driverName ) {
165
191
klog .V (5 ).InfoS ("Skipping bucket for provisiner" ,
166
- "bucket" , bucket .Name ,
192
+ "bucket" , bucket .ObjectMeta . Name ,
167
193
"driver" , bucket .Spec .DriverName ,
168
194
)
169
195
return nil
@@ -179,33 +205,24 @@ func (b *BucketListener) Delete(ctx context.Context, inputBucket *v1alpha1.Bucke
179
205
if _ , err := b .provisionerClient .DriverDeleteBucket (ctx , req ); err != nil {
180
206
if status .Code (err ) != codes .NotFound {
181
207
klog .ErrorS (err , "Failed to delete bucket" ,
182
- "bucket" , bucket .Name ,
208
+ "bucket" , bucket .ObjectMeta . Name ,
183
209
)
184
210
return err
185
211
}
186
212
}
187
213
}
188
214
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
-
199
215
if bucket .Spec .BucketClaim != nil {
200
216
ref := bucket .Spec .BucketClaim
201
217
bucketClaim , err := b .BucketClaims (ref .Namespace ).Get (ctx , ref .Name , metav1.GetOptions {})
202
218
if err != nil {
203
219
return err
204
220
}
205
221
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
+ }
209
226
}
210
227
}
211
228
@@ -227,6 +244,14 @@ func (b *BucketListener) BucketClaims(namespace string) bucketapi.BucketClaimInt
227
244
panic ("uninitialized listener" )
228
245
}
229
246
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
+
230
255
// InitializeKubeClient initializes the kubernetes client
231
256
func (b * BucketListener ) InitializeKubeClient (k kube.Interface ) {
232
257
b .kubeClient = k
0 commit comments