github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/controllers/apps/suite_test.go (about)

     1  /*
     2  Copyright (C) 2022-2023 ApeCloud Co., Ltd
     3  
     4  This file is part of KubeBlocks project
     5  
     6  This program is free software: you can redistribute it and/or modify
     7  it under the terms of the GNU Affero General Public License as published by
     8  the Free Software Foundation, either version 3 of the License, or
     9  (at your option) any later version.
    10  
    11  This program is distributed in the hope that it will be useful
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    14  GNU Affero General Public License for more details.
    15  
    16  You should have received a copy of the GNU Affero General Public License
    17  along with this program.  If not, see <http://www.gnu.org/licenses/>.
    18  */
    19  
    20  package apps
    21  
    22  import (
    23  	"context"
    24  	"fmt"
    25  	"go/build"
    26  	"path/filepath"
    27  	"testing"
    28  
    29  	. "github.com/onsi/ginkgo/v2"
    30  	. "github.com/onsi/gomega"
    31  
    32  	"github.com/go-logr/logr"
    33  	snapshotv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1"
    34  	"go.uber.org/zap/zapcore"
    35  	"k8s.io/client-go/kubernetes/scheme"
    36  	"k8s.io/client-go/rest"
    37  	"k8s.io/client-go/tools/record"
    38  	ctrl "sigs.k8s.io/controller-runtime"
    39  	"sigs.k8s.io/controller-runtime/pkg/client"
    40  	"sigs.k8s.io/controller-runtime/pkg/envtest"
    41  	logf "sigs.k8s.io/controller-runtime/pkg/log"
    42  	"sigs.k8s.io/controller-runtime/pkg/log/zap"
    43  
    44  	appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1"
    45  	dpv1alpha1 "github.com/1aal/kubeblocks/apis/dataprotection/v1alpha1"
    46  	workloads "github.com/1aal/kubeblocks/apis/workloads/v1alpha1"
    47  	"github.com/1aal/kubeblocks/controllers/apps/configuration"
    48  	"github.com/1aal/kubeblocks/controllers/k8score"
    49  	"github.com/1aal/kubeblocks/pkg/constant"
    50  	"github.com/1aal/kubeblocks/pkg/controller/model"
    51  	intctrlutil "github.com/1aal/kubeblocks/pkg/controllerutil"
    52  	"github.com/1aal/kubeblocks/pkg/testutil"
    53  	viper "github.com/1aal/kubeblocks/pkg/viperx"
    54  )
    55  
    56  // These tests use Ginkgo (BDD-style Go testing framework). Refer to
    57  // http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
    58  
    59  const (
    60  	testDataPlaneNodeAffinityKey = "testDataPlaneNodeAffinityKey"
    61  	testDataPlaneTolerationKey   = "testDataPlaneTolerationKey"
    62  )
    63  
    64  var cfg *rest.Config
    65  var k8sClient client.Client
    66  var testEnv *envtest.Environment
    67  var ctx context.Context
    68  var cancel context.CancelFunc
    69  var testCtx testutil.TestContext
    70  var clusterRecorder record.EventRecorder
    71  var systemAccountReconciler *SystemAccountReconciler
    72  var logger logr.Logger
    73  
    74  func init() {
    75  	viper.AutomaticEnv()
    76  	// viper.Set("ENABLE_DEBUG_LOG", "true")
    77  }
    78  
    79  func TestAPIs(t *testing.T) {
    80  	RegisterFailHandler(Fail)
    81  
    82  	RunSpecs(t, "Controller Suite")
    83  }
    84  
    85  var _ = BeforeSuite(func() {
    86  	if viper.GetBool("ENABLE_DEBUG_LOG") {
    87  		logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true), func(o *zap.Options) {
    88  			o.TimeEncoder = zapcore.ISO8601TimeEncoder
    89  		}))
    90  	}
    91  
    92  	viper.SetDefault(constant.CfgKeyCtrlrReconcileRetryDurationMS, 10)
    93  	viper.Set(constant.CfgKeyDataPlaneTolerations,
    94  		fmt.Sprintf("[{\"key\":\"%s\", \"operator\": \"Exists\", \"effect\": \"NoSchedule\"}]", testDataPlaneTolerationKey))
    95  	viper.Set(constant.CfgKeyDataPlaneAffinity,
    96  		fmt.Sprintf("{\"nodeAffinity\":{\"preferredDuringSchedulingIgnoredDuringExecution\":[{\"preference\":{\"matchExpressions\":[{\"key\":\"%s\",\"operator\":\"In\",\"values\":[\"true\"]}]},\"weight\":100}]}}", testDataPlaneNodeAffinityKey))
    97  	ctx, cancel = context.WithCancel(context.TODO())
    98  	logger = logf.FromContext(ctx).WithValues()
    99  	logger.Info("logger start")
   100  
   101  	By("bootstrapping test environment")
   102  	testEnv = &envtest.Environment{
   103  		CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases"),
   104  			// use dependent external CRDs.
   105  			// resolved by ref: https://github.com/operator-framework/operator-sdk/issues/4434#issuecomment-786794418
   106  			filepath.Join(build.Default.GOPATH, "pkg", "mod", "github.com", "kubernetes-csi/external-snapshotter/",
   107  				"client/v6@v6.2.0", "config", "crd")},
   108  		ErrorIfCRDPathMissing: true,
   109  	}
   110  
   111  	var err error
   112  	// cfg is defined in this file globally.
   113  	cfg, err = testEnv.Start()
   114  	Expect(err).NotTo(HaveOccurred())
   115  	Expect(cfg).NotTo(BeNil())
   116  
   117  	err = appsv1alpha1.AddToScheme(scheme.Scheme)
   118  	Expect(err).NotTo(HaveOccurred())
   119  	model.AddScheme(appsv1alpha1.AddToScheme)
   120  
   121  	err = dpv1alpha1.AddToScheme(scheme.Scheme)
   122  	Expect(err).NotTo(HaveOccurred())
   123  	model.AddScheme(dpv1alpha1.AddToScheme)
   124  
   125  	err = snapshotv1.AddToScheme(scheme.Scheme)
   126  	Expect(err).NotTo(HaveOccurred())
   127  	model.AddScheme(snapshotv1.AddToScheme)
   128  
   129  	err = workloads.AddToScheme(scheme.Scheme)
   130  	Expect(err).NotTo(HaveOccurred())
   131  	model.AddScheme(workloads.AddToScheme)
   132  
   133  	// +kubebuilder:scaffold:rscheme
   134  
   135  	k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
   136  	Expect(err).NotTo(HaveOccurred())
   137  	Expect(k8sClient).NotTo(BeNil())
   138  
   139  	// run reconcile
   140  	k8sManager, err := ctrl.NewManager(cfg, ctrl.Options{
   141  		Scheme:                scheme.Scheme,
   142  		MetricsBindAddress:    "0",
   143  		ClientDisableCacheFor: intctrlutil.GetUncachedObjects(),
   144  	})
   145  	Expect(err).ToNot(HaveOccurred())
   146  
   147  	viper.SetDefault("CERT_DIR", "/tmp/k8s-webhook-server/serving-certs")
   148  	viper.SetDefault(constant.KBToolsImage, "apecloud/kubeblocks-tools:latest")
   149  	viper.SetDefault("PROBE_SERVICE_PORT", 3501)
   150  	viper.SetDefault("PROBE_SERVICE_LOG_LEVEL", "info")
   151  	viper.SetDefault(constant.EnableRBACManager, true)
   152  
   153  	clusterRecorder = k8sManager.GetEventRecorderFor("db-cluster-controller")
   154  	err = (&ClusterReconciler{
   155  		Client:   k8sManager.GetClient(),
   156  		Scheme:   k8sManager.GetScheme(),
   157  		Recorder: clusterRecorder,
   158  	}).SetupWithManager(k8sManager)
   159  	Expect(err).ToNot(HaveOccurred())
   160  
   161  	err = (&ClusterDefinitionReconciler{
   162  		Client:   k8sManager.GetClient(),
   163  		Scheme:   k8sManager.GetScheme(),
   164  		Recorder: k8sManager.GetEventRecorderFor("cluster-definition-controller"),
   165  	}).SetupWithManager(k8sManager)
   166  	Expect(err).ToNot(HaveOccurred())
   167  
   168  	err = (&ClusterVersionReconciler{
   169  		Client:   k8sManager.GetClient(),
   170  		Scheme:   k8sManager.GetScheme(),
   171  		Recorder: k8sManager.GetEventRecorderFor("cluster-version-controller"),
   172  	}).SetupWithManager(k8sManager)
   173  	Expect(err).ToNot(HaveOccurred())
   174  
   175  	err = (&OpsRequestReconciler{
   176  		Client:   k8sManager.GetClient(),
   177  		Scheme:   k8sManager.GetScheme(),
   178  		Recorder: k8sManager.GetEventRecorderFor("ops-request-controller"),
   179  	}).SetupWithManager(k8sManager)
   180  	Expect(err).ToNot(HaveOccurred())
   181  
   182  	err = (&k8score.EventReconciler{
   183  		Client:   k8sManager.GetClient(),
   184  		Scheme:   k8sManager.GetScheme(),
   185  		Recorder: k8sManager.GetEventRecorderFor("event-controller"),
   186  	}).SetupWithManager(k8sManager)
   187  	Expect(err).ToNot(HaveOccurred())
   188  
   189  	// add SystemAccountReconciler
   190  	systemAccountReconciler = &SystemAccountReconciler{
   191  		Client:   k8sManager.GetClient(),
   192  		Scheme:   k8sManager.GetScheme(),
   193  		Recorder: k8sManager.GetEventRecorderFor("system-account-controller"),
   194  	}
   195  	err = systemAccountReconciler.SetupWithManager(k8sManager)
   196  	Expect(err).ToNot(HaveOccurred())
   197  
   198  	err = (&configuration.ConfigConstraintReconciler{
   199  		Client:   k8sManager.GetClient(),
   200  		Scheme:   k8sManager.GetScheme(),
   201  		Recorder: k8sManager.GetEventRecorderFor("configuration-template-controller"),
   202  	}).SetupWithManager(k8sManager)
   203  	Expect(err).ToNot(HaveOccurred())
   204  
   205  	err = (&configuration.ConfigurationReconciler{
   206  		Client:   k8sManager.GetClient(),
   207  		Scheme:   k8sManager.GetScheme(),
   208  		Recorder: k8sManager.GetEventRecorderFor("configuration-controller"),
   209  	}).SetupWithManager(k8sManager)
   210  	Expect(err).ToNot(HaveOccurred())
   211  
   212  	err = (&ComponentClassReconciler{
   213  		Client:   k8sManager.GetClient(),
   214  		Scheme:   k8sManager.GetScheme(),
   215  		Recorder: k8sManager.GetEventRecorderFor("class-controller"),
   216  	}).SetupWithManager(k8sManager)
   217  	Expect(err).ToNot(HaveOccurred())
   218  
   219  	err = (&ServiceDescriptorReconciler{
   220  		Client:   k8sManager.GetClient(),
   221  		Scheme:   k8sManager.GetScheme(),
   222  		Recorder: k8sManager.GetEventRecorderFor("service-descriptor-controller"),
   223  	}).SetupWithManager(k8sManager)
   224  	Expect(err).ToNot(HaveOccurred())
   225  
   226  	err = (&BackupPolicyTemplateReconciler{
   227  		Client:   k8sManager.GetClient(),
   228  		Scheme:   k8sManager.GetScheme(),
   229  		Recorder: k8sManager.GetEventRecorderFor("backup-policy-template-controller"),
   230  	}).SetupWithManager(k8sManager)
   231  	Expect(err).ToNot(HaveOccurred())
   232  
   233  	testCtx = testutil.NewDefaultTestContext(ctx, k8sClient, testEnv)
   234  
   235  	appsv1alpha1.RegisterWebhookManager(k8sManager)
   236  
   237  	go func() {
   238  		defer GinkgoRecover()
   239  		err = k8sManager.Start(ctx)
   240  		Expect(err).ToNot(HaveOccurred(), "failed to run manager")
   241  	}()
   242  })
   243  
   244  var _ = AfterSuite(func() {
   245  	cancel()
   246  	By("tearing down the test environment")
   247  	err := testEnv.Stop()
   248  	Expect(err).NotTo(HaveOccurred())
   249  })