github.com/ironcore-dev/gardener-extension-provider-ironcore@v0.3.2-0.20240314231816-8336447fb9a0/pkg/controller/backupentry/actuator_test.go (about) 1 // SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors 2 // SPDX-License-Identifier: Apache-2.0 3 4 package backupentry 5 6 import ( 7 "fmt" 8 9 "github.com/aws/aws-sdk-go/aws" 10 "github.com/aws/aws-sdk-go/service/s3" 11 "github.com/gardener/gardener/extensions/pkg/controller/backupentry/genericactuator" 12 extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" 13 "github.com/go-logr/logr" 14 storagev1alpha1 "github.com/ironcore-dev/ironcore/api/storage/v1alpha1" 15 . "github.com/onsi/ginkgo/v2" 16 . "github.com/onsi/gomega" 17 "go.uber.org/mock/gomock" 18 corev1 "k8s.io/api/core/v1" 19 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 20 "sigs.k8s.io/controller-runtime/pkg/client" 21 ) 22 23 var _ = Describe("BackupEntry Delete", func() { 24 mgr, ns := SetupTest() 25 26 var ( 27 ctrl *gomock.Controller 28 a genericactuator.BackupEntryDelegate 29 log logr.Logger 30 mockS3ObjectLister *Mocks3ObjectLister 31 ) 32 33 BeforeEach(func(ctx SpecContext) { 34 a = newActuator(*mgr) 35 Expect(a).NotTo(BeNil()) 36 37 ctrl = gomock.NewController(GinkgoT()) 38 mockS3ObjectLister = NewMocks3ObjectLister(ctrl) 39 40 objectLister = mockS3ObjectLister 41 }) 42 43 It("should delete Backupentry", func(ctx SpecContext) { 44 45 By("creating an Ironcore bucket resource") 46 bucketName := "test-bucket" 47 bucket := &storagev1alpha1.Bucket{ 48 ObjectMeta: metav1.ObjectMeta{ 49 Namespace: ns.Name, 50 Name: bucketName, 51 }, 52 Spec: storagev1alpha1.BucketSpec{ 53 BucketClassRef: &corev1.LocalObjectReference{ 54 Name: "test-bucket-class", 55 }, 56 BucketPoolSelector: map[string]string{ 57 "key": "value", 58 }, 59 BucketPoolRef: &corev1.LocalObjectReference{ 60 Name: "my-bucket-pool", 61 }, 62 }, 63 } 64 Expect(k8sClient.Create(ctx, bucket)).Should(Succeed()) 65 66 By("creating a secret with credentials data to access ironcore bucket") 67 secret := &corev1.Secret{ 68 ObjectMeta: metav1.ObjectMeta{ 69 Namespace: ns.Name, 70 Name: "test-secret", 71 }, 72 Data: map[string][]byte{ 73 "accessKeyID": []byte("test-access-key"), 74 "secretAccessKey": []byte("test-secret-access-key"), 75 "endpoint": []byte("endpoint-efef-ihfbd-ssadd.storage"), 76 }, 77 } 78 Expect(k8sClient.Create(ctx, secret)).To(Succeed()) 79 DeferCleanup(k8sClient.Delete, secret) 80 81 By("patching ironcore bucket with available state and credentials secret") 82 bucketBase := bucket.DeepCopy() 83 bucket.Status.State = storagev1alpha1.BucketStateAvailable 84 bucket.Status.Access = &storagev1alpha1.BucketAccess{ 85 SecretRef: &corev1.LocalObjectReference{ 86 Name: secret.Name, 87 }, 88 Endpoint: "s3-storage-endpoint", 89 } 90 Expect(k8sClient.Status().Patch(ctx, bucket, client.MergeFrom(bucketBase))).To(Succeed()) 91 DeferCleanup(k8sClient.Delete, bucket) 92 93 By("creating a BackupEntry") 94 backupEntry := &extensionsv1alpha1.BackupEntry{ 95 ObjectMeta: metav1.ObjectMeta{ 96 Namespace: ns.Name, 97 Name: "test-backup-entry", 98 }, 99 Spec: extensionsv1alpha1.BackupEntrySpec{ 100 Region: "foo", 101 BucketName: bucketName, 102 SecretRef: corev1.SecretReference{ 103 Name: secret.Name, 104 Namespace: ns.Name, 105 }, 106 }, 107 } 108 Expect(k8sClient.Create(ctx, backupEntry)).To(Succeed()) 109 110 in := &s3.ListObjectsInput{ 111 Bucket: aws.String(bucketName), 112 Prefix: aws.String(fmt.Sprintf("%s/", backupEntry.Name)), 113 } 114 mockS3ObjectLister.EXPECT().ListObjectsPages(ctx, gomock.Any(), in, backupEntry.Spec.BucketName).Return(nil) 115 116 By("deleting the BackupEntry") 117 Expect(a.Delete(ctx, log, backupEntry)).Should(Succeed()) 118 }) 119 120 })