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