@@ -17,20 +17,25 @@ package bucketaccess
17
17
18
18
import (
19
19
"context"
20
+ "errors"
20
21
"fmt"
21
22
"strings"
22
23
"testing"
23
24
"time"
24
25
25
26
"google.golang.org/grpc"
27
+ "google.golang.org/grpc/codes"
28
+ "google.golang.org/grpc/status"
26
29
v1 "k8s.io/api/core/v1"
30
+ kubeerrors "k8s.io/apimachinery/pkg/api/errors"
27
31
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
32
"k8s.io/apimachinery/pkg/runtime"
29
33
fakekubeclientset "k8s.io/client-go/kubernetes/fake"
30
34
"k8s.io/client-go/tools/record"
31
35
"sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1"
32
36
fakebucketclientset "sigs.k8s.io/container-object-storage-interface-api/client/clientset/versioned/fake"
33
37
"sigs.k8s.io/container-object-storage-interface-api/controller/events"
38
+ "sigs.k8s.io/container-object-storage-interface-provisioner-sidecar/pkg/consts"
34
39
cosi "sigs.k8s.io/container-object-storage-interface-spec"
35
40
fakespec "sigs.k8s.io/container-object-storage-interface-spec/fake"
36
41
)
@@ -257,10 +262,10 @@ func TestAddBucketAccess(t *testing.T) {
257
262
258
263
updatedBA , _ := bal .bucketAccesses (ns ).Get (ctx , ba .ObjectMeta .Name , metav1.GetOptions {})
259
264
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 )
261
266
}
262
267
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 )
264
269
}
265
270
266
271
_ , err = bal .secrets (ns ).Get (ctx , secretName , metav1.GetOptions {})
@@ -274,6 +279,54 @@ func TestAddBucketAccess(t *testing.T) {
274
279
func TestRecordEvents (t * testing.T ) {
275
280
t .Parallel ()
276
281
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
+
277
330
for _ , tc := range []struct {
278
331
name string
279
332
expectedEvent string
@@ -282,13 +335,17 @@ func TestRecordEvents(t *testing.T) {
282
335
eventTrigger func (* testing.T , * BucketAccessListener )
283
336
}{
284
337
{
285
- name : "" ,
338
+ name : "BucketAccessClassNotFound " ,
286
339
expectedEvent : newEvent (
287
340
v1 .EventTypeWarning ,
288
341
events .FailedGrantAccess ,
289
- "" ),
342
+ "bucketaccessclasses.objectstorage.k8s.io \" bucket-access-class \" not found " ),
290
343
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
+ }
292
349
},
293
350
driver : struct { fakespec.FakeProvisionerClient }{
294
351
FakeProvisionerClient : fakespec.FakeProvisionerClient {
@@ -297,19 +354,24 @@ func TestRecordEvents(t *testing.T) {
297
354
_ * cosi.DriverGrantBucketAccessRequest ,
298
355
_ ... grpc.CallOption ,
299
356
) (* cosi.DriverGrantBucketAccessResponse , error ) {
300
- panic ("unimplemented " )
357
+ panic ("should not be reached " )
301
358
},
302
359
},
303
360
},
304
361
},
305
362
{
306
- name : "" ,
363
+ name : "UndefinedServiceAccountName " ,
307
364
expectedEvent : newEvent (
308
365
v1 .EventTypeWarning ,
309
366
events .FailedGrantAccess ,
310
- "" ),
367
+ consts .ErrUndefinedServiceAccountName .Error ()),
368
+ cosiObjects : []runtime.Object {bucketAccessClass , bucketClaim },
311
369
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
+ }
313
375
},
314
376
driver : struct { fakespec.FakeProvisionerClient }{
315
377
FakeProvisionerClient : fakespec.FakeProvisionerClient {
@@ -318,19 +380,25 @@ func TestRecordEvents(t *testing.T) {
318
380
_ * cosi.DriverGrantBucketAccessRequest ,
319
381
_ ... grpc.CallOption ,
320
382
) (* cosi.DriverGrantBucketAccessResponse , error ) {
321
- panic ("unimplemented " )
383
+ panic ("should not be reached " )
322
384
},
323
385
},
324
386
},
325
387
},
326
388
{
327
- name : "" ,
389
+ name : "InvalidBucketState " ,
328
390
expectedEvent : newEvent (
329
391
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 },
332
395
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
+ }
334
402
},
335
403
driver : struct { fakespec.FakeProvisionerClient }{
336
404
FakeProvisionerClient : fakespec.FakeProvisionerClient {
@@ -339,19 +407,25 @@ func TestRecordEvents(t *testing.T) {
339
407
_ * cosi.DriverGrantBucketAccessRequest ,
340
408
_ ... grpc.CallOption ,
341
409
) (* cosi.DriverGrantBucketAccessResponse , error ) {
342
- panic ("unimplemented " )
410
+ panic ("should not be reached " )
343
411
},
344
412
},
345
413
},
346
414
},
347
415
{
348
- name : "" ,
416
+ name : "GrantInternalError " ,
349
417
expectedEvent : newEvent (
350
418
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 },
353
422
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
+ }
355
429
},
356
430
driver : struct { fakespec.FakeProvisionerClient }{
357
431
FakeProvisionerClient : fakespec.FakeProvisionerClient {
@@ -360,19 +434,26 @@ func TestRecordEvents(t *testing.T) {
360
434
_ * cosi.DriverGrantBucketAccessRequest ,
361
435
_ ... grpc.CallOption ,
362
436
) (* cosi.DriverGrantBucketAccessResponse , error ) {
363
- panic ( "unimplemented " )
437
+ return nil , status . Error ( codes . Internal , "internal error test " )
364
438
},
365
439
},
366
440
},
367
441
},
368
442
{
369
- name : "" ,
443
+ name : "RevokeInternalError " ,
370
444
expectedEvent : newEvent (
371
445
v1 .EventTypeWarning ,
372
446
events .FailedRevokeAccess ,
373
- "" ),
447
+ "rpc error: code = Internal desc = internal error test" ),
448
+ cosiObjects : []runtime.Object {bucketAccessClass , bucketClaim , bucketReady },
374
449
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
+ }
376
457
},
377
458
driver : struct { fakespec.FakeProvisionerClient }{
378
459
FakeProvisionerClient : fakespec.FakeProvisionerClient {
@@ -381,7 +462,7 @@ func TestRecordEvents(t *testing.T) {
381
462
_ * cosi.DriverRevokeBucketAccessRequest ,
382
463
_ ... grpc.CallOption ,
383
464
) (* cosi.DriverRevokeBucketAccessResponse , error ) {
384
- panic ( "unimplemented " )
465
+ return nil , status . Error ( codes . Internal , "internal error test " )
385
466
},
386
467
},
387
468
},
@@ -407,7 +488,7 @@ func TestRecordEvents(t *testing.T) {
407
488
case event , ok := <- eventRecorder .Events :
408
489
if ok {
409
490
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 )
411
492
}
412
493
} else {
413
494
t .Error ("channel closed, no event" )
0 commit comments