github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/apis/apps/v1alpha1/webhook_suite_test.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package v1alpha1 18 19 import ( 20 "context" 21 "crypto/tls" 22 "fmt" 23 "net" 24 "path/filepath" 25 "testing" 26 "time" 27 28 . "github.com/onsi/ginkgo/v2" 29 . "github.com/onsi/gomega" 30 31 corev1 "k8s.io/api/core/v1" 32 33 admissionv1 "k8s.io/api/admission/v1" 34 admissionregv1 "k8s.io/api/admissionregistration/v1" 35 36 // +kubebuilder:scaffold:imports 37 "go.uber.org/zap/zapcore" 38 storagev1 "k8s.io/api/storage/v1" 39 "k8s.io/apimachinery/pkg/runtime" 40 "k8s.io/client-go/rest" 41 ctrl "sigs.k8s.io/controller-runtime" 42 "sigs.k8s.io/controller-runtime/pkg/client" 43 "sigs.k8s.io/controller-runtime/pkg/envtest" 44 logf "sigs.k8s.io/controller-runtime/pkg/log" 45 "sigs.k8s.io/controller-runtime/pkg/log/zap" 46 47 "github.com/1aal/kubeblocks/pkg/testutil" 48 viper "github.com/1aal/kubeblocks/pkg/viperx" 49 ) 50 51 // These tests use Ginkgo (BDD-style Go testing framework). Refer to 52 // http://onsi.github.io/ginkgo/ to learn more about Ginkgo. 53 54 var cfg *rest.Config 55 var k8sClient client.Client 56 var testEnv *envtest.Environment 57 var ctx context.Context 58 var testCtx testutil.TestContext 59 var cancel context.CancelFunc 60 61 func init() { 62 viper.AutomaticEnv() 63 } 64 65 func TestAPIs(t *testing.T) { 66 RegisterFailHandler(Fail) 67 68 RunSpecs(t, "Webhook Suite") 69 } 70 71 var _ = BeforeSuite(func() { 72 73 if viper.GetBool("ENABLE_DEBUG_LOG") { 74 logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true), func(o *zap.Options) { 75 o.TimeEncoder = zapcore.ISO8601TimeEncoder 76 })) 77 } 78 79 ctx, cancel = context.WithCancel(context.TODO()) 80 81 webHookHostExternalName := testCtx.GetWebhookHostExternalName() 82 83 By("bootstrapping test environment") 84 testEnv = &envtest.Environment{ 85 CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "config", "crd", "bases")}, 86 ErrorIfCRDPathMissing: false, 87 WebhookInstallOptions: envtest.WebhookInstallOptions{ 88 Paths: []string{filepath.Join("..", "..", "..", "config", "webhook")}, 89 // LocalServingHost: "host.docker.internal", 90 // LocalServingPort: 28080, 91 LocalServingHostExternalName: webHookHostExternalName, 92 }, 93 } 94 95 var err error 96 // cfg is defined in this file globally. 97 cfg, err = testEnv.Start() 98 Expect(err).NotTo(HaveOccurred()) 99 Expect(cfg).NotTo(BeNil()) 100 101 scheme := runtime.NewScheme() 102 err = AddToScheme(scheme) 103 Expect(err).NotTo(HaveOccurred()) 104 105 err = admissionv1.AddToScheme(scheme) 106 Expect(err).NotTo(HaveOccurred()) 107 108 err = admissionregv1.AddToScheme(scheme) 109 Expect(err).NotTo(HaveOccurred()) 110 111 err = storagev1.AddToScheme(scheme) 112 Expect(err).NotTo(HaveOccurred()) 113 114 err = corev1.AddToScheme(scheme) 115 Expect(err).NotTo(HaveOccurred()) 116 117 // +kubebuilder:scaffold:scheme 118 119 k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) 120 Expect(err).NotTo(HaveOccurred()) 121 Expect(k8sClient).NotTo(BeNil()) 122 123 testCtx = testutil.NewDefaultTestContext(ctx, k8sClient, testEnv) 124 125 // start webhook server using Manager 126 webhookInstallOptions := &testEnv.WebhookInstallOptions 127 mgr, err := ctrl.NewManager(cfg, ctrl.Options{ 128 Scheme: scheme, 129 Host: webhookInstallOptions.LocalServingHost, 130 Port: webhookInstallOptions.LocalServingPort, 131 CertDir: webhookInstallOptions.LocalServingCertDir, 132 LeaderElection: false, 133 MetricsBindAddress: "0", 134 ClientDisableCacheFor: []client.Object{ 135 &storagev1.StorageClass{}, 136 &ClusterDefinition{}, 137 &Cluster{}, 138 &ClusterVersion{}, 139 &OpsRequest{}, 140 &ConfigConstraint{}, 141 }, 142 }) 143 Expect(err).NotTo(HaveOccurred()) 144 145 err = (&ClusterDefinition{}).SetupWebhookWithManager(mgr) 146 Expect(err).NotTo(HaveOccurred()) 147 148 err = (&ClusterVersion{}).SetupWebhookWithManager(mgr) 149 Expect(err).NotTo(HaveOccurred()) 150 151 err = (&Cluster{}).SetupWebhookWithManager(mgr) 152 Expect(err).NotTo(HaveOccurred()) 153 154 err = (&OpsRequest{}).SetupWebhookWithManager(mgr) 155 Expect(err).NotTo(HaveOccurred()) 156 157 err = (&ServiceDescriptor{}).SetupWebhookWithManager(mgr) 158 Expect(err).NotTo(HaveOccurred()) 159 160 RegisterWebhookManager(mgr) 161 162 testCtx = testutil.NewDefaultTestContext(ctx, k8sClient, testEnv) 163 164 // +kubebuilder:scaffold:webhook 165 166 go func() { 167 defer GinkgoRecover() 168 err = mgr.Start(ctx) 169 Expect(err).NotTo(HaveOccurred()) 170 }() 171 // wait for the webhook server to get ready 172 dialer := &net.Dialer{Timeout: time.Second} 173 addrPort := fmt.Sprintf("%s:%d", webhookInstallOptions.LocalServingHost, webhookInstallOptions.LocalServingPort) 174 Eventually(func() error { 175 conn, err := tls.DialWithDialer(dialer, "tcp", addrPort, &tls.Config{InsecureSkipVerify: true}) 176 if err != nil { 177 return err 178 } 179 conn.Close() 180 return nil 181 }).Should(Succeed()) 182 183 }) 184 185 var _ = AfterSuite(func() { 186 187 By("cleanup webhook configuration") 188 validatingWebhook := &admissionregv1.ValidatingWebhookConfiguration{} 189 validatingWebhook.Name = "validating-webhook-configuration" 190 err := k8sClient.Delete(ctx, validatingWebhook) 191 Expect(err).NotTo(HaveOccurred()) 192 193 mutatingWebhook := &admissionregv1.MutatingWebhookConfiguration{} 194 mutatingWebhook.Name = "mutating-webhook-configuration" 195 err = k8sClient.Delete(ctx, mutatingWebhook) 196 Expect(err).NotTo(HaveOccurred()) 197 198 cancel() 199 By("tearing down the test environment") 200 err = testEnv.Stop() 201 Expect(err).NotTo(HaveOccurred()) 202 })