//go:build e2e // +build e2e package e2e import ( "fmt" "os" "os/exec" "testing" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "git.ryuvia.com/niklas/terdut-operator/test/utils" ) var ( // managerImage is the manager image to be built and loaded for testing. managerImage = "example.com/terdut-operator:v0.0.1" // shouldCleanupCertManager tracks whether CertManager was installed by this suite. shouldCleanupCertManager = false ) // TestE2E runs the e2e test suite to validate the solution in an isolated environment. // The default setup requires Kind and CertManager. // // To enable kubectl kuberc (use custom kubectl configurations), set: KUBECTL_KUBERC=true // By default, kuberc is disabled to ensure consistent test behavior across different environments. // To skip CertManager installation, set: CERT_MANAGER_INSTALL_SKIP=true func TestE2E(t *testing.T) { RegisterFailHandler(Fail) _, _ = fmt.Fprintf(GinkgoWriter, "Starting terdut-operator e2e test suite\n") RunSpecs(t, "e2e suite") } var _ = BeforeSuite(func() { By("building the manager image") cmd := exec.Command("make", "docker-build", fmt.Sprintf("IMG=%s", managerImage)) _, err := utils.Run(cmd) ExpectWithOffset(1, err).NotTo(HaveOccurred(), "Failed to build the manager image") // TODO(user): If you want to change the e2e test vendor from Kind, // ensure the image is built and available, then remove the following block. By("loading the manager image on Kind") err = utils.LoadImageToKindClusterWithName(managerImage) ExpectWithOffset(1, err).NotTo(HaveOccurred(), "Failed to load the manager image into Kind") configureKubectlKubeRC() setupCertManager() }) var _ = AfterSuite(func() { teardownCertManager() }) // Disable kubectl kuberc by default for test isolation. // This prevents local kubectl configurations from affecting test behavior. // To enable kuberc, set: KUBECTL_KUBERC=true func configureKubectlKubeRC() { if os.Getenv("KUBECTL_KUBERC") != "true" { By("disabling kubectl kuberc for test isolation") err := os.Setenv("KUBECTL_KUBERC", "false") ExpectWithOffset(1, err).NotTo(HaveOccurred(), "Failed to disable kubectl kuberc") _, _ = fmt.Fprintf(GinkgoWriter, "kubectl kuberc disabled for consistent test behavior (override with KUBECTL_KUBERC=true)\n") } else { _, _ = fmt.Fprintf(GinkgoWriter, "kubectl kuberc enabled (KUBECTL_KUBERC=true)\n") } } // setupCertManager installs CertManager if needed for webhook tests. // Skips installation if CERT_MANAGER_INSTALL_SKIP=true or if already present. func setupCertManager() { if os.Getenv("CERT_MANAGER_INSTALL_SKIP") == "true" { _, _ = fmt.Fprintf(GinkgoWriter, "Skipping CertManager installation (CERT_MANAGER_INSTALL_SKIP=true)\n") return } By("checking if CertManager is already installed") if utils.IsCertManagerCRDsInstalled() { _, _ = fmt.Fprintf(GinkgoWriter, "CertManager is already installed. Skipping installation.\n") return } // Mark for cleanup before installation to handle interruptions and partial installs. shouldCleanupCertManager = true By("installing CertManager") Expect(utils.InstallCertManager()).To(Succeed(), "Failed to install CertManager") } // teardownCertManager uninstalls CertManager if it was installed by setupCertManager. // This ensures we only remove what we installed. func teardownCertManager() { if !shouldCleanupCertManager { _, _ = fmt.Fprintf(GinkgoWriter, "Skipping CertManager cleanup (not installed by this suite)\n") return } By("uninstalling CertManager") utils.UninstallCertManager() }