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  }