1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package e2e
17
18 import (
19 "context"
20 _ "net/http/pprof"
21 "os/exec"
22 "time"
23
24 "github.com/onsi/ginkgo/v2"
25 v1 "k8s.io/api/core/v1"
26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27 "k8s.io/client-go/kubernetes"
28 _ "k8s.io/client-go/plugin/pkg/client/auth"
29 "k8s.io/klog/v2"
30 _ "k8s.io/kubelet"
31 "k8s.io/kubernetes/test/e2e/framework"
32 e2edebug "k8s.io/kubernetes/test/e2e/framework/debug"
33 e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"
34 e2enode "k8s.io/kubernetes/test/e2e/framework/node"
35 e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
36 utilnet "k8s.io/utils/net"
37
38 test "github.com/chaos-mesh/chaos-mesh/e2e-test"
39 e2econfig "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/config"
40 )
41
42 const namespaceCleanupTimeout = 15 * time.Minute
43
44
45
46
47
48
49
50 func setupSuite(ctx context.Context) {
51
52
53 c, err := framework.LoadClientset()
54 if err != nil {
55 klog.Fatal("Error loading client: ", err)
56 }
57
58
59
60 if framework.TestContext.CleanStart {
61 deleted, err := framework.DeleteNamespaces(ctx, c, nil,
62 []string{
63 metav1.NamespaceSystem,
64 metav1.NamespaceDefault,
65 metav1.NamespacePublic,
66 v1.NamespaceNodeLease,
67
68
69 "local-path-storage",
70 })
71 if err != nil {
72 framework.Failf("Error deleting orphaned namespaces: %v", err)
73 }
74 klog.Infof("Waiting for deletion of the following namespaces: %v", deleted)
75 if err := framework.WaitForNamespacesDeleted(ctx, c, deleted, namespaceCleanupTimeout); err != nil {
76 framework.Failf("Failed to delete orphaned namespaces %v: %v", deleted, err)
77 }
78 }
79
80 timeouts := framework.NewTimeoutContext()
81
82
83
84
85 framework.ExpectNoError(e2enode.WaitForAllNodesSchedulable(ctx, c, timeouts.NodeSchedulable))
86
87
88
89
90
91
92
93
94
95
96 podStartupTimeout := timeouts.SystemPodsStartup
97
98
99
100
101 if err := e2epod.WaitForPodsRunningReady(ctx, c, metav1.NamespaceSystem, int32(framework.TestContext.MinStartupPods), int32(framework.TestContext.AllowedNotReadyNodes), podStartupTimeout); err != nil {
102 e2edebug.DumpAllNamespaceInfo(ctx, c, metav1.NamespaceSystem)
103 e2ekubectl.LogFailedContainers(ctx, c, metav1.NamespaceSystem, framework.Logf)
104 framework.Failf("Error waiting for all pods to be running and ready: %v", err)
105 }
106
107
108
109
110
111 dc := c.DiscoveryClient
112
113 serverVersion, serverErr := dc.ServerVersion()
114 if serverErr != nil {
115 framework.Logf("Unexpected server error retrieving version: %v", serverErr)
116 }
117 if serverVersion != nil {
118 framework.Logf("kube-apiserver version: %s", serverVersion.GitVersion)
119 }
120 }
121
122 var _ = ginkgo.SynchronizedBeforeSuite(func() []byte {
123 if e2econfig.TestConfig.InstallChaosMesh {
124 ginkgo.By("Clear all helm releases")
125 helmClearCmd := "helm ls --all --short | xargs -n 1 -r helm delete --purge"
126 if err := exec.Command("sh", "-c", helmClearCmd).Run(); err != nil {
127 framework.Failf("failed to clear helm releases (cmd: %q, error: %v", helmClearCmd, err)
128 }
129 ginkgo.By("Clear non-kubernetes apiservices")
130 clearNonK8SAPIServicesCmd := "kubectl delete apiservices -l kube-aggregator.kubernetes.io/automanaged!=onstart"
131 if err := exec.Command("sh", "-c", clearNonK8SAPIServicesCmd).Run(); err != nil {
132 framework.Failf("failed to clear non-kubernetes apiservices (cmd: %q, error: %v", clearNonK8SAPIServicesCmd, err)
133 }
134
135 setupSuite(context.Background())
136
137
138 oa, ocfg, err := test.BuildOperatorActionAndCfg(e2econfig.TestConfig)
139 framework.ExpectNoError(err, "failed to create operator action")
140 oa.CleanCRDOrDie()
141 err = oa.InstallCRD(ocfg)
142 framework.ExpectNoError(err, "failed to install crd")
143 err = oa.DeployOperator(ocfg)
144 framework.ExpectNoError(err, "failed to install chaos-mesh")
145 }
146 return nil
147 }, func(data []byte) {
148
149 setupSuitePerGinkgoNode()
150 })
151
152 func setupSuitePerGinkgoNode() {
153 c, err := framework.LoadClientset()
154 if err != nil {
155 klog.Fatal("Error loading client: ", err)
156 }
157 framework.TestContext.IPFamily = getDefaultClusterIPFamily(c)
158 framework.Logf("Cluster IP family: %s", framework.TestContext.IPFamily)
159 }
160
161
162
163
164
165
166 func getDefaultClusterIPFamily(c kubernetes.Interface) string {
167
168 svc, err := c.CoreV1().Services(metav1.NamespaceDefault).Get(context.TODO(), "kubernetes", metav1.GetOptions{})
169 if err != nil {
170 framework.Failf("Failed to get kubernetes service ClusterIP: %v", err)
171 }
172
173 if utilnet.IsIPv6String(svc.Spec.ClusterIP) {
174 return "ipv6"
175 }
176 return "ipv4"
177 }
178