github.com/ironcore-dev/gardener-extension-provider-ironcore@v0.3.2-0.20240314231816-8336447fb9a0/pkg/controller/backupentry/suite_test.go (about) 1 // SPDX-FileCopyrightText: 2022 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 "context" 8 "path/filepath" 9 "testing" 10 "time" 11 12 extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" 13 extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" 14 "github.com/ironcore-dev/controller-utils/buildutils" 15 "github.com/ironcore-dev/controller-utils/modutils" 16 storagev1alpha1 "github.com/ironcore-dev/ironcore/api/storage/v1alpha1" 17 utilsenvtest "github.com/ironcore-dev/ironcore/utils/envtest" 18 "github.com/ironcore-dev/ironcore/utils/envtest/apiserver" 19 . "github.com/onsi/ginkgo/v2" 20 . "github.com/onsi/gomega" 21 corev1 "k8s.io/api/core/v1" 22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 23 "k8s.io/client-go/kubernetes/scheme" 24 "k8s.io/client-go/rest" 25 "sigs.k8s.io/controller-runtime/pkg/client" 26 "sigs.k8s.io/controller-runtime/pkg/envtest" 27 "sigs.k8s.io/controller-runtime/pkg/envtest/komega" 28 logf "sigs.k8s.io/controller-runtime/pkg/log" 29 "sigs.k8s.io/controller-runtime/pkg/log/zap" 30 "sigs.k8s.io/controller-runtime/pkg/manager" 31 metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" 32 33 apiv1alpha1 "github.com/ironcore-dev/gardener-extension-provider-ironcore/pkg/apis/ironcore/v1alpha1" 34 ) 35 36 const ( 37 pollingInterval = 50 * time.Millisecond 38 eventuallyTimeout = 10 * time.Second 39 consistentlyDuration = 1 * time.Second 40 apiServiceTimeout = 5 * time.Minute 41 ) 42 43 var ( 44 testEnv *envtest.Environment 45 testEnvExt *utilsenvtest.EnvironmentExtensions 46 cfg *rest.Config 47 k8sClient client.Client 48 ) 49 50 func TestAPIs(t *testing.T) { 51 SetDefaultConsistentlyPollingInterval(pollingInterval) 52 SetDefaultEventuallyPollingInterval(pollingInterval) 53 SetDefaultEventuallyTimeout(eventuallyTimeout) 54 SetDefaultConsistentlyDuration(consistentlyDuration) 55 56 RegisterFailHandler(Fail) 57 RunSpecs(t, "Backupentry Controller Suite") 58 } 59 60 var _ = BeforeSuite(func() { 61 logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) 62 63 var err error 64 65 By("bootstrapping test environment") 66 testEnv = &envtest.Environment{ 67 CRDDirectoryPaths: []string{ 68 filepath.Join("..", "..", "..", "example", "20-crd-extensions.gardener.cloud_clusters.yaml"), 69 filepath.Join("..", "..", "..", "example", "20-crd-extensions.gardener.cloud_backupentries.yaml"), 70 }, 71 ErrorIfCRDPathMissing: true, 72 } 73 testEnvExt = &utilsenvtest.EnvironmentExtensions{ 74 APIServiceDirectoryPaths: []string{ 75 modutils.Dir("github.com/ironcore-dev/ironcore", "config", "apiserver", "apiservice", "bases"), 76 }, 77 ErrorIfAPIServicePathIsMissing: true, 78 } 79 80 cfg, err = utilsenvtest.StartWithExtensions(testEnv, testEnvExt) 81 Expect(err).NotTo(HaveOccurred()) 82 Expect(cfg).NotTo(BeNil()) 83 DeferCleanup(utilsenvtest.StopWithExtensions, testEnv, testEnvExt) 84 85 Expect(extensionsv1alpha1.AddToScheme(scheme.Scheme)).To(Succeed()) 86 Expect(extensionscontroller.AddToScheme(scheme.Scheme)).To(Succeed()) 87 Expect(corev1.AddToScheme(scheme.Scheme)).To(Succeed()) 88 Expect(apiv1alpha1.AddToScheme(scheme.Scheme)).To(Succeed()) 89 Expect(storagev1alpha1.AddToScheme(scheme.Scheme)).To(Succeed()) 90 91 // Init package-level k8sClient 92 k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) 93 Expect(err).NotTo(HaveOccurred()) 94 Expect(k8sClient).NotTo(BeNil()) 95 96 komega.SetClient(k8sClient) 97 98 apiSrv, err := apiserver.New(cfg, apiserver.Options{ 99 MainPath: "github.com/ironcore-dev/ironcore/cmd/ironcore-apiserver", 100 BuildOptions: []buildutils.BuildOption{buildutils.ModModeMod}, 101 ETCDServers: []string{testEnv.ControlPlane.Etcd.URL.String()}, 102 Host: testEnvExt.APIServiceInstallOptions.LocalServingHost, 103 Port: testEnvExt.APIServiceInstallOptions.LocalServingPort, 104 CertDir: testEnvExt.APIServiceInstallOptions.LocalServingCertDir, 105 }) 106 Expect(err).NotTo(HaveOccurred()) 107 108 Expect(apiSrv.Start()).To(Succeed()) 109 DeferCleanup(apiSrv.Stop) 110 111 err = utilsenvtest.WaitUntilAPIServicesReadyWithTimeout(apiServiceTimeout, testEnvExt, k8sClient, scheme.Scheme) 112 Expect(err).NotTo(HaveOccurred()) 113 }) 114 115 func SetupTest() (*manager.Manager, *corev1.Namespace) { 116 namespace := &corev1.Namespace{} 117 var mgr manager.Manager 118 119 BeforeEach(func(ctx SpecContext) { 120 var mgrCtx context.Context 121 mgrCtx, cancel := context.WithCancel(context.Background()) 122 DeferCleanup(cancel) 123 124 *namespace = corev1.Namespace{ 125 ObjectMeta: metav1.ObjectMeta{ 126 GenerateName: "testns-", 127 }, 128 } 129 Expect(k8sClient.Create(ctx, namespace)).To(Succeed(), "failed to create test namespace") 130 DeferCleanup(k8sClient.Delete, namespace) 131 132 var err error 133 mgr, err = manager.New(cfg, manager.Options{ 134 Scheme: scheme.Scheme, 135 Metrics: metricsserver.Options{BindAddress: "0"}, 136 }) 137 Expect(err).NotTo(HaveOccurred()) 138 139 user, err := testEnv.AddUser(envtest.User{ 140 Name: "dummy", 141 Groups: []string{"system:authenticated", "system:masters"}, 142 }, cfg) 143 Expect(err).NotTo(HaveOccurred()) 144 145 kubeconfig, err := user.KubeConfig() 146 Expect(err).NotTo(HaveOccurred()) 147 148 secret := &corev1.Secret{ 149 ObjectMeta: metav1.ObjectMeta{ 150 Namespace: namespace.Name, 151 Name: "backupprovider", 152 }, 153 Data: map[string][]byte{ 154 "namespace": []byte(namespace.Name), 155 "token": []byte("foo"), 156 "kubeconfig": kubeconfig, 157 }, 158 } 159 Expect(k8sClient.Create(ctx, secret)).To(Succeed()) 160 161 Expect(AddToManagerWithOptions(ctx, mgr, AddOptions{ 162 IgnoreOperationAnnotation: true, 163 })).NotTo(HaveOccurred()) 164 165 go func() { 166 defer GinkgoRecover() 167 Expect(mgr.Start(mgrCtx)).To(Succeed(), "failed to start manager") 168 }() 169 }) 170 171 return &mgr, namespace 172 }