github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/controllers/dataprotection/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 dataprotection 21 22 import ( 23 "context" 24 "fmt" 25 "go/build" 26 "path/filepath" 27 "testing" 28 "time" 29 30 . "github.com/onsi/ginkgo/v2" 31 . "github.com/onsi/gomega" 32 33 vsv1beta1 "github.com/kubernetes-csi/external-snapshotter/client/v3/apis/volumesnapshot/v1beta1" 34 vsv1 "github.com/kubernetes-csi/external-snapshotter/client/v6/apis/volumesnapshot/v1" 35 "go.uber.org/zap/zapcore" 36 batchv1 "k8s.io/api/batch/v1" 37 "k8s.io/client-go/kubernetes/scheme" 38 "k8s.io/client-go/rest" 39 testclocks "k8s.io/utils/clock/testing" 40 ctrl "sigs.k8s.io/controller-runtime" 41 "sigs.k8s.io/controller-runtime/pkg/client" 42 "sigs.k8s.io/controller-runtime/pkg/envtest" 43 logf "sigs.k8s.io/controller-runtime/pkg/log" 44 "sigs.k8s.io/controller-runtime/pkg/log/zap" 45 46 appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1" 47 dpv1alpha1 "github.com/1aal/kubeblocks/apis/dataprotection/v1alpha1" 48 storagev1alpha1 "github.com/1aal/kubeblocks/apis/storage/v1alpha1" 49 "github.com/1aal/kubeblocks/pkg/constant" 50 "github.com/1aal/kubeblocks/pkg/testutil" 51 viper "github.com/1aal/kubeblocks/pkg/viperx" 52 ) 53 54 // These tests use Ginkgo (BDD-style Go testing framework). Refer to 55 // http://onsi.github.io/ginkgo/ to learn more about Ginkgo. 56 57 var cfg *rest.Config 58 var k8sClient client.Client 59 var testEnv *envtest.Environment 60 var ctx context.Context 61 var cancel context.CancelFunc 62 var testCtx testutil.TestContext 63 var fakeClock *testclocks.FakeClock 64 65 func init() { 66 viper.AutomaticEnv() 67 } 68 69 func TestAPIs(t *testing.T) { 70 RegisterFailHandler(Fail) 71 72 RunSpecs(t, "Data Protection Controller Suite") 73 } 74 75 var _ = BeforeSuite(func() { 76 if viper.GetBool("ENABLE_DEBUG_LOG") { 77 logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true), func(o *zap.Options) { 78 o.TimeEncoder = zapcore.ISO8601TimeEncoder 79 })) 80 } 81 reconcileInterval = time.Millisecond 82 83 ctx, cancel = context.WithCancel(context.TODO()) 84 85 viper.SetDefault(constant.CfgKeyCtrlrMgrNS, "default") 86 viper.SetDefault(constant.KBToolsImage, "apecloud/kubeblocks:latest") 87 fmt.Printf("config settings: %v\n", viper.AllSettings()) 88 89 By("bootstrapping test environment") 90 testEnv = &envtest.Environment{ 91 CRDDirectoryPaths: []string{ 92 filepath.Join("..", "..", "config", "crd", "bases"), 93 // use dependent external CRDs. 94 // resolved by ref: https://github.com/operator-framework/operator-sdk/issues/4434#issuecomment-786794418 95 filepath.Join(build.Default.GOPATH, "pkg", "mod", "github.com", "kubernetes-csi/external-snapshotter/", 96 "client/v6@v6.2.0", "config", "crd"), 97 }, 98 ErrorIfCRDPathMissing: true, 99 } 100 101 var err error 102 // cfg is defined in this file globally. 103 cfg, err = testEnv.Start() 104 Expect(err).NotTo(HaveOccurred()) 105 Expect(cfg).NotTo(BeNil()) 106 107 scheme := scheme.Scheme 108 109 err = vsv1.AddToScheme(scheme) 110 Expect(err).NotTo(HaveOccurred()) 111 112 err = vsv1beta1.AddToScheme(scheme) 113 Expect(err).NotTo(HaveOccurred()) 114 115 err = appsv1alpha1.AddToScheme(scheme) 116 Expect(err).NotTo(HaveOccurred()) 117 118 err = dpv1alpha1.AddToScheme(scheme) 119 Expect(err).NotTo(HaveOccurred()) 120 121 err = storagev1alpha1.AddToScheme(scheme) 122 Expect(err).NotTo(HaveOccurred()) 123 124 // +kubebuilder:scaffold:scheme 125 126 k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) 127 Expect(err).NotTo(HaveOccurred()) 128 Expect(k8sClient).NotTo(BeNil()) 129 130 uncachedObjects := []client.Object{ 131 &dpv1alpha1.ActionSet{}, 132 &dpv1alpha1.BackupPolicy{}, 133 &dpv1alpha1.BackupSchedule{}, 134 &dpv1alpha1.BackupRepo{}, 135 &dpv1alpha1.Backup{}, 136 &dpv1alpha1.Restore{}, 137 &vsv1.VolumeSnapshot{}, 138 &vsv1beta1.VolumeSnapshot{}, 139 &batchv1.Job{}, 140 &batchv1.CronJob{}, 141 } 142 // run reconcile 143 k8sManager, err := ctrl.NewManager(cfg, ctrl.Options{ 144 Scheme: scheme, 145 MetricsBindAddress: "0", 146 ClientDisableCacheFor: uncachedObjects, 147 }) 148 Expect(err).ToNot(HaveOccurred()) 149 150 err = (&BackupReconciler{ 151 Client: k8sManager.GetClient(), 152 Scheme: k8sManager.GetScheme(), 153 Recorder: k8sManager.GetEventRecorderFor("backup-controller"), 154 }).SetupWithManager(k8sManager) 155 Expect(err).ToNot(HaveOccurred()) 156 157 err = (&BackupScheduleReconciler{ 158 Client: k8sManager.GetClient(), 159 Scheme: k8sManager.GetScheme(), 160 Recorder: k8sManager.GetEventRecorderFor("backup-schedule-controller"), 161 }).SetupWithManager(k8sManager) 162 Expect(err).ToNot(HaveOccurred()) 163 164 err = (&BackupPolicyReconciler{ 165 Client: k8sManager.GetClient(), 166 Scheme: k8sManager.GetScheme(), 167 Recorder: k8sManager.GetEventRecorderFor("backup-policy-controller"), 168 }).SetupWithManager(k8sManager) 169 Expect(err).ToNot(HaveOccurred()) 170 171 err = (&ActionSetReconciler{ 172 Client: k8sManager.GetClient(), 173 Scheme: k8sManager.GetScheme(), 174 Recorder: k8sManager.GetEventRecorderFor("actionset-controller"), 175 }).SetupWithManager(k8sManager) 176 Expect(err).ToNot(HaveOccurred()) 177 178 err = (&BackupRepoReconciler{ 179 Client: k8sManager.GetClient(), 180 Scheme: k8sManager.GetScheme(), 181 Recorder: k8sManager.GetEventRecorderFor("backup-repo-controller"), 182 RestConfig: k8sManager.GetConfig(), 183 }).SetupWithManager(k8sManager) 184 Expect(err).ToNot(HaveOccurred()) 185 186 err = (&RestoreReconciler{ 187 Client: k8sManager.GetClient(), 188 Scheme: k8sManager.GetScheme(), 189 Recorder: k8sManager.GetEventRecorderFor("restore-controller"), 190 }).SetupWithManager(k8sManager) 191 Expect(err).ToNot(HaveOccurred()) 192 193 err = (&VolumePopulatorReconciler{ 194 Client: k8sManager.GetClient(), 195 Scheme: k8sManager.GetScheme(), 196 Recorder: k8sManager.GetEventRecorderFor("volume-populate-controller"), 197 }).SetupWithManager(k8sManager) 198 Expect(err).ToNot(HaveOccurred()) 199 200 err = mockGCReconciler(k8sManager).SetupWithManager(k8sManager) 201 Expect(err).ToNot(HaveOccurred()) 202 203 testCtx = testutil.NewDefaultTestContext(ctx, k8sClient, testEnv) 204 205 go func() { 206 defer GinkgoRecover() 207 err = k8sManager.Start(ctx) 208 Expect(err).ToNot(HaveOccurred(), "failed to run manager") 209 }() 210 }) 211 212 var _ = AfterSuite(func() { 213 cancel() 214 By("tearing down the test environment") 215 err := testEnv.Stop() 216 Expect(err).NotTo(HaveOccurred()) 217 }) 218 219 func mockGCReconciler(mgr ctrl.Manager) *GCReconciler { 220 fakeClock = testclocks.NewFakeClock(time.Now()) 221 return &GCReconciler{ 222 Client: mgr.GetClient(), 223 Recorder: mgr.GetEventRecorderFor("gc-controller"), 224 clock: fakeClock, 225 frequency: time.Duration(1) * time.Second, 226 } 227 }