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