Skip to content

Commit 56def96

Browse files
committed
Update DialFromNode to return values as is done w/ other tests. Update
comments to clarify missing probability check function (since they need to be updated anyways b/c of the return value introduced)
1 parent 24cfb41 commit 56def96

File tree

3 files changed

+70
-35
lines changed

3 files changed

+70
-35
lines changed

test/e2e/common/networking.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ var _ = ginkgo.Describe("[sig-network] Networking", func() {
103103
framework.ConformanceIt("should function for node-pod communication: http [LinuxOnly] [NodeConformance]", func() {
104104
config := e2enetwork.NewCoreNetworkingTestConfig(f, true)
105105
for _, endpointPod := range config.EndpointPods {
106-
config.DialFromNode("http", endpointPod.Status.PodIP, e2enetwork.EndpointHTTPPort, config.MaxTries, 0, sets.NewString(endpointPod.Name))
106+
err := config.DialFromNode("http", endpointPod.Status.PodIP, e2enetwork.EndpointHTTPPort, config.MaxTries, 0, sets.NewString(endpointPod.Name))
107+
if err != nil {
108+
framework.Failf("Error dialing HTTP node to pod %v", err)
109+
}
107110
}
108111
})
109112

@@ -117,7 +120,10 @@ var _ = ginkgo.Describe("[sig-network] Networking", func() {
117120
framework.ConformanceIt("should function for node-pod communication: udp [LinuxOnly] [NodeConformance]", func() {
118121
config := e2enetwork.NewCoreNetworkingTestConfig(f, true)
119122
for _, endpointPod := range config.EndpointPods {
120-
config.DialFromNode("udp", endpointPod.Status.PodIP, e2enetwork.EndpointUDPPort, config.MaxTries, 0, sets.NewString(endpointPod.Name))
123+
err := config.DialFromNode("udp", endpointPod.Status.PodIP, e2enetwork.EndpointUDPPort, config.MaxTries, 0, sets.NewString(endpointPod.Name))
124+
if err != nil {
125+
framework.Failf("Error dialing UDP from node to pod: %v", err)
126+
}
121127
}
122128
})
123129
})

test/e2e/framework/network/utils.go

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -380,17 +380,20 @@ func (config *NetworkingTestConfig) GetHTTPCodeFromTestContainer(path, targetIP
380380
return code, nil
381381
}
382382

383-
// DialFromNode executes a tcp or udp request based on protocol via kubectl exec
383+
// DialFromNode executes a tcp or udp curl/echo request based on protocol via kubectl exec
384384
// in a test container running with host networking.
385-
// - minTries is the minimum number of curl attempts required before declaring
386-
// success. Set to 0 if you'd like to return as soon as all endpoints respond
387-
// at least once.
388-
// - maxTries is the maximum number of curl attempts. If this many attempts pass
389-
// and we don't see all expected endpoints, the test fails.
390-
// maxTries == minTries will confirm that we see the expected endpoints and no
391-
// more for maxTries. Use this if you want to eg: fail a readiness check on a
392-
// pod and confirm it doesn't show up as an endpoint.
393-
func (config *NetworkingTestConfig) DialFromNode(protocol, targetIP string, targetPort, maxTries, minTries int, expectedEps sets.String) {
385+
// - minTries is the minimum number of curl/echo attempts required before declaring
386+
// success. If 0, then we return as soon as all endpoints succeed.
387+
// - There is no logical change to test results if faillures happen AFTER endpoints have succeeded,
388+
// hence over-padding minTries will NOT reverse a successfull result and is thus not very useful yet
389+
// (See the TODO about checking probability, which isnt implemented yet).
390+
// - maxTries is the maximum number of curl/echo attempts before an error is returned. The
391+
// smaller this number is, the less 'slack' there is for declaring success.
392+
// - if maxTries < expectedEps, this test is guaranteed to return an error, because all endpoints wont be hit.
393+
// - maxTries == minTries will return as soon as all endpoints succeed (or fail once maxTries is reached without
394+
// success on all endpoints).
395+
// In general its prudent to have a high enough level of minTries to guarantee that all pods get a fair chance at receiving traffic.
396+
func (config *NetworkingTestConfig) DialFromNode(protocol, targetIP string, targetPort, maxTries, minTries int, expectedEps sets.String) error {
394397
var cmd string
395398
if protocol == "udp" {
396399
cmd = fmt.Sprintf("echo hostName | nc -w 1 -u %s %d", targetIP, targetPort)
@@ -424,8 +427,8 @@ func (config *NetworkingTestConfig) DialFromNode(protocol, targetIP string, targ
424427

425428
// Check against i+1 so we exit if minTries == maxTries.
426429
if eps.Equal(expectedEps) && i+1 >= minTries {
427-
framework.Logf("Found all expected endpoints: %+v", eps.List())
428-
return
430+
framework.Logf("Found all %+v expected endpoints: %+v", len(eps.List()), eps.List())
431+
return nil
429432
}
430433

431434
framework.Logf("Waiting for %+v endpoints (expected=%+v, actual=%+v)", expectedEps.Difference(eps).List(), expectedEps.List(), eps.List())
@@ -435,7 +438,7 @@ func (config *NetworkingTestConfig) DialFromNode(protocol, targetIP string, targ
435438
}
436439

437440
config.diagnoseMissingEndpoints(eps)
438-
framework.Failf("Failed to find expected endpoints:\nTries %d\nCommand %v\nretrieved %v\nexpected %v\n", maxTries, cmd, eps, expectedEps)
441+
return fmt.Errorf("failed to find expected endpoints:\nTries %d\nCommand %v\nretrieved %v\nexpected %v\n", maxTries, cmd, eps, expectedEps)
439442
}
440443

441444
// GetSelfURL executes a curl against the given path via kubectl exec into a

test/e2e/network/networking.go

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -210,18 +210,29 @@ var _ = SIGDescribe("Networking", func() {
210210
ginkgo.It("should function for node-Service: http", func() {
211211
config := e2enetwork.NewNetworkingTestConfig(f, true, false)
212212
ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (config.clusterIP)", config.NodeIP, config.ClusterIP, e2enetwork.ClusterHTTPPort))
213-
config.DialFromNode("http", config.ClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
213+
err := config.DialFromNode("http", config.ClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
214+
if err != nil {
215+
framework.Failf("failed dialing endpoint, %v", err)
216+
}
214217
ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeHTTPPort))
215-
config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
218+
err = config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
219+
if err != nil {
220+
framework.Failf("failed dialing endpoint, %v", err)
221+
}
216222
})
217223

218224
ginkgo.It("should function for node-Service: udp", func() {
219225
config := e2enetwork.NewNetworkingTestConfig(f, true, false)
220226
ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (config.clusterIP)", config.NodeIP, config.ClusterIP, e2enetwork.ClusterUDPPort))
221-
config.DialFromNode("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames())
222-
227+
err := config.DialFromNode("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames())
228+
if err != nil {
229+
framework.Failf("failed dialing endpoint, %v", err)
230+
}
223231
ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeUDPPort))
224-
config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames())
232+
err = config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames())
233+
if err != nil {
234+
framework.Failf("failed dialing endpoint, %v", err)
235+
}
225236
})
226237

227238
ginkgo.It("should function for endpoint-Service: http", func() {
@@ -305,14 +316,15 @@ var _ = SIGDescribe("Networking", func() {
305316
ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterHTTPPort))
306317
err := config.DialFromTestContainer("http", config.ClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
307318
if err != nil {
308-
framework.Failf("failed dialing endpoint, %v", err)
319+
framework.Failf("failed dialing endpoint (initial), %v", err)
309320
}
321+
ginkgo.By("Deleting a pod which, will be replaced with a new endpoint")
310322
config.DeleteNetProxyPod()
311323

312-
ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterHTTPPort))
324+
ginkgo.By(fmt.Sprintf("dialing(http) %v --> %v:%v (config.clusterIP) (endpoint recovery)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterHTTPPort))
313325
err = config.DialFromTestContainer("http", config.ClusterIP, e2enetwork.ClusterHTTPPort, config.MaxTries, config.MaxTries, config.EndpointHostnames())
314326
if err != nil {
315-
framework.Failf("failed dialing endpoint, %v", err)
327+
framework.Failf("failed dialing endpoint (recovery), %v", err)
316328
}
317329
})
318330

@@ -321,39 +333,53 @@ var _ = SIGDescribe("Networking", func() {
321333
ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterUDPPort))
322334
err := config.DialFromTestContainer("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, 0, config.EndpointHostnames())
323335
if err != nil {
324-
framework.Failf("failed dialing endpoint, %v", err)
336+
framework.Failf("failed dialing endpoint (initial), %v", err)
325337
}
338+
ginkgo.By("Deleting a pod which, will be replaced with a new endpoint")
326339
config.DeleteNetProxyPod()
327340

328-
ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterUDPPort))
341+
ginkgo.By(fmt.Sprintf("dialing(udp) %v --> %v:%v (config.clusterIP) (endpoint recovery)", config.TestContainerPod.Name, config.ClusterIP, e2enetwork.ClusterUDPPort))
329342
err = config.DialFromTestContainer("udp", config.ClusterIP, e2enetwork.ClusterUDPPort, config.MaxTries, config.MaxTries, config.EndpointHostnames())
330343
if err != nil {
331-
framework.Failf("failed dialing endpoint, %v", err)
344+
framework.Failf("failed dialing endpoint (recovery), %v", err)
332345
}
333346
})
334347

335348
// Slow because we confirm that the nodePort doesn't serve traffic, which requires a period of polling.
336349
ginkgo.It("should update nodePort: http [Slow]", func() {
337350
config := e2enetwork.NewNetworkingTestConfig(f, true, false)
338-
ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeHTTPPort))
339-
config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
340-
351+
ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP) and getting ALL host endpoints", config.NodeIP, config.NodeIP, config.NodeHTTPPort))
352+
err := config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, 0, config.EndpointHostnames())
353+
if err != nil {
354+
framework.Failf("Error dialing http from node: %v", err)
355+
}
356+
ginkgo.By("Deleting the node port access point")
341357
config.DeleteNodePortService()
342358

343-
ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeHTTPPort))
344-
config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, config.MaxTries, sets.NewString())
359+
ginkgo.By(fmt.Sprintf("dialing(http) %v (node) --> %v:%v (nodeIP) and getting ZERO host endpoints", config.NodeIP, config.NodeIP, config.NodeHTTPPort))
360+
err = config.DialFromNode("http", config.NodeIP, config.NodeHTTPPort, config.MaxTries, config.MaxTries, sets.NewString())
361+
if err != nil {
362+
framework.Failf("Error dialing http from node: %v", err)
363+
}
345364
})
346365

347366
// Slow because we confirm that the nodePort doesn't serve traffic, which requires a period of polling.
348367
ginkgo.It("should update nodePort: udp [Slow]", func() {
349368
config := e2enetwork.NewNetworkingTestConfig(f, true, false)
350-
ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeUDPPort))
351-
config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames())
369+
ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP) and getting ALL host endpoints", config.NodeIP, config.NodeIP, config.NodeUDPPort))
370+
err := config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, 0, config.EndpointHostnames())
371+
if err != nil {
372+
framework.Failf("Failure validating that nodePort service WAS forwarding properly: %v", err)
373+
}
352374

375+
ginkgo.By("Deleting the node port access point")
353376
config.DeleteNodePortService()
354377

355-
ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP)", config.NodeIP, config.NodeIP, config.NodeUDPPort))
356-
config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, config.MaxTries, sets.NewString())
378+
ginkgo.By(fmt.Sprintf("dialing(udp) %v (node) --> %v:%v (nodeIP) and getting ZERO host endpoints", config.NodeIP, config.NodeIP, config.NodeUDPPort))
379+
err = config.DialFromNode("udp", config.NodeIP, config.NodeUDPPort, config.MaxTries, config.MaxTries, sets.NewString())
380+
if err != nil {
381+
framework.Failf("Failure validating that node port service STOPPED removed properly: %v", err)
382+
}
357383
})
358384

359385
// [LinuxOnly]: Windows does not support session affinity.

0 commit comments

Comments
 (0)