@@ -7,11 +7,16 @@ import (
7
7
8
8
"github.com/go-logr/logr"
9
9
"github.com/stretchr/testify/assert"
10
+ "github.com/stretchr/testify/require"
10
11
"go.uber.org/mock/gomock"
11
12
corev1 "k8s.io/api/core/v1"
13
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
14
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12
15
"k8s.io/apimachinery/pkg/runtime"
16
+ "k8s.io/apimachinery/pkg/runtime/schema"
13
17
"k8s.io/apimachinery/pkg/types"
14
18
"sigs.k8s.io/controller-runtime/pkg/client"
19
+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
15
20
16
21
infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2"
17
22
"github.com/linode/cluster-api-provider-linode/mock"
@@ -232,3 +237,283 @@ func TestNewObjectStorageBucketScope(t *testing.T) {
232
237
})
233
238
}
234
239
}
240
+
241
+ func TestAddFinalizer (t * testing.T ) {
242
+ t .Parallel ()
243
+
244
+ ctrl := gomock .NewController (t )
245
+ defer ctrl .Finish ()
246
+
247
+ mockK8sClient := mock .NewMockK8sClient (ctrl )
248
+ mockK8sClient .EXPECT ().Scheme ().AnyTimes ().DoAndReturn (func () * runtime.Scheme {
249
+ s := runtime .NewScheme ()
250
+ infrav1alpha2 .AddToScheme (s )
251
+ return s
252
+ })
253
+ mockK8sClient .EXPECT ().Patch (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).Times (1 )
254
+
255
+ bucket := & infrav1alpha2.LinodeObjectStorageBucket {
256
+ ObjectMeta : metav1.ObjectMeta {
257
+ Name : "test-bucket" ,
258
+ Namespace : "test-namespace" ,
259
+ },
260
+ }
261
+ scope , err := NewObjectStorageBucketScope (t .Context (), ClientConfig {Token : "test-token" }, ObjectStorageBucketScopeParams {
262
+ Client : mockK8sClient ,
263
+ Bucket : bucket ,
264
+ Logger : & logr.Logger {},
265
+ })
266
+ require .NoError (t , err )
267
+
268
+ err = scope .AddFinalizer (t .Context ())
269
+ require .NoError (t , err )
270
+ }
271
+
272
+ func TestAddAccessKeyRefFinalizer (t * testing.T ) {
273
+ t .Parallel ()
274
+ type args struct {
275
+ apiKey string
276
+ params ObjectStorageBucketScopeParams
277
+ }
278
+ tests := []struct {
279
+ name string
280
+ args args
281
+ expectedErr error
282
+ expects func (k8s * mock.MockK8sClient )
283
+ clientBuildFunc func (apiKey string ) (LinodeClient , error )
284
+ }{
285
+ {
286
+ name : "Success - no AccessKeyRef" ,
287
+ args : args {
288
+ apiKey : "apikey" ,
289
+ params : ObjectStorageBucketScopeParams {
290
+ Client : nil ,
291
+ Bucket : & infrav1alpha2.LinodeObjectStorageBucket {},
292
+ Logger : & logr.Logger {},
293
+ },
294
+ },
295
+ expectedErr : nil ,
296
+ expects : func (k8s * mock.MockK8sClient ) {
297
+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
298
+ s := runtime .NewScheme ()
299
+ infrav1alpha2 .AddToScheme (s )
300
+ return s
301
+ })
302
+ },
303
+ },
304
+ {
305
+ name : "Success - valid AccessKeyRef" ,
306
+ args : args {
307
+ apiKey : "apikey" ,
308
+ params : ObjectStorageBucketScopeParams {
309
+ Client : nil ,
310
+ Bucket : & infrav1alpha2.LinodeObjectStorageBucket {
311
+ Spec : infrav1alpha2.LinodeObjectStorageBucketSpec {
312
+ AccessKeyRef : & corev1.ObjectReference {
313
+ Name : "example" ,
314
+ Namespace : "test" ,
315
+ },
316
+ },
317
+ },
318
+ Logger : & logr.Logger {},
319
+ },
320
+ },
321
+ expectedErr : nil ,
322
+ expects : func (k8s * mock.MockK8sClient ) {
323
+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
324
+ s := runtime .NewScheme ()
325
+ infrav1alpha2 .AddToScheme (s )
326
+ return s
327
+ })
328
+ k8s .EXPECT ().Get (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).DoAndReturn (func (ctx context.Context , name types.NamespacedName , obj * infrav1alpha2.LinodeObjectStorageKey , opts ... client.GetOption ) error {
329
+ cred := infrav1alpha2.LinodeObjectStorageKey {
330
+ ObjectMeta : metav1.ObjectMeta {
331
+ Name : "example" ,
332
+ Namespace : "test" ,
333
+ },
334
+ Spec : infrav1alpha2.LinodeObjectStorageKeySpec {
335
+ BucketAccess : []infrav1alpha2.BucketAccessRef {{
336
+ BucketName : "test-bucket" ,
337
+ Permissions : "read_write" ,
338
+ Region : "region" ,
339
+ }},
340
+ },
341
+ }
342
+ * obj = cred
343
+ return nil
344
+ })
345
+ k8s .EXPECT ().Update (gomock .Any (), gomock .Any ()).DoAndReturn (func (ctx context.Context , obj client.Object , opts ... client.UpdateOption ) error {
346
+ // Simulate adding a finalizer
347
+ controllerutil .AddFinalizer (obj , "test-bucket" )
348
+ return nil
349
+ })
350
+ },
351
+ },
352
+ {
353
+ name : "Error - accessKeyRef doesn't exist" ,
354
+ args : args {
355
+ apiKey : "test-key" ,
356
+ params : ObjectStorageBucketScopeParams {
357
+ Client : nil ,
358
+ Bucket : & infrav1alpha2.LinodeObjectStorageBucket {
359
+ Spec : infrav1alpha2.LinodeObjectStorageBucketSpec {
360
+ AccessKeyRef : & corev1.ObjectReference {
361
+ Name : "example" ,
362
+ Namespace : "test" ,
363
+ },
364
+ },
365
+ },
366
+ Logger : & logr.Logger {},
367
+ },
368
+ },
369
+ expectedErr : fmt .Errorf ("not found" ),
370
+ expects : func (k8s * mock.MockK8sClient ) {
371
+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
372
+ s := runtime .NewScheme ()
373
+ infrav1alpha2 .AddToScheme (s )
374
+ return s
375
+ })
376
+ k8s .EXPECT ().Get (gomock .Any (), gomock .Any (), gomock .Any ()).Return (apierrors .NewNotFound (schema.GroupResource {}, "" ))
377
+ },
378
+ },
379
+ }
380
+ for _ , tt := range tests {
381
+ testcase := tt
382
+ t .Run (testcase .name , func (t * testing.T ) {
383
+ t .Parallel ()
384
+
385
+ ctrl := gomock .NewController (t )
386
+ defer ctrl .Finish ()
387
+
388
+ mockK8sClient := mock .NewMockK8sClient (ctrl )
389
+
390
+ testcase .expects (mockK8sClient )
391
+
392
+ testcase .args .params .Client = mockK8sClient
393
+
394
+ scope , err := NewObjectStorageBucketScope (t .Context (), ClientConfig {Token : testcase .args .apiKey }, testcase .args .params )
395
+ require .NoError (t , err )
396
+
397
+ err = scope .AddAccessKeyRefFinalizer (t .Context (), tt .args .params .Bucket .Name )
398
+
399
+ if testcase .expectedErr != nil {
400
+ assert .ErrorContains (t , err , testcase .expectedErr .Error ())
401
+ }
402
+ })
403
+ }
404
+ }
405
+
406
+ func TestRemoveAccessKeyRefFinalizer (t * testing.T ) {
407
+ t .Parallel ()
408
+ type args struct {
409
+ apiKey string
410
+ params ObjectStorageBucketScopeParams
411
+ }
412
+ tests := []struct {
413
+ name string
414
+ args args
415
+ expectedErr error
416
+ expects func (k8s * mock.MockK8sClient )
417
+ clientBuildFunc func (apiKey string ) (LinodeClient , error )
418
+ }{
419
+ {
420
+ name : "Success - valid AccessKeyRef" ,
421
+ args : args {
422
+ apiKey : "apikey" ,
423
+ params : ObjectStorageBucketScopeParams {
424
+ Client : nil ,
425
+ Bucket : & infrav1alpha2.LinodeObjectStorageBucket {
426
+ Spec : infrav1alpha2.LinodeObjectStorageBucketSpec {
427
+ AccessKeyRef : & corev1.ObjectReference {
428
+ Name : "example" ,
429
+ },
430
+ },
431
+ },
432
+ Logger : & logr.Logger {},
433
+ },
434
+ },
435
+ expectedErr : nil ,
436
+ expects : func (k8s * mock.MockK8sClient ) {
437
+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
438
+ s := runtime .NewScheme ()
439
+ infrav1alpha2 .AddToScheme (s )
440
+ return s
441
+ })
442
+ k8s .EXPECT ().Get (gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).DoAndReturn (func (ctx context.Context , name types.NamespacedName , obj * infrav1alpha2.LinodeObjectStorageKey , opts ... client.GetOption ) error {
443
+ cred := infrav1alpha2.LinodeObjectStorageKey {
444
+ ObjectMeta : metav1.ObjectMeta {
445
+ Name : "example" ,
446
+ Namespace : "test" ,
447
+ Finalizers : []string {"test-bucket" },
448
+ },
449
+ Spec : infrav1alpha2.LinodeObjectStorageKeySpec {
450
+ BucketAccess : []infrav1alpha2.BucketAccessRef {{
451
+ BucketName : "test-bucket" ,
452
+ Permissions : "read_write" ,
453
+ Region : "region" ,
454
+ }},
455
+ },
456
+ }
457
+ * obj = cred
458
+ return nil
459
+ })
460
+ k8s .EXPECT ().Update (gomock .Any (), gomock .Any ()).DoAndReturn (func (ctx context.Context , obj client.Object , opts ... client.UpdateOption ) error {
461
+ // Simulate adding a finalizer
462
+ controllerutil .AddFinalizer (obj , "test-bucket" )
463
+ return nil
464
+ })
465
+ },
466
+ },
467
+ {
468
+ name : "Error - accessKeyRef doesn't exist" ,
469
+ args : args {
470
+ apiKey : "test-key" ,
471
+ params : ObjectStorageBucketScopeParams {
472
+ Client : nil ,
473
+ Bucket : & infrav1alpha2.LinodeObjectStorageBucket {
474
+ Spec : infrav1alpha2.LinodeObjectStorageBucketSpec {
475
+ AccessKeyRef : & corev1.ObjectReference {
476
+ Name : "example" ,
477
+ Namespace : "test" ,
478
+ },
479
+ },
480
+ },
481
+ Logger : & logr.Logger {},
482
+ },
483
+ },
484
+ expectedErr : fmt .Errorf ("not found" ),
485
+ expects : func (k8s * mock.MockK8sClient ) {
486
+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
487
+ s := runtime .NewScheme ()
488
+ infrav1alpha2 .AddToScheme (s )
489
+ return s
490
+ })
491
+ k8s .EXPECT ().Get (gomock .Any (), gomock .Any (), gomock .Any ()).Return (apierrors .NewNotFound (schema.GroupResource {}, "" ))
492
+ },
493
+ },
494
+ }
495
+ for _ , tt := range tests {
496
+ testcase := tt
497
+ t .Run (testcase .name , func (t * testing.T ) {
498
+ t .Parallel ()
499
+
500
+ ctrl := gomock .NewController (t )
501
+ defer ctrl .Finish ()
502
+
503
+ mockK8sClient := mock .NewMockK8sClient (ctrl )
504
+
505
+ testcase .expects (mockK8sClient )
506
+
507
+ testcase .args .params .Client = mockK8sClient
508
+
509
+ scope , err := NewObjectStorageBucketScope (t .Context (), ClientConfig {Token : testcase .args .apiKey }, testcase .args .params )
510
+ require .NoError (t , err )
511
+
512
+ err = scope .RemoveAccessKeyRefFinalizer (t .Context (), tt .args .params .Bucket .Name )
513
+
514
+ if testcase .expectedErr != nil {
515
+ assert .ErrorContains (t , err , testcase .expectedErr .Error ())
516
+ }
517
+ })
518
+ }
519
+ }
0 commit comments