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  })