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

Commit 172591d

Browse files
committed
test(bucketaccess): added event tests
Signed-off-by: Mateusz Urbanek <[email protected]>
1 parent ac094de commit 172591d

File tree

2 files changed

+107
-26
lines changed

2 files changed

+107
-26
lines changed

Diff for: pkg/bucketaccess/bucketaccess_controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ func (bal *BucketAccessListener) deleteBucketAccessOp(ctx context.Context, bucke
353353

354354
// First we revoke the bucketAccess from the driver
355355
if _, err := bal.provisionerClient.DriverRevokeBucketAccess(ctx, req); err != nil {
356-
bal.recordEvent(bucketAccess, v1.EventTypeWarning, events.FailedRevokeAccess, "Failed to revoke bucket access.")
356+
bal.recordEvent(bucketAccess, v1.EventTypeWarning, events.FailedRevokeAccess, err.Error())
357357
return fmt.Errorf("failed to revoke access: %w", err)
358358
}
359359

Diff for: pkg/bucketaccess/bucketaccess_controller_test.go

+106-25
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,25 @@ package bucketaccess
1717

1818
import (
1919
"context"
20+
"errors"
2021
"fmt"
2122
"strings"
2223
"testing"
2324
"time"
2425

2526
"google.golang.org/grpc"
27+
"google.golang.org/grpc/codes"
28+
"google.golang.org/grpc/status"
2629
v1 "k8s.io/api/core/v1"
30+
kubeerrors "k8s.io/apimachinery/pkg/api/errors"
2731
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2832
"k8s.io/apimachinery/pkg/runtime"
2933
fakekubeclientset "k8s.io/client-go/kubernetes/fake"
3034
"k8s.io/client-go/tools/record"
3135
"sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1"
3236
fakebucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake"
3337
"sigs.k8s.io/container-object-storage-interface-api/controller/events"
38+
"sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/pkg/consts"
3439
cosi "sigs.k8s.io/container-object-storage-interface-spec"
3540
fakespec "sigs.k8s.io/container-object-storage-interface-spec/fake"
3641
)
@@ -257,10 +262,10 @@ func TestAddBucketAccess(t *testing.T) {
257262

258263
updatedBA, _ := bal.bucketAccesses(ns).Get(ctx, ba.ObjectMeta.Name, metav1.GetOptions{})
259264
if updatedBA.Status.AccessGranted != true {
260-
t.Errorf("Expected %t, got %t", true, ba.Status.AccessGranted)
265+
t.Errorf("expected %t, got %t", true, ba.Status.AccessGranted)
261266
}
262267
if !strings.EqualFold(updatedBA.Status.AccountID, accountId) {
263-
t.Errorf("Expected %s, got %s", accountId, updatedBA.Status.AccountID)
268+
t.Errorf("expected %s, got %s", accountId, updatedBA.Status.AccountID)
264269
}
265270

266271
_, err = bal.secrets(ns).Get(ctx, secretName, metav1.GetOptions{})
@@ -274,6 +279,54 @@ func TestAddBucketAccess(t *testing.T) {
274279
func TestRecordEvents(t *testing.T) {
275280
t.Parallel()
276281

282+
var (
283+
// bucketClass = &v1alpha1.BucketClass{
284+
// ObjectMeta: metav1.ObjectMeta{
285+
// Name: "bucket-class",
286+
// },
287+
// }
288+
bucket = &v1alpha1.Bucket{
289+
ObjectMeta: metav1.ObjectMeta{
290+
Name: "bucket",
291+
},
292+
}
293+
bucketReady = &v1alpha1.Bucket{
294+
ObjectMeta: metav1.ObjectMeta{
295+
Name: "bucket",
296+
},
297+
Status: v1alpha1.BucketStatus{
298+
BucketReady: true,
299+
BucketID: "test",
300+
},
301+
}
302+
bucketClaim = &v1alpha1.BucketClaim{
303+
ObjectMeta: metav1.ObjectMeta{
304+
Name: "bucket-claim",
305+
},
306+
Status: v1alpha1.BucketClaimStatus{
307+
BucketReady: true,
308+
BucketName: bucket.GetObjectMeta().GetName(),
309+
},
310+
}
311+
bucketAccessClass = &v1alpha1.BucketAccessClass{
312+
ObjectMeta: metav1.ObjectMeta{
313+
Name: "bucket-access-class",
314+
},
315+
DriverName: "test",
316+
AuthenticationType: v1alpha1.AuthenticationTypeIAM,
317+
}
318+
bucketAccess = &v1alpha1.BucketAccess{
319+
ObjectMeta: metav1.ObjectMeta{
320+
Name: "bucket-access",
321+
},
322+
Spec: v1alpha1.BucketAccessSpec{
323+
CredentialsSecretName: "credentials",
324+
BucketAccessClassName: bucketAccessClass.GetObjectMeta().GetName(),
325+
BucketClaimName: bucketClaim.GetObjectMeta().GetName(),
326+
},
327+
}
328+
)
329+
277330
for _, tc := range []struct {
278331
name string
279332
expectedEvent string
@@ -282,13 +335,17 @@ func TestRecordEvents(t *testing.T) {
282335
eventTrigger func(*testing.T, *BucketAccessListener)
283336
}{
284337
{
285-
name: "",
338+
name: "BucketAccessClassNotFound",
286339
expectedEvent: newEvent(
287340
v1.EventTypeWarning,
288341
events.FailedGrantAccess,
289-
""),
342+
"bucketaccessclasses.objectstorage.k8s.io \"bucket-access-class\" not found"),
290343
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
291-
panic("unimplemented")
344+
bucketAccess := bucketAccess.DeepCopy()
345+
346+
if err := bal.Add(context.TODO(), bucketAccess); !kubeerrors.IsNotFound(err) {
347+
t.Errorf("expected Not Found error got %v", err)
348+
}
292349
},
293350
driver: struct{ fakespec.FakeProvisionerClient }{
294351
FakeProvisionerClient: fakespec.FakeProvisionerClient{
@@ -297,19 +354,24 @@ func TestRecordEvents(t *testing.T) {
297354
_ *cosi.DriverGrantBucketAccessRequest,
298355
_ ...grpc.CallOption,
299356
) (*cosi.DriverGrantBucketAccessResponse, error) {
300-
panic("unimplemented")
357+
panic("should not be reached")
301358
},
302359
},
303360
},
304361
},
305362
{
306-
name: "",
363+
name: "UndefinedServiceAccountName",
307364
expectedEvent: newEvent(
308365
v1.EventTypeWarning,
309366
events.FailedGrantAccess,
310-
""),
367+
consts.ErrUndefinedServiceAccountName.Error()),
368+
cosiObjects: []runtime.Object{bucketAccessClass, bucketClaim},
311369
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
312-
panic("unimplemented")
370+
bucketAccess := bucketAccess.DeepCopy()
371+
372+
if err := bal.Add(context.TODO(), bucketAccess); !errors.Is(err, consts.ErrUndefinedServiceAccountName) {
373+
t.Errorf("expected %v got %v", consts.ErrUndefinedServiceAccountName, err)
374+
}
313375
},
314376
driver: struct{ fakespec.FakeProvisionerClient }{
315377
FakeProvisionerClient: fakespec.FakeProvisionerClient{
@@ -318,19 +380,25 @@ func TestRecordEvents(t *testing.T) {
318380
_ *cosi.DriverGrantBucketAccessRequest,
319381
_ ...grpc.CallOption,
320382
) (*cosi.DriverGrantBucketAccessResponse, error) {
321-
panic("unimplemented")
383+
panic("should not be reached")
322384
},
323385
},
324386
},
325387
},
326388
{
327-
name: "",
389+
name: "InvalidBucketState",
328390
expectedEvent: newEvent(
329391
v1.EventTypeWarning,
330-
events.FailedGrantAccess,
331-
""),
392+
events.WaitingForBucket,
393+
"BucketAccess can't be granted to Bucket not in Ready state: (isReady? false), (ID empty? true)"),
394+
cosiObjects: []runtime.Object{bucketAccessClass, bucketClaim, bucket},
332395
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
333-
panic("unimplemented")
396+
bucketAccess := bucketAccess.DeepCopy()
397+
bucketAccess.Spec.ServiceAccountName = "service-account"
398+
399+
if err := bal.Add(context.TODO(), bucketAccess); !errors.Is(err, consts.ErrInvalidBucketState) {
400+
t.Errorf("expected %v got %v", consts.ErrInvalidBucketState, err)
401+
}
334402
},
335403
driver: struct{ fakespec.FakeProvisionerClient }{
336404
FakeProvisionerClient: fakespec.FakeProvisionerClient{
@@ -339,19 +407,25 @@ func TestRecordEvents(t *testing.T) {
339407
_ *cosi.DriverGrantBucketAccessRequest,
340408
_ ...grpc.CallOption,
341409
) (*cosi.DriverGrantBucketAccessResponse, error) {
342-
panic("unimplemented")
410+
panic("should not be reached")
343411
},
344412
},
345413
},
346414
},
347415
{
348-
name: "",
416+
name: "GrantInternalError",
349417
expectedEvent: newEvent(
350418
v1.EventTypeWarning,
351-
events.WaitingForBucket,
352-
""),
419+
events.FailedGrantAccess,
420+
"rpc error: code = Internal desc = internal error test"),
421+
cosiObjects: []runtime.Object{bucketAccessClass, bucketClaim, bucketReady},
353422
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
354-
panic("unimplemented")
423+
bucketAccess := bucketAccess.DeepCopy()
424+
bucketAccess.Spec.ServiceAccountName = "service-account"
425+
426+
if err := bal.Add(context.TODO(), bucketAccess); status.Code(errors.Unwrap(err)) != codes.Internal {
427+
t.Errorf("expected Internal got %v", err)
428+
}
355429
},
356430
driver: struct{ fakespec.FakeProvisionerClient }{
357431
FakeProvisionerClient: fakespec.FakeProvisionerClient{
@@ -360,19 +434,26 @@ func TestRecordEvents(t *testing.T) {
360434
_ *cosi.DriverGrantBucketAccessRequest,
361435
_ ...grpc.CallOption,
362436
) (*cosi.DriverGrantBucketAccessResponse, error) {
363-
panic("unimplemented")
437+
return nil, status.Error(codes.Internal, "internal error test")
364438
},
365439
},
366440
},
367441
},
368442
{
369-
name: "",
443+
name: "RevokeInternalError",
370444
expectedEvent: newEvent(
371445
v1.EventTypeWarning,
372446
events.FailedRevokeAccess,
373-
""),
447+
"rpc error: code = Internal desc = internal error test"),
448+
cosiObjects: []runtime.Object{bucketAccessClass, bucketClaim, bucketReady},
374449
eventTrigger: func(t *testing.T, bal *BucketAccessListener) {
375-
panic("unimplemented")
450+
bucketAccess := bucketAccess.DeepCopy()
451+
time, _ := time.Parse(time.DateTime, "2006-01-02 15:04:05")
452+
bucketAccess.ObjectMeta.DeletionTimestamp = &metav1.Time{Time: time}
453+
454+
if err := bal.Update(context.TODO(), bucketAccess, bucketAccess); status.Code(errors.Unwrap(err)) != codes.Internal {
455+
t.Errorf("expected Internal got %v", err)
456+
}
376457
},
377458
driver: struct{ fakespec.FakeProvisionerClient }{
378459
FakeProvisionerClient: fakespec.FakeProvisionerClient{
@@ -381,7 +462,7 @@ func TestRecordEvents(t *testing.T) {
381462
_ *cosi.DriverRevokeBucketAccessRequest,
382463
_ ...grpc.CallOption,
383464
) (*cosi.DriverRevokeBucketAccessResponse, error) {
384-
panic("unimplemented")
465+
return nil, status.Error(codes.Internal, "internal error test")
385466
},
386467
},
387468
},
@@ -407,7 +488,7 @@ func TestRecordEvents(t *testing.T) {
407488
case event, ok := <-eventRecorder.Events:
408489
if ok {
409490
if event != tc.expectedEvent {
410-
t.Errorf("Expected %s \n got %s", tc.expectedEvent, event)
491+
t.Errorf("expected %s got %s", tc.expectedEvent, event)
411492
}
412493
} else {
413494
t.Error("channel closed, no event")

0 commit comments

Comments
 (0)