...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package statuscheck
17
18 import (
19 "context"
20 "os"
21 "path/filepath"
22 "reflect"
23 "testing"
24 "time"
25
26 "github.com/go-logr/logr"
27 . "github.com/onsi/ginkgo/v2"
28 . "github.com/onsi/gomega"
29 "go.uber.org/fx"
30 "k8s.io/client-go/rest"
31 "k8s.io/kubectl/pkg/scheme"
32 ctrl "sigs.k8s.io/controller-runtime"
33 "sigs.k8s.io/controller-runtime/pkg/client"
34 "sigs.k8s.io/controller-runtime/pkg/envtest"
35 "sigs.k8s.io/controller-runtime/pkg/event"
36 logf "sigs.k8s.io/controller-runtime/pkg/log"
37 "sigs.k8s.io/controller-runtime/pkg/log/zap"
38 "sigs.k8s.io/controller-runtime/pkg/predicate"
39
40 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
41 "github.com/chaos-mesh/chaos-mesh/controllers/config"
42 "github.com/chaos-mesh/chaos-mesh/controllers/utils/builder"
43 "github.com/chaos-mesh/chaos-mesh/controllers/utils/recorder"
44 "github.com/chaos-mesh/chaos-mesh/controllers/utils/test"
45 "github.com/chaos-mesh/chaos-mesh/pkg/log"
46 )
47
48
49
50
51 var app *fx.App
52 var k8sClient client.Client
53 var cfg *rest.Config
54 var testEnv *envtest.Environment
55 var setupLog = ctrl.Log.WithName("setup")
56
57 func TestStatusCheck(t *testing.T) {
58 RegisterFailHandler(Fail)
59
60 RunSpecs(t, "Status Check Suite")
61 }
62
63 var _ = BeforeSuite(func(ctx SpecContext) {
64 logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
65 By("bootstrapping test environment")
66 t := true
67 if os.Getenv("USE_EXISTING_CLUSTER") == "true" {
68 testEnv = &envtest.Environment{
69 UseExistingCluster: &t,
70 }
71 } else {
72 testEnv = &envtest.Environment{
73 CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
74 }
75 }
76
77 err := v1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme)
78 Expect(err).NotTo(HaveOccurred())
79
80 cfg, err = testEnv.Start()
81 Expect(err).ToNot(HaveOccurred())
82 Expect(cfg).ToNot(BeNil())
83
84 k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
85 Expect(err).ToNot(HaveOccurred())
86 Expect(k8sClient).ToNot(BeNil())
87
88 rootLogger, err := log.NewDefaultZapLogger()
89 Expect(err).ToNot(HaveOccurred())
90 By("start application")
91 app = fx.New(
92 fx.Options(
93 fx.Supply(rootLogger),
94 test.Module,
95 fx.Supply(cfg),
96 ),
97 fx.Invoke(testBootstrap),
98 )
99 startCtx, cancel := context.WithTimeout(context.Background(), app.StartTimeout())
100 defer cancel()
101
102 if err := app.Start(startCtx); err != nil {
103 setupLog.Error(err, "fail to start manager")
104 }
105 Expect(err).ToNot(HaveOccurred())
106
107 }, NodeTimeout(60*time.Second))
108
109 var _ = AfterSuite(func() {
110 By("tearing down the test environment")
111 stopCtx, cancel := context.WithTimeout(context.Background(), app.StopTimeout())
112 defer cancel()
113
114 if err := app.Stop(stopCtx); err != nil {
115 setupLog.Error(err, "fail to stop manager")
116 }
117 err := testEnv.Stop()
118 Expect(err).ToNot(HaveOccurred())
119 })
120
121 func testBootstrap(mgr ctrl.Manager, client client.Client, logger logr.Logger, recorderBuilder *recorder.RecorderBuilder) error {
122 if !config.ShouldSpawnController("statuscheck") {
123 return nil
124 }
125 eventRecorder := recorderBuilder.Build("statuscheck")
126 manager := NewManager(logger.WithName("statuscheck-manager"), eventRecorder, newFakeExecutor)
127
128 return builder.Default(mgr).
129 For(&v1alpha1.StatusCheck{}).
130 Named("statuscheck").
131 WithEventFilter(predicate.Funcs{
132 UpdateFunc: func(e event.UpdateEvent) bool {
133 oldObj := e.ObjectOld.(*v1alpha1.StatusCheck)
134 newObj := e.ObjectNew.(*v1alpha1.StatusCheck)
135
136 return !reflect.DeepEqual(oldObj.Spec, newObj.Spec)
137 },
138 }).
139 Complete(NewReconciler(logger.WithName("statuscheck-reconciler"), client, eventRecorder, manager))
140 }
141