Skip to content
This repository was archived by the owner on Dec 6, 2024. It is now read-only.

Commit d4a1a67

Browse files
committed
fix: added events to each error
Signed-off-by: Mateusz Urbanek <mateusz.urbanek.98@gmail.com>
1 parent b95108e commit d4a1a67

File tree

4 files changed

+62
-40
lines changed

4 files changed

+62
-40
lines changed

pkg/bucket/bucket_controller.go

+21-13
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
7373
"name", bucket.ObjectMeta.Name)
7474

7575
if bucket.Spec.BucketClassName == "" {
76-
b.recordEvent(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, "BucketClassName was not defined in the Bucket %v", bucket.Name)
77-
return fmt.Errorf("%w for Bucket %v", consts.ErrUndefinedBucketClassName, bucket.Name)
76+
return b.recordError(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, fmt.Errorf("%w for Bucket %v", consts.ErrUndefinedBucketClassName, bucket.Name))
7877
}
7978

8079
if !strings.EqualFold(bucket.Spec.DriverName, b.driverName) {
@@ -103,13 +102,12 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
103102
if bucket.Spec.Parameters == nil {
104103
bucketClass, err := b.bucketClasses().Get(ctx, bucket.Spec.BucketClassName, metav1.GetOptions{})
105104
if kubeerrors.IsNotFound(err) {
106-
b.recordEvent(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, err.Error())
107-
return err
105+
return b.recordError(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, err)
108106
} else if err != nil {
109107
klog.V(3).ErrorS(err, "Error fetching bucketClass",
110108
"bucketClass", bucket.Spec.BucketClassName,
111109
"bucket", bucket.ObjectMeta.Name)
112-
return err
110+
return b.recordError(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, err)
113111
}
114112

115113
if bucketClass.Parameters != nil {
@@ -130,8 +128,7 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
130128
rsp, err := b.provisionerClient.DriverCreateBucket(ctx, req)
131129
if err != nil {
132130
if status.Code(err) != codes.AlreadyExists {
133-
b.recordEvent(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, err.Error())
134-
return fmt.Errorf("failed to create bucket: %w", err)
131+
return b.recordError(inputBucket, v1.EventTypeWarning, events.FailedCreateBucket, fmt.Errorf("failed to create bucket: %w", err))
135132
}
136133
}
137134

@@ -159,15 +156,15 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
159156
klog.V(3).ErrorS(err, "Failed to get bucketClaim",
160157
"bucketClaim", ref.Name,
161158
"bucket", bucket.ObjectMeta.Name)
162-
return err
159+
return b.recordError(bucket, v1.EventTypeWarning, events.FailedCreateBucket, err)
163160
}
164161

165162
bucketClaim.Status.BucketReady = true
166163
if _, err = b.bucketClaims(bucketClaim.Namespace).UpdateStatus(ctx, bucketClaim, metav1.UpdateOptions{}); err != nil {
167164
klog.V(3).ErrorS(err, "Failed to update bucketClaim",
168165
"bucketClaim", ref.Name,
169166
"bucket", bucket.ObjectMeta.Name)
170-
return err
167+
return b.recordError(bucket, v1.EventTypeWarning, events.FailedCreateBucket, err)
171168
}
172169

173170
klog.V(5).Infof("Successfully updated status of bucketClaim: %s, bucket: %s", bucketClaim.ObjectMeta.Name, bucket.ObjectMeta.Name)
@@ -177,7 +174,8 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
177174
controllerutil.AddFinalizer(bucket, consts.BucketFinalizer)
178175
if bucket, err = b.buckets().Update(ctx, bucket, metav1.UpdateOptions{}); err != nil {
179176
klog.V(3).ErrorS(err, "Failed to update bucket finalizers", "bucket", bucket.ObjectMeta.Name)
180-
return fmt.Errorf("failed to update bucket finalizers: %w", err)
177+
return b.recordError(bucket, v1.EventTypeWarning, events.FailedCreateBucket,
178+
fmt.Errorf("failed to update bucket finalizers: %w", err))
181179
}
182180

183181
klog.V(5).Infof("Successfully added finalizer to bucket: %s", bucket.ObjectMeta.Name)
@@ -190,7 +188,8 @@ func (b *BucketListener) Add(ctx context.Context, inputBucket *v1alpha1.Bucket)
190188
if _, err = b.buckets().UpdateStatus(ctx, bucket, metav1.UpdateOptions{}); err != nil {
191189
klog.V(3).ErrorS(err, "Failed to update bucket status",
192190
"bucket", bucket.ObjectMeta.Name)
193-
return fmt.Errorf("failed to update bucket status: %w", err)
191+
return b.recordError(bucket, v1.EventTypeWarning, events.FailedCreateBucket,
192+
fmt.Errorf("failed to update bucket status: %w", err))
194193
}
195194

196195
klog.V(3).InfoS("Add Bucket success",
@@ -245,7 +244,7 @@ func (b *BucketListener) Update(ctx context.Context, old, new *v1alpha1.Bucket)
245244
if controllerutil.ContainsFinalizer(bucket, consts.BucketFinalizer) {
246245
err = b.deleteBucketOp(ctx, bucket)
247246
if err != nil {
248-
return err
247+
return b.recordError(bucket, v1.EventTypeWarning, events.FailedDeleteBucket, err)
249248
}
250249

251250
controllerutil.RemoveFinalizer(bucket, consts.BucketFinalizer)
@@ -337,7 +336,6 @@ func (b *BucketListener) deleteBucketOp(ctx context.Context, bucket *v1alpha1.Bu
337336

338337
if _, err := b.provisionerClient.DriverDeleteBucket(ctx, req); err != nil {
339338
if status.Code(err) != codes.NotFound {
340-
b.recordEvent(bucket, v1.EventTypeWarning, events.FailedDeleteBucket, err.Error())
341339
return fmt.Errorf("failed to delete bucket: %w", err)
342340
}
343341
}
@@ -399,6 +397,16 @@ func (b *BucketListener) bucketAccesses(namespace string) bucketapi.BucketAccess
399397
panic("uninitialized listener")
400398
}
401399

400+
// recordError during the processing of the objects
401+
func (b *BucketListener) recordError(subject runtime.Object, eventtype, reason string, err error) error {
402+
if b.eventRecorder == nil {
403+
return err
404+
}
405+
b.eventRecorder.Event(subject, eventtype, reason, err.Error())
406+
407+
return err
408+
}
409+
402410
// recordEvent during the processing of the objects
403411
func (b *BucketListener) recordEvent(subject runtime.Object, eventtype, reason, message string, args ...any) {
404412
if b.eventRecorder == nil {

pkg/bucket/bucket_controller_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ func TestRecordEvents(t *testing.T) {
175175
expectedEvent: newEvent(
176176
v1.EventTypeWarning,
177177
events.FailedCreateBucket,
178-
"BucketClassName was not defined in the Bucket bucket"),
178+
"BucketClassName not defined for Bucket bucket"),
179179
eventTrigger: func(t *testing.T, bl *BucketListener) {
180180
if err := bl.Add(context.TODO(), bucket.DeepCopy()); !errors.Is(err, consts.ErrUndefinedBucketClassName) {
181181
t.Errorf("expected %v error got %v", consts.ErrUndefinedBucketClassName, err)
@@ -225,7 +225,7 @@ func TestRecordEvents(t *testing.T) {
225225
expectedEvent: newEvent(
226226
v1.EventTypeWarning,
227227
events.FailedCreateBucket,
228-
"rpc error: code = Internal desc = internal error test"),
228+
"failed to create bucket: rpc error: code = Internal desc = internal error test"),
229229
cosiObjects: []runtime.Object{bucketClass},
230230
eventTrigger: func(t *testing.T, bl *BucketListener) {
231231
bucket := bucket.DeepCopy()
@@ -252,7 +252,7 @@ func TestRecordEvents(t *testing.T) {
252252
expectedEvent: newEvent(
253253
v1.EventTypeWarning,
254254
events.FailedDeleteBucket,
255-
"rpc error: code = Internal desc = internal error test"),
255+
"failed to delete bucket: rpc error: code = Internal desc = internal error test"),
256256
cosiObjects: []runtime.Object{bucketClaim},
257257
eventTrigger: func(t *testing.T, bl *BucketListener) {
258258
bucket := bucket.DeepCopy()

pkg/bucketaccess/bucketaccess_controller.go

+36-22
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
9393

9494
bucketAccessClass, err := bal.bucketAccessClasses().Get(ctx, bucketAccessClassName, metav1.GetOptions{})
9595
if kubeerrors.IsNotFound(err) {
96-
bal.recordEvent(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, err.Error())
97-
return err
96+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, err)
9897
} else if err != nil {
9998
klog.ErrorS(err, "Failed to fetch bucketAccessClass", "bucketAccessClass", bucketAccessClassName)
100-
return fmt.Errorf("failed to fetch BucketAccessClass: %w", err)
99+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
100+
fmt.Errorf("failed to fetch BucketAccessClass: %w", err))
101101
}
102102

103103
if !strings.EqualFold(bucketAccessClass.DriverName, bal.driverName) {
@@ -122,7 +122,8 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
122122
"bucketClaim", bucketClaim.Name,
123123
"bucketAccess", bucketAccess.ObjectMeta.Name,
124124
)
125-
return fmt.Errorf("invalid bucket state: %w", err)
125+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.WaitingForBucket,
126+
fmt.Errorf("invalid bucket state: %w", err))
126127
}
127128

128129
authType := cosi.AuthenticationType_UnknownAuthenticationType
@@ -134,8 +135,7 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
134135

135136
if authType == cosi.AuthenticationType_IAM && bucketAccess.Spec.ServiceAccountName == "" {
136137
err = consts.ErrUndefinedServiceAccountName
137-
bal.recordEvent(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, err.Error())
138-
return err
138+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, err)
139139
}
140140

141141
if bucketAccess.Status.AccessGranted == true {
@@ -149,16 +149,16 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
149149
bucket, err := bal.buckets().Get(ctx, bucketClaim.Status.BucketName, metav1.GetOptions{})
150150
if err != nil {
151151
klog.V(3).ErrorS(err, "Failed to fetch bucket", "bucket", bucketClaim.Status.BucketName)
152-
return fmt.Errorf("failed to fetch bucket: %w", err)
152+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
153+
fmt.Errorf("failed to fetch bucket: %w", err))
153154
}
154155

155156
if bucket.Status.BucketReady != true || bucket.Status.BucketID == "" {
156157
err = fmt.Errorf("%w: (isReady? %t), (ID empty? %t)",
157158
consts.ErrInvalidBucketState,
158159
bucket.Status.BucketReady,
159160
bucket.Status.BucketID == "")
160-
bal.recordEvent(inputBucketAccess, v1.EventTypeWarning, events.WaitingForBucket, err.Error())
161-
return err
161+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.WaitingForBucket, err)
162162
}
163163

164164
accountName := consts.AccountNamePrefix + string(bucketAccess.UID)
@@ -174,23 +174,24 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
174174
rsp, err := bal.provisionerClient.DriverGrantBucketAccess(ctx, req)
175175
if err != nil {
176176
if status.Code(err) != codes.AlreadyExists {
177-
bal.recordEvent(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, err.Error())
178-
return fmt.Errorf("failed to grant access: %w", err)
177+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
178+
fmt.Errorf("failed to grant bucket access: %w", err))
179179
}
180-
181180
}
182181

183182
if rsp.AccountId == "" {
184183
err = consts.ErrUndefinedAccountID
185184
klog.V(3).ErrorS(err, "BucketAccess", bucketAccess.ObjectMeta.Name)
186-
return fmt.Errorf("BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err)
185+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
186+
fmt.Errorf("BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err))
187187
}
188188

189189
credentials := rsp.Credentials
190190
if len(credentials) != 1 {
191191
err = consts.ErrInvalidCredentials
192192
klog.V(3).ErrorS(err, "BucketAccess", bucketAccess.ObjectMeta.Name)
193-
return fmt.Errorf("BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err)
193+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
194+
fmt.Errorf("BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err))
194195
}
195196

196197
bucketInfoName := consts.BucketInfoPrefix + string(bucketAccess.ObjectMeta.UID)
@@ -232,7 +233,7 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
232233

233234
stringData, err := json.Marshal(bucketInfo)
234235
if err != nil {
235-
return consts.ErrBucketInfoConversionFailed
236+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, consts.ErrBucketInfoConversionFailed)
236237
}
237238

238239
if _, err := bal.secrets(namespace).Get(ctx, secretCredName, metav1.GetOptions{}); err != nil {
@@ -241,7 +242,8 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
241242
"Failed to create secrets",
242243
"bucketAccess", bucketAccess.ObjectMeta.Name,
243244
"bucket", bucket.ObjectMeta.Name)
244-
return fmt.Errorf("failed to fetch secrets: %w", err)
245+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
246+
fmt.Errorf("failed to fetch secrets: %w", err))
245247
}
246248

247249
if _, err := bal.secrets(namespace).Create(ctx, &v1.Secret{
@@ -260,15 +262,16 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
260262
"Failed to create minted secret",
261263
"bucketAccess", bucketAccess.ObjectMeta.Name,
262264
"bucket", bucket.ObjectMeta.Name)
263-
return fmt.Errorf("failed to create minted secret: %w", err)
265+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
266+
fmt.Errorf("failed to create minted secret: %w", err))
264267
}
265268
}
266269
}
267270

268271
if controllerutil.AddFinalizer(bucket, consts.BABucketFinalizer) {
269272
_, err = bal.buckets().Update(ctx, bucket, metav1.UpdateOptions{})
270273
if err != nil {
271-
return err
274+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess, err)
272275
}
273276
}
274277

@@ -278,7 +281,8 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
278281
klog.V(3).ErrorS(err, "Failed to update BucketAccess finalizer",
279282
"bucketAccess", bucketAccess.ObjectMeta.Name,
280283
"bucket", bucket.ObjectMeta.Name)
281-
return fmt.Errorf("failed to update finalizer on BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err)
284+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
285+
fmt.Errorf("failed to update finalizer on BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err))
282286
}
283287
}
284288

@@ -290,7 +294,8 @@ func (bal *BucketAccessListener) Add(ctx context.Context, inputBucketAccess *v1a
290294
klog.V(3).ErrorS(err, "Failed to update BucketAccess Status",
291295
"bucketAccess", bucketAccess.ObjectMeta.Name,
292296
"bucket", bucket.ObjectMeta.Name)
293-
return fmt.Errorf("failed to update Status on BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err)
297+
return bal.recordError(inputBucketAccess, v1.EventTypeWarning, events.FailedGrantAccess,
298+
fmt.Errorf("failed to update Status on BucketAccess %s: %w", bucketAccess.ObjectMeta.Name, err))
294299
}
295300

296301
return nil
@@ -308,7 +313,7 @@ func (bal *BucketAccessListener) Update(ctx context.Context, old, new *v1alpha1.
308313
if !bucketAccess.GetDeletionTimestamp().IsZero() {
309314
err := bal.deleteBucketAccessOp(ctx, bucketAccess)
310315
if err != nil {
311-
return err
316+
return bal.recordError(bucketAccess, v1.EventTypeWarning, events.FailedRevokeAccess, err)
312317
}
313318
}
314319

@@ -353,7 +358,6 @@ func (bal *BucketAccessListener) deleteBucketAccessOp(ctx context.Context, bucke
353358

354359
// First we revoke the bucketAccess from the driver
355360
if _, err := bal.provisionerClient.DriverRevokeBucketAccess(ctx, req); err != nil {
356-
bal.recordEvent(bucketAccess, v1.EventTypeWarning, events.FailedRevokeAccess, err.Error())
357361
return fmt.Errorf("failed to revoke access: %w", err)
358362
}
359363

@@ -448,6 +452,16 @@ func (bal *BucketAccessListener) InitializeEventRecorder(er record.EventRecorder
448452
bal.eventRecorder = er
449453
}
450454

455+
// recordError during the processing of the objects
456+
func (b *BucketAccessListener) recordError(subject runtime.Object, eventtype, reason string, err error) error {
457+
if b.eventRecorder == nil {
458+
return err
459+
}
460+
b.eventRecorder.Event(subject, eventtype, reason, err.Error())
461+
462+
return err
463+
}
464+
451465
// recordEvent during the processing of the objects
452466
func (bal *BucketAccessListener) recordEvent(subject runtime.Object, eventtype, reason, message string, args ...any) {
453467
if bal.eventRecorder == nil {

pkg/bucketaccess/bucketaccess_controller_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ func TestRecordEvents(t *testing.T) {
417417
expectedEvent: newEvent(
418418
v1.EventTypeWarning,
419419
events.FailedGrantAccess,
420-
"rpc error: code = Internal desc = internal error test"),
420+
"failed to grant bucket access: rpc error: code = Internal desc = internal error test"),
421421
cosiObjects: []runtime.Object{bucketAccessClass, bucketClaim, bucketReady},
422422
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
423423
bucketAccess := bucketAccess.DeepCopy()
@@ -444,7 +444,7 @@ func TestRecordEvents(t *testing.T) {
444444
expectedEvent: newEvent(
445445
v1.EventTypeWarning,
446446
events.FailedRevokeAccess,
447-
"rpc error: code = Internal desc = internal error test"),
447+
"failed to revoke access: rpc error: code = Internal desc = internal error test"),
448448
cosiObjects: []runtime.Object{bucketAccessClass, bucketClaim, bucketReady},
449449
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
450450
bucketAccess := bucketAccess.DeepCopy()

0 commit comments

Comments
 (0)