...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package testmain
16
17 import (
18 "context"
19 "fmt"
20 "log"
21 "sync"
22 "time"
23
24 appsv1 "k8s.io/api/apps/v1"
25 corev1 "k8s.io/api/core/v1"
26 apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
27 "k8s.io/client-go/kubernetes/scheme"
28 "k8s.io/client-go/rest"
29 "sigs.k8s.io/controller-runtime/pkg/envtest"
30 "sigs.k8s.io/controller-runtime/pkg/manager"
31
32 customizev1alpha1 "github.com/GoogleCloudPlatform/k8s-config-connector/operator/pkg/apis/core/customize/v1alpha1"
33 corev1beta1 "github.com/GoogleCloudPlatform/k8s-config-connector/operator/pkg/apis/core/v1beta1"
34 "github.com/GoogleCloudPlatform/k8s-config-connector/operator/pkg/test/util/paths"
35 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/controller/kccmanager/nocache"
36 )
37
38 func init() {
39 s := scheme.Scheme
40 if err := apiextensions.SchemeBuilder.AddToScheme(s); err != nil {
41 log.Fatalf("error registering apiextensions v1beta1 scheme: %v", err)
42 }
43 if err := corev1beta1.SchemeBuilder.AddToScheme(s); err != nil {
44 log.Fatalf("error registering core kcc operator scheme: %v", err)
45 }
46 if err := corev1.SchemeBuilder.AddToScheme(s); err != nil {
47 log.Fatalf("error registering core v1 scheme: %v", err)
48 }
49 if err := appsv1.SchemeBuilder.AddToScheme(s); err != nil {
50 log.Fatalf("error registering apps v1 scheme: %v", err)
51 }
52 if err := customizev1alpha1.SchemeBuilder.AddToScheme(s); err != nil {
53 log.Fatalf("error registering kcc customization scheme: %v", err)
54 }
55 }
56
57
58
59 func StartTestEnv() (*rest.Config, func()) {
60 testEnv := &envtest.Environment{
61 CRDDirectoryPaths: []string{paths.GetOperatorCRDsPath()},
62 ControlPlaneStartTimeout: time.Minute,
63 }
64 var err error
65 cfg, err := testEnv.Start()
66 if err != nil {
67 log.Fatal(err)
68 }
69 stop := func() {
70 if err := testEnv.Stop(); err != nil {
71 log.Printf("unable to stop the test environment: %v", err)
72 }
73 }
74 return cfg, stop
75 }
76
77 func StartTestManager(cfg *rest.Config) (manager.Manager, func(), error) {
78 mgr, err := manager.New(cfg, manager.Options{
79
80 NewClient: nocache.NoCacheClientFunc,
81
82
83
84 MetricsBindAddress: "0",
85
86
87
88 HealthProbeBindAddress: "0",
89 })
90 if err != nil {
91 return nil, nil, fmt.Errorf("error creating manager: %v", err)
92 }
93 stopFunc := startMgr(mgr, log.Fatalf)
94 return mgr, stopFunc, nil
95 }
96
97 func startMgr(mgr manager.Manager, mgrStartErrHandler func(string, ...interface{})) func() {
98 ctx, cancel := context.WithCancel(context.TODO())
99
100
101 wg := sync.WaitGroup{}
102 wg.Add(1)
103 go func() {
104 defer wg.Done()
105 if err := mgr.Start(ctx); err != nil {
106 mgrStartErrHandler("unable to start manager: %v", err)
107 }
108 }()
109 stop := func() {
110
111
112 cancel()
113
114 wg.Wait()
115 }
116 return stop
117 }
118
119 func StartTestManagerFromNewTestEnv() (manager.Manager, func()) {
120 cfg, stopEnv := StartTestEnv()
121 mgr, stopMgr, err := StartTestManager(cfg)
122 if err != nil {
123 log.Fatal(err)
124 }
125 stop := func() {
126 stopMgr()
127 stopEnv()
128 }
129 return mgr, stop
130 }
131
View as plain text