@@ -7,11 +7,16 @@ import (
77
88 "github.com/go-logr/logr"
99 "github.com/stretchr/testify/assert"
10+ "github.com/stretchr/testify/require"
1011 "go.uber.org/mock/gomock"
1112 corev1 "k8s.io/api/core/v1"
13+ apierrors "k8s.io/apimachinery/pkg/api/errors"
14+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1215 "k8s.io/apimachinery/pkg/runtime"
16+ "k8s.io/apimachinery/pkg/runtime/schema"
1317 "k8s.io/apimachinery/pkg/types"
1418 "sigs.k8s.io/controller-runtime/pkg/client"
19+ "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1520
1621 infrav1alpha2 "github.com/linode/cluster-api-provider-linode/api/v1alpha2"
1722 "github.com/linode/cluster-api-provider-linode/mock"
@@ -232,3 +237,284 @@ func TestNewObjectStorageBucketScope(t *testing.T) {
232237 })
233238 }
234239}
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+ Namespace : "test" ,
430+ },
431+ },
432+ },
433+ Logger : & logr.Logger {},
434+ },
435+ },
436+ expectedErr : nil ,
437+ expects : func (k8s * mock.MockK8sClient ) {
438+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
439+ s := runtime .NewScheme ()
440+ infrav1alpha2 .AddToScheme (s )
441+ return s
442+ })
443+ 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 {
444+ cred := infrav1alpha2.LinodeObjectStorageKey {
445+ ObjectMeta : metav1.ObjectMeta {
446+ Name : "example" ,
447+ Namespace : "test" ,
448+ Finalizers : []string {"test-bucket" },
449+ },
450+ Spec : infrav1alpha2.LinodeObjectStorageKeySpec {
451+ BucketAccess : []infrav1alpha2.BucketAccessRef {{
452+ BucketName : "test-bucket" ,
453+ Permissions : "read_write" ,
454+ Region : "region" ,
455+ }},
456+ },
457+ }
458+ * obj = cred
459+ return nil
460+ })
461+ k8s .EXPECT ().Update (gomock .Any (), gomock .Any ()).DoAndReturn (func (ctx context.Context , obj client.Object , opts ... client.UpdateOption ) error {
462+ // Simulate adding a finalizer
463+ controllerutil .AddFinalizer (obj , "test-bucket" )
464+ return nil
465+ })
466+ },
467+ },
468+ {
469+ name : "Error - accessKeyRef doesn't exist" ,
470+ args : args {
471+ apiKey : "test-key" ,
472+ params : ObjectStorageBucketScopeParams {
473+ Client : nil ,
474+ Bucket : & infrav1alpha2.LinodeObjectStorageBucket {
475+ Spec : infrav1alpha2.LinodeObjectStorageBucketSpec {
476+ AccessKeyRef : & corev1.ObjectReference {
477+ Name : "example" ,
478+ Namespace : "test" ,
479+ },
480+ },
481+ },
482+ Logger : & logr.Logger {},
483+ },
484+ },
485+ expectedErr : fmt .Errorf ("not found" ),
486+ expects : func (k8s * mock.MockK8sClient ) {
487+ k8s .EXPECT ().Scheme ().DoAndReturn (func () * runtime.Scheme {
488+ s := runtime .NewScheme ()
489+ infrav1alpha2 .AddToScheme (s )
490+ return s
491+ })
492+ k8s .EXPECT ().Get (gomock .Any (), gomock .Any (), gomock .Any ()).Return (apierrors .NewNotFound (schema.GroupResource {}, "" ))
493+ },
494+ },
495+ }
496+ for _ , tt := range tests {
497+ testcase := tt
498+ t .Run (testcase .name , func (t * testing.T ) {
499+ t .Parallel ()
500+
501+ ctrl := gomock .NewController (t )
502+ defer ctrl .Finish ()
503+
504+ mockK8sClient := mock .NewMockK8sClient (ctrl )
505+
506+ testcase .expects (mockK8sClient )
507+
508+ testcase .args .params .Client = mockK8sClient
509+
510+ scope , err := NewObjectStorageBucketScope (t .Context (), ClientConfig {Token : testcase .args .apiKey }, testcase .args .params )
511+ require .NoError (t , err )
512+
513+ err = scope .RemoveAccessKeyRefFinalizer (t .Context (), tt .args .params .Bucket .Name )
514+
515+ if testcase .expectedErr != nil {
516+ assert .ErrorContains (t , err , testcase .expectedErr .Error ())
517+ }
518+ })
519+ }
520+ }
0 commit comments