1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package v1alpha1
17
18 import (
19 . "github.com/onsi/ginkgo/v2"
20 . "github.com/onsi/gomega"
21 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22 )
23
24 var _ = Describe("networkchaos_webhook", func() {
25 Context("Defaulter", func() {
26 It("set default namespace selector", func() {
27 networkchaos := &NetworkChaos{
28 ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault},
29 }
30 networkchaos.Default()
31 Expect(networkchaos.Spec.Selector.Namespaces[0]).To(Equal(metav1.NamespaceDefault))
32 })
33
34 It("set default DelaySpec", func() {
35 networkchaos := &NetworkChaos{
36 ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceDefault},
37 Spec: NetworkChaosSpec{
38 TcParameter: TcParameter{
39 Delay: &DelaySpec{
40 Latency: "90ms",
41 },
42 },
43 },
44 }
45 networkchaos.Default()
46 Expect(string(networkchaos.Spec.Delay.Correlation)).To(Equal(DefaultCorrelation))
47 Expect(string(networkchaos.Spec.Delay.Jitter)).To(Equal(DefaultJitter))
48 })
49 })
50 Context("webhook.Validator of networkchaos", func() {
51 It("Validate", func() {
52
53 type TestCase struct {
54 name string
55 chaos NetworkChaos
56 execute func(chaos *NetworkChaos) error
57 expect string
58 }
59 tcs := []TestCase{
60 {
61 name: "simple ValidateCreate",
62 chaos: NetworkChaos{
63 ObjectMeta: metav1.ObjectMeta{
64 Namespace: metav1.NamespaceDefault,
65 Name: "foo1",
66 },
67 },
68 execute: func(chaos *NetworkChaos) error {
69 _, err := chaos.ValidateCreate()
70 return err
71 },
72 expect: "",
73 },
74 {
75 name: "simple ValidateUpdate",
76 chaos: NetworkChaos{
77 ObjectMeta: metav1.ObjectMeta{
78 Namespace: metav1.NamespaceDefault,
79 Name: "foo2",
80 },
81 },
82 execute: func(chaos *NetworkChaos) error {
83 _, err := chaos.ValidateUpdate(chaos)
84 return err
85 },
86 expect: "",
87 },
88 {
89 name: "simple ValidateDelete",
90 chaos: NetworkChaos{
91 ObjectMeta: metav1.ObjectMeta{
92 Namespace: metav1.NamespaceDefault,
93 Name: "foo3",
94 },
95 },
96 execute: func(chaos *NetworkChaos) error {
97 _, err := chaos.ValidateDelete()
98 return err
99 },
100 expect: "",
101 },
102 {
103 name: "validate the delay",
104 chaos: NetworkChaos{
105 ObjectMeta: metav1.ObjectMeta{
106 Namespace: metav1.NamespaceDefault,
107 Name: "foo6",
108 },
109 Spec: NetworkChaosSpec{
110 TcParameter: TcParameter{
111 Delay: &DelaySpec{
112 Latency: "1S",
113 Jitter: "1S",
114 Correlation: "num",
115 },
116 },
117 },
118 },
119 execute: func(chaos *NetworkChaos) error {
120 _, err := chaos.ValidateCreate()
121 return err
122 },
123 expect: "error",
124 },
125 {
126 name: "validate the reorder",
127 chaos: NetworkChaos{
128 ObjectMeta: metav1.ObjectMeta{
129 Namespace: metav1.NamespaceDefault,
130 Name: "foo7",
131 },
132 Spec: NetworkChaosSpec{
133 TcParameter: TcParameter{
134 Delay: &DelaySpec{
135 Reorder: &ReorderSpec{
136 Reorder: "num",
137 Correlation: "num",
138 },
139 },
140 },
141 },
142 },
143 execute: func(chaos *NetworkChaos) error {
144 _, err := chaos.ValidateCreate()
145 return err
146 },
147 expect: "error",
148 },
149 {
150 name: "validate the loss",
151 chaos: NetworkChaos{
152 ObjectMeta: metav1.ObjectMeta{
153 Namespace: metav1.NamespaceDefault,
154 Name: "foo8",
155 },
156 Spec: NetworkChaosSpec{
157 TcParameter: TcParameter{
158 Loss: &LossSpec{
159 Loss: "num",
160 Correlation: "num",
161 },
162 },
163 },
164 },
165 execute: func(chaos *NetworkChaos) error {
166 _, err := chaos.ValidateCreate()
167 return err
168 },
169 expect: "error",
170 },
171 {
172 name: "validate the duplicate",
173 chaos: NetworkChaos{
174 ObjectMeta: metav1.ObjectMeta{
175 Namespace: metav1.NamespaceDefault,
176 Name: "foo9",
177 },
178 Spec: NetworkChaosSpec{
179 TcParameter: TcParameter{
180 Duplicate: &DuplicateSpec{
181 Duplicate: "num",
182 Correlation: "num",
183 },
184 },
185 },
186 },
187 execute: func(chaos *NetworkChaos) error {
188 _, err := chaos.ValidateCreate()
189 return err
190 },
191 expect: "error",
192 },
193 {
194 name: "validate the corrupt",
195 chaos: NetworkChaos{
196 ObjectMeta: metav1.ObjectMeta{
197 Namespace: metav1.NamespaceDefault,
198 Name: "foo10",
199 },
200 Spec: NetworkChaosSpec{
201 TcParameter: TcParameter{
202 Corrupt: &CorruptSpec{
203 Corrupt: "num",
204 Correlation: "num",
205 },
206 },
207 },
208 },
209 execute: func(chaos *NetworkChaos) error {
210 _, err := chaos.ValidateCreate()
211 return err
212 },
213 expect: "error",
214 },
215 {
216 name: "validate the bandwidth",
217 chaos: NetworkChaos{
218 ObjectMeta: metav1.ObjectMeta{
219 Namespace: metav1.NamespaceDefault,
220 Name: "foo11",
221 },
222 Spec: NetworkChaosSpec{
223 TcParameter: TcParameter{
224 Bandwidth: &BandwidthSpec{
225 Rate: "10",
226 },
227 },
228 },
229 },
230 execute: func(chaos *NetworkChaos) error {
231 _, err := chaos.ValidateCreate()
232 return err
233 },
234 expect: "error",
235 },
236 {
237 name: "validate the rate",
238 chaos: NetworkChaos{
239 ObjectMeta: metav1.ObjectMeta{
240 Namespace: metav1.NamespaceDefault,
241 Name: "foo11",
242 },
243 Spec: NetworkChaosSpec{
244 TcParameter: TcParameter{
245 Rate: &RateSpec{
246 Rate: "10",
247 },
248 },
249 },
250 },
251 execute: func(chaos *NetworkChaos) error {
252 _, err := chaos.ValidateCreate()
253 return err
254 },
255 expect: "error",
256 },
257 {
258 name: "validate the target",
259 chaos: NetworkChaos{
260 ObjectMeta: metav1.ObjectMeta{
261 Namespace: metav1.NamespaceDefault,
262 Name: "foo12",
263 },
264 Spec: NetworkChaosSpec{
265 Target: &PodSelector{
266 Mode: FixedMode,
267 Value: "0",
268 },
269 },
270 },
271 execute: func(chaos *NetworkChaos) error {
272 _, err := chaos.ValidateCreate()
273 return err
274 },
275 expect: "error",
276 },
277 {
278 name: "validate direction and externalTargets",
279 chaos: NetworkChaos{
280 ObjectMeta: metav1.ObjectMeta{
281 Namespace: metav1.NamespaceDefault,
282 Name: "foo12",
283 },
284 Spec: NetworkChaosSpec{
285 Direction: From,
286 ExternalTargets: []string{"8.8.8.8"},
287 },
288 },
289 execute: func(chaos *NetworkChaos) error {
290 _, err := chaos.ValidateCreate()
291 return err
292 },
293 expect: "error",
294 },
295 }
296
297 for _, tc := range tcs {
298 err := tc.execute(&tc.chaos)
299 if tc.expect == "error" {
300 Expect(err).To(HaveOccurred())
301 } else {
302 Expect(err).NotTo(HaveOccurred())
303 }
304 }
305 })
306 })
307 Context("isValidRateUnit", func() {
308 It("mbps unit, should convert number with unit successfully", func() {
309 isValid, err := isValidRateUnit(" 10 mbPs ")
310 Expect(err).Should(Succeed())
311 Expect(isValid).To(Equal(true))
312 })
313
314 It("kbit unit, should convert number with unit successfully", func() {
315 isValid, err := isValidRateUnit(" 10 kbit ")
316 Expect(err).Should(Succeed())
317 Expect(isValid).To(Equal(true))
318 })
319
320 It("should return error with invalid unit", func() {
321 isValid, err := isValidRateUnit(" 10 cpbs")
322 Expect(err).Should(HaveOccurred())
323 Expect(isValid).To(Equal(false))
324 })
325 })
326 })
327