1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package chaos
17
18 import (
19 "context"
20 "net/http"
21 "strings"
22 "time"
23
24 "github.com/onsi/ginkgo/v2"
25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26 "k8s.io/apimachinery/pkg/runtime"
27 "k8s.io/client-go/kubernetes"
28 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
29 restClient "k8s.io/client-go/rest"
30 "k8s.io/kubernetes/test/e2e/framework"
31 "k8s.io/pod-security-admission/api"
32 "sigs.k8s.io/controller-runtime/pkg/client"
33
34 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
35 httpchaostestcases "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos/httpchaos"
36 iochaostestcases "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos/iochaos"
37 e2econfig "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/config"
38 "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/util"
39 "github.com/chaos-mesh/chaos-mesh/e2e-test/pkg/fixture"
40 "github.com/chaos-mesh/chaos-mesh/pkg/log"
41 "github.com/chaos-mesh/chaos-mesh/pkg/portforward"
42 )
43
44 var _ = ginkgo.Describe("[Graceful-Shutdown]", func() {
45 f := framework.NewDefaultFramework("chaos-mesh")
46 f.NamespacePodSecurityEnforceLevel = api.LevelPrivileged
47 var ns string
48 var fwCancel context.CancelFunc
49 var fw portforward.PortForward
50 var kubeCli kubernetes.Interface
51 var config *restClient.Config
52 var cli client.Client
53 c := http.Client{
54 Timeout: 10 * time.Second,
55 }
56
57 ginkgo.BeforeEach(func() {
58 ns = f.Namespace.Name
59 ctx, cancel := context.WithCancel(context.Background())
60 clientRawConfig, err := e2econfig.LoadClientRawConfig()
61 framework.ExpectNoError(err, "failed to load raw config")
62 logger, err := log.NewDefaultZapLogger()
63 framework.ExpectNoError(err, "failed to create logger")
64 fw, err = portforward.NewPortForwarder(ctx, e2econfig.NewSimpleRESTClientGetter(clientRawConfig), true, logger)
65 framework.ExpectNoError(err, "failed to create port forwarder")
66 fwCancel = cancel
67 kubeCli = f.ClientSet
68 config, err = framework.LoadConfig()
69 framework.ExpectNoError(err, "config error")
70 scheme := runtime.NewScheme()
71 _ = clientgoscheme.AddToScheme(scheme)
72 _ = v1alpha1.AddToScheme(scheme)
73 cli, err = client.New(config, client.Options{Scheme: scheme})
74 framework.ExpectNoError(err, "create client error")
75 })
76
77 ginkgo.AfterEach(func() {
78 if fwCancel != nil {
79 fwCancel()
80 }
81 })
82
83
84 ginkgo.Context("[IOChaos]", func() {
85 var (
86 err error
87 port uint16
88 pfCancel context.CancelFunc
89 )
90
91 ginkgo.JustBeforeEach(func() {
92 svc := fixture.NewE2EService("io", ns)
93 _, err = kubeCli.CoreV1().Services(ns).Create(context.TODO(), svc, metav1.CreateOptions{})
94 framework.ExpectNoError(err, "create service error")
95 nd := fixture.NewIOTestDeployment("io-test", ns)
96 _, err = kubeCli.AppsV1().Deployments(ns).Create(context.TODO(), nd, metav1.CreateOptions{})
97 framework.ExpectNoError(err, "create io-test deployment error")
98 err = util.WaitDeploymentReady("io-test", ns, kubeCli)
99 framework.ExpectNoError(err, "wait io-test deployment ready error")
100 _, port, pfCancel, err = portforward.ForwardOnePort(fw, ns, "svc/io", 8080)
101 framework.ExpectNoError(err, "create helper io port port-forward failed")
102 })
103
104 ginkgo.JustAfterEach(func() {
105 if pfCancel != nil {
106 pfCancel()
107 }
108 })
109
110
111 ginkgo.It("[Shutdown]", func() {
112 iochaostestcases.TestcaseIOErrorGracefulShutdown(ns, cli, c, port)
113 })
114 })
115
116
117 ginkgo.Context("[HTTPChaos]", func() {
118 var (
119 err error
120 port uint16
121 pfCancel context.CancelFunc
122 client httpchaostestcases.HTTPE2EClient
123 )
124
125 ginkgo.JustBeforeEach(func() {
126 svc := fixture.NewE2EService("http", ns)
127 svc, err = kubeCli.CoreV1().Services(ns).Create(context.TODO(), svc, metav1.CreateOptions{})
128 framework.ExpectNoError(err, "create service error")
129 for _, servicePort := range svc.Spec.Ports {
130 if servicePort.Name == "http" {
131 port = uint16(servicePort.NodePort)
132 break
133 }
134 }
135 nd := fixture.NewHTTPTestDeployment("http-test", ns)
136 _, err = kubeCli.AppsV1().Deployments(ns).Create(context.TODO(), nd, metav1.CreateOptions{})
137 framework.ExpectNoError(err, "create http-test deployment error")
138 err = util.WaitDeploymentReady("http-test", ns, kubeCli)
139 framework.ExpectNoError(err, "wait http-test deployment ready error")
140 podlist, err := kubeCli.CoreV1().Pods(ns).List(context.TODO(), metav1.ListOptions{})
141 framework.ExpectNoError(err, "find pod list error")
142 for _, item := range podlist.Items {
143 if strings.Contains(item.Name, "http-test") {
144 framework.Logf("get http-test-pod %v", item)
145 client.IP = item.Status.HostIP
146 break
147 }
148 }
149 client.C = &c
150 })
151
152 ginkgo.JustAfterEach(func() {
153 if pfCancel != nil {
154 pfCancel()
155 }
156 })
157
158
159 ginkgo.It("[Shutdown]", func() {
160 httpchaostestcases.TestcaseHttpGracefulAbortShutdown(ns, cli, client, port)
161 })
162 })
163 })
164