...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package schedule
17
18 import (
19 "context"
20 "os"
21 "path/filepath"
22 "testing"
23 "time"
24
25 "github.com/go-logr/logr"
26 . "github.com/onsi/ginkgo/v2"
27 . "github.com/onsi/gomega"
28 "go.uber.org/fx"
29 "k8s.io/client-go/rest"
30 "k8s.io/kubectl/pkg/scheme"
31 ctrl "sigs.k8s.io/controller-runtime"
32 "sigs.k8s.io/controller-runtime/pkg/client"
33 "sigs.k8s.io/controller-runtime/pkg/envtest"
34 logf "sigs.k8s.io/controller-runtime/pkg/log"
35
36 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
37 "github.com/chaos-mesh/chaos-mesh/controllers/schedule/utils"
38 "github.com/chaos-mesh/chaos-mesh/controllers/types"
39 "github.com/chaos-mesh/chaos-mesh/controllers/utils/recorder"
40 "github.com/chaos-mesh/chaos-mesh/controllers/utils/test"
41 "github.com/chaos-mesh/chaos-mesh/pkg/log"
42 "github.com/chaos-mesh/chaos-mesh/pkg/workflow/controllers"
43 )
44
45
46
47
48 var app *fx.App
49 var k8sClient client.Client
50 var lister *utils.ActiveLister
51 var config *rest.Config
52 var testEnv *envtest.Environment
53 var setupLog = ctrl.Log.WithName("setup")
54
55 func TestSchedule(t *testing.T) {
56 RegisterFailHandler(Fail)
57
58 RunSpecs(t, "Schedule suit")
59 }
60
61 var _ = BeforeSuite(func(ctx SpecContext) {
62 logf.SetLogger(log.NewZapLoggerWithWriter(GinkgoWriter))
63 By("bootstrapping test environment")
64 t := true
65 if os.Getenv("USE_EXISTING_CLUSTER") == "true" {
66 testEnv = &envtest.Environment{
67 UseExistingCluster: &t,
68 }
69 } else {
70 testEnv = &envtest.Environment{
71 CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
72 }
73 }
74
75 err := v1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme)
76 Expect(err).NotTo(HaveOccurred())
77
78 config, err = testEnv.Start()
79 Expect(err).ToNot(HaveOccurred())
80 Expect(config).ToNot(BeNil())
81
82 k8sClient, err = client.New(config, client.Options{Scheme: scheme.Scheme})
83 Expect(err).ToNot(HaveOccurred())
84 Expect(k8sClient).ToNot(BeNil())
85
86 rootLogger, err := log.NewDefaultZapLogger()
87 Expect(err).ToNot(HaveOccurred())
88
89 app = fx.New(
90 fx.Options(
91 fx.Supply(rootLogger),
92 test.Module,
93 fx.Supply(config),
94 Module,
95 types.ChaosObjects,
96 ),
97 fx.Invoke(Run),
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 type RunParams struct {
122 fx.In
123
124 Mgr ctrl.Manager
125 Logger logr.Logger
126 RecorderBuilder *recorder.RecorderBuilder
127
128 Controllers []types.Controller `group:"controller"`
129 Objs []types.Object `group:"objs"`
130 }
131
132 func Run(params RunParams) error {
133 lister = utils.NewActiveLister(k8sClient, params.Logger)
134 err := controllers.BootstrapWorkflowControllers(params.Mgr, params.Logger, params.RecorderBuilder)
135 if err != nil {
136 return err
137 }
138 return nil
139 }
140