Skip to content

Commit d4075d3

Browse files
committed
Adding Update and Delete logic for Bucket and BucketAccess
1 parent 6251d12 commit d4075d3

File tree

2 files changed

+149
-104
lines changed

2 files changed

+149
-104
lines changed

container-object-storage-interface-provisioner-sidecar/pkg/bucket/bucket_controller.go

+82-57
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import (
3636
)
3737

3838
const (
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
231256
func (b *BucketListener) InitializeKubeClient(k kube.Interface) {
232257
b.kubeClient = k

0 commit comments

Comments
 (0)