@@ -17,20 +17,25 @@ package bucketaccess
1717
1818import (
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) {
274279func 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