...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package common
17
18 import (
19 "context"
20 "os"
21 "path/filepath"
22 "testing"
23
24 "github.com/go-logr/logr"
25 . "github.com/onsi/ginkgo"
26 . "github.com/onsi/gomega"
27 "go.uber.org/fx"
28 "k8s.io/client-go/rest"
29 "k8s.io/kubectl/pkg/scheme"
30 ctrl "sigs.k8s.io/controller-runtime"
31 "sigs.k8s.io/controller-runtime/pkg/client"
32 "sigs.k8s.io/controller-runtime/pkg/envtest"
33 "sigs.k8s.io/controller-runtime/pkg/envtest/printer"
34 logf "sigs.k8s.io/controller-runtime/pkg/log"
35 "sigs.k8s.io/controller-runtime/pkg/log/zap"
36
37 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
38 "github.com/chaos-mesh/chaos-mesh/controllers/chaosimpl"
39 "github.com/chaos-mesh/chaos-mesh/controllers/common/condition"
40 "github.com/chaos-mesh/chaos-mesh/controllers/common/desiredphase"
41 "github.com/chaos-mesh/chaos-mesh/controllers/common/finalizers"
42 "github.com/chaos-mesh/chaos-mesh/controllers/common/pipeline"
43 "github.com/chaos-mesh/chaos-mesh/controllers/schedule/utils"
44 "github.com/chaos-mesh/chaos-mesh/controllers/utils/chaosdaemon"
45 "github.com/chaos-mesh/chaos-mesh/controllers/utils/test"
46 "github.com/chaos-mesh/chaos-mesh/pkg/log"
47 "github.com/chaos-mesh/chaos-mesh/pkg/selector"
48 )
49
50
51
52
53 var app *fx.App
54 var k8sClient client.Client
55 var lister *utils.ActiveLister
56 var cfg *rest.Config
57 var testEnv *envtest.Environment
58 var setupLog = ctrl.Log.WithName("setup")
59
60 func TestCommon(t *testing.T) {
61 RegisterFailHandler(Fail)
62
63 RunSpecsWithDefaultAndCustomReporters(t,
64 "Common suit",
65 []Reporter{printer.NewlineReporter{}})
66 }
67
68 var _ = BeforeSuite(func() {
69 logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
70 By("bootstrapping test environment")
71 t := true
72 if os.Getenv("USE_EXISTING_CLUSTER") == "true" {
73 testEnv = &envtest.Environment{
74 UseExistingCluster: &t,
75 }
76 } else {
77 testEnv = &envtest.Environment{
78 CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
79 }
80 }
81
82 err := v1alpha1.SchemeBuilder.AddToScheme(scheme.Scheme)
83 Expect(err).NotTo(HaveOccurred())
84
85 cfg, err = testEnv.Start()
86 Expect(err).ToNot(HaveOccurred())
87 Expect(cfg).ToNot(BeNil())
88
89 k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
90 Expect(err).ToNot(HaveOccurred())
91 Expect(k8sClient).ToNot(BeNil())
92
93 rootLogger, err := log.NewDefaultZapLogger()
94 Expect(err).ToNot(HaveOccurred())
95 By("start application")
96 app = fx.New(
97 fx.Options(
98 fx.Supply(rootLogger),
99 test.Module,
100 chaosimpl.AllImpl,
101 selector.Module,
102 fx.Provide(chaosdaemon.New),
103 fx.Provide(func() []pipeline.PipelineStep {
104 return []pipeline.PipelineStep{finalizers.Step, desiredphase.Step, condition.Step}
105 }),
106 fx.Invoke(Bootstrap),
107 fx.Supply(cfg),
108 ),
109 fx.Invoke(Run),
110 )
111 startCtx, cancel := context.WithTimeout(context.Background(), app.StartTimeout())
112 defer cancel()
113
114 if err := app.Start(startCtx); err != nil {
115 setupLog.Error(err, "fail to start manager")
116 }
117 Expect(err).ToNot(HaveOccurred())
118
119 }, 60)
120
121 var _ = AfterSuite(func() {
122 By("tearing down the test environment")
123 stopCtx, cancel := context.WithTimeout(context.Background(), app.StopTimeout())
124 defer cancel()
125
126 if err := app.Stop(stopCtx); err != nil {
127 setupLog.Error(err, "fail to stop manager")
128 }
129 err := testEnv.Stop()
130 Expect(err).ToNot(HaveOccurred())
131 })
132
133 type RunParams struct {
134 fx.In
135
136 Mgr ctrl.Manager
137 Logger logr.Logger
138 }
139
140 func Run(params RunParams) error {
141 lister = utils.NewActiveLister(k8sClient, params.Logger)
142 return nil
143 }
144