Skip to content

Commit 898dd2b

Browse files
committed
add tests for bucket force deletion
1 parent b37e4f1 commit 898dd2b

File tree

16 files changed

+699
-6
lines changed

16 files changed

+699
-6
lines changed

cloud/scope/object_storage_bucket.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,14 @@ func (s *ObjectStorageBucketScope) getAccessKey(ctx context.Context) (*infrav1al
134134
return nil, fmt.Errorf("accessKeyRef is nil for bucket %s", s.Bucket.Name)
135135
}
136136

137+
objKeyNamespace := s.Bucket.Spec.AccessKeyRef.Namespace
138+
if s.Bucket.Spec.AccessKeyRef.Namespace == "" {
139+
objKeyNamespace = s.Bucket.Namespace
140+
}
141+
137142
objKey := client.ObjectKey{
138143
Name: s.Bucket.Spec.AccessKeyRef.Name,
139-
Namespace: s.Bucket.Spec.AccessKeyRef.Namespace,
140-
}
141-
if s.Bucket.Spec.AccessKeyRef.Namespace == "" {
142-
s.Bucket.Spec.AccessKeyRef.Namespace = s.Bucket.GetNamespace()
144+
Namespace: objKeyNamespace,
143145
}
144146

145147
objStorageKey := &infrav1alpha2.LinodeObjectStorageKey{}

cloud/scope/object_storage_bucket_test.go

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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,283 @@ 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+
},
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

Comments
 (0)