1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package podchaos
17
18 import (
19 "context"
20 "time"
21
22 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
23 "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/util"
24 "github.com/chaos-mesh/chaos-mesh/e2e-test/pkg/fixture"
25
26 corev1 "k8s.io/api/core/v1"
27 apierrors "k8s.io/apimachinery/pkg/api/errors"
28 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29 "k8s.io/apimachinery/pkg/labels"
30 "k8s.io/apimachinery/pkg/types"
31 "k8s.io/apimachinery/pkg/util/wait"
32 "k8s.io/client-go/kubernetes"
33 "k8s.io/kubernetes/test/e2e/framework"
34 "k8s.io/utils/pointer"
35 "sigs.k8s.io/controller-runtime/pkg/client"
36 )
37
38 func TestcasePodKillOnceThenDelete(ns string, kubeCli kubernetes.Interface, cli client.Client) {
39 ctx, cancel := context.WithCancel(context.Background())
40 defer cancel()
41
42 pod := fixture.NewCommonNginxPod("nginx", ns)
43 _, err := kubeCli.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{})
44 framework.ExpectNoError(err, "create nginx pod error")
45 err = waitPodRunning("nginx", ns, kubeCli)
46 framework.ExpectNoError(err, "wait nginx running error")
47
48 podKillChaos := &v1alpha1.PodChaos{
49 ObjectMeta: metav1.ObjectMeta{
50 Name: "nginx-kill",
51 Namespace: ns,
52 },
53 Spec: v1alpha1.PodChaosSpec{
54 Action: v1alpha1.PodKillAction,
55 ContainerSelector: v1alpha1.ContainerSelector{
56 PodSelector: v1alpha1.PodSelector{
57 Selector: v1alpha1.PodSelectorSpec{
58 GenericSelectorSpec: v1alpha1.GenericSelectorSpec{
59 Namespaces: []string{
60 ns,
61 },
62 LabelSelectors: map[string]string{
63 "app": "nginx",
64 },
65 },
66 },
67 Mode: v1alpha1.OneMode,
68 },
69 },
70 },
71 }
72 err = cli.Create(ctx, podKillChaos)
73 framework.ExpectNoError(err, "create pod chaos error")
74
75 err = wait.Poll(5*time.Second, 5*time.Minute, func() (done bool, err error) {
76 _, err = kubeCli.CoreV1().Pods(ns).Get(context.TODO(), "nginx", metav1.GetOptions{})
77 if err != nil && apierrors.IsNotFound(err) {
78 return true, nil
79 }
80 return false, nil
81 })
82 framework.ExpectNoError(err, "Pod kill chaos perform failed")
83
84 }
85 func TestcasePodKillPauseThenUnPause(ns string, kubeCli kubernetes.Interface, cli client.Client) {
86 ctx, cancel := context.WithCancel(context.Background())
87 defer cancel()
88
89 nd := fixture.NewCommonNginxDeployment("nginx", ns, 3)
90 _, err := kubeCli.AppsV1().Deployments(ns).Create(context.TODO(), nd, metav1.CreateOptions{})
91 framework.ExpectNoError(err, "create nginx deployment error")
92 err = util.WaitDeploymentReady("nginx", ns, kubeCli)
93 framework.ExpectNoError(err, "wait nginx deployment ready error")
94
95 var pods *corev1.PodList
96 var newPods *corev1.PodList
97 listOption := metav1.ListOptions{
98 LabelSelector: labels.SelectorFromSet(map[string]string{
99 "app": "nginx",
100 }).String(),
101 }
102 pods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
103 framework.ExpectNoError(err, "get nginx pods error")
104
105 podKillChaos := &v1alpha1.PodChaos{
106 ObjectMeta: metav1.ObjectMeta{
107 Name: "nginx-kill",
108 Namespace: ns,
109 },
110 Spec: v1alpha1.PodChaosSpec{
111 Action: v1alpha1.PodKillAction,
112 Duration: pointer.StringPtr("9m"),
113 ContainerSelector: v1alpha1.ContainerSelector{
114 PodSelector: v1alpha1.PodSelector{
115 Selector: v1alpha1.PodSelectorSpec{
116 GenericSelectorSpec: v1alpha1.GenericSelectorSpec{
117 Namespaces: []string{
118 ns,
119 },
120 LabelSelectors: map[string]string{
121 "app": "nginx",
122 },
123 },
124 },
125 Mode: v1alpha1.OneMode,
126 },
127 },
128 },
129 }
130 err = cli.Create(ctx, podKillChaos)
131 framework.ExpectNoError(err, "create pod chaos error")
132
133 chaosKey := types.NamespacedName{
134 Namespace: ns,
135 Name: "nginx-kill",
136 }
137
138
139 err = wait.Poll(5*time.Second, 5*time.Minute, func() (done bool, err error) {
140 newPods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
141 framework.ExpectNoError(err, "get nginx pods error")
142 return !fixture.HaveSameUIDs(pods.Items, newPods.Items), nil
143 })
144 framework.ExpectNoError(err, "wait pod killed failed")
145
146
147 err = util.PauseChaos(ctx, cli, podKillChaos)
148 framework.ExpectNoError(err, "pause chaos error")
149
150 err = wait.Poll(1*time.Second, 5*time.Second, func() (done bool, err error) {
151 chaos := &v1alpha1.PodChaos{}
152 err = cli.Get(ctx, chaosKey, chaos)
153 framework.ExpectNoError(err, "get pod chaos error")
154 if chaos.Status.Experiment.DesiredPhase == v1alpha1.StoppedPhase {
155 return true, nil
156 }
157 return false, err
158 })
159 framework.ExpectError(err, "chaos shouldn't enter stopped phase")
160
161
162 pods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
163 framework.ExpectNoError(err, "get nginx pods error")
164 err = wait.Poll(5*time.Second, 1*time.Minute, func() (done bool, err error) {
165 newPods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
166 framework.ExpectNoError(err, "get nginx pods error")
167 return !fixture.HaveSameUIDs(pods.Items, newPods.Items), nil
168 })
169 framework.ExpectError(err, "wait pod not killed failed")
170 framework.ExpectEqual(err.Error(), wait.ErrWaitTimeout.Error())
171
172 }
173