From fa7a802d55339296e389b8b55c8198f77fbdb845 Mon Sep 17 00:00:00 2001 From: "Christopher M. Luciano" Date: Mon, 2 Nov 2020 14:55:24 -0500 Subject: [PATCH] dualstack: use correct IPFamily list for conntrack checks in e2e We hardcode the index number in the KubeProxy/Conntrack e2es and CollectAddresses returns 4 mixed IP Family addresses in a dualstack cluster. This change ensures that the serverNodeInfo.nodeIP has only valid addresses for the expected IPFamily per test case. Signed-off-by: Christopher M. Luciano --- test/e2e/framework/node/BUILD | 1 + test/e2e/framework/node/resource.go | 21 +++++++++++++++++++++ test/e2e/network/conntrack.go | 13 +++++++++++-- test/e2e/network/kube_proxy.go | 15 ++++++++++++--- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/test/e2e/framework/node/BUILD b/test/e2e/framework/node/BUILD index 68e044e4e28..0641680f091 100644 --- a/test/e2e/framework/node/BUILD +++ b/test/e2e/framework/node/BUILD @@ -27,6 +27,7 @@ go_library( "//test/utils/image:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", + "//vendor/k8s.io/utils/net:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/test/e2e/framework/node/resource.go b/test/e2e/framework/node/resource.go index 012d033c95e..a5dc8b1bffb 100644 --- a/test/e2e/framework/node/resource.go +++ b/test/e2e/framework/node/resource.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "fmt" + netutil "k8s.io/utils/net" "net" "strings" "time" @@ -248,6 +249,26 @@ func GetInternalIP(node *v1.Node) (string, error) { return host, nil } +// GetAddressesByTypeAndFamily returns a list of addresses of the given addressType for the given node +// and filtered by IPFamily +func GetAddressesByTypeAndFamily(node *v1.Node, addressType v1.NodeAddressType, family v1.IPFamily) (ips []string) { + for _, nodeAddress := range node.Status.Addresses { + if nodeAddress.Type != addressType { + continue + } + if nodeAddress.Address == "" { + continue + } + if family == v1.IPv6Protocol && netutil.IsIPv6String(nodeAddress.Address) { + ips = append(ips, nodeAddress.Address) + } + if family == v1.IPv4Protocol && !netutil.IsIPv6String(nodeAddress.Address) { + ips = append(ips, nodeAddress.Address) + } + } + return +} + // GetAddresses returns a list of addresses of the given addressType for the given node func GetAddresses(node *v1.Node, addressType v1.NodeAddressType) (ips []string) { for j := range node.Status.Addresses { diff --git a/test/e2e/network/conntrack.go b/test/e2e/network/conntrack.go index 8ebfa63a890..55bd1a97c23 100644 --- a/test/e2e/network/conntrack.go +++ b/test/e2e/network/conntrack.go @@ -103,16 +103,25 @@ var _ = SIGDescribe("Conntrack", func() { len(nodes.Items)) } - ips := e2enode.CollectAddresses(nodes, v1.NodeInternalIP) + var family v1.IPFamily + if framework.TestContext.ClusterIsIPv6() { + family = v1.IPv6Protocol + } else { + family = v1.IPv4Protocol + } + + ips := e2enode.GetAddressesByTypeAndFamily(&nodes.Items[0], v1.NodeInternalIP, family) clientNodeInfo = nodeInfo{ name: nodes.Items[0].Name, nodeIP: ips[0], } + ips = e2enode.GetAddressesByTypeAndFamily(&nodes.Items[1], v1.NodeInternalIP, family) + serverNodeInfo = nodeInfo{ name: nodes.Items[1].Name, - nodeIP: ips[1], + nodeIP: ips[0], } }) diff --git a/test/e2e/network/kube_proxy.go b/test/e2e/network/kube_proxy.go index 82277d5b125..f25184db3ac 100644 --- a/test/e2e/network/kube_proxy.go +++ b/test/e2e/network/kube_proxy.go @@ -60,24 +60,33 @@ var _ = SIGDescribe("KubeProxy", func() { len(nodes.Items)) } - ips := e2enode.CollectAddresses(nodes, v1.NodeInternalIP) - type NodeInfo struct { node *v1.Node name string nodeIP string } + var family v1.IPFamily + if framework.TestContext.ClusterIsIPv6() { + family = v1.IPv6Protocol + } else { + family = v1.IPv4Protocol + } + + ips := e2enode.GetAddressesByTypeAndFamily(&nodes.Items[0], v1.NodeInternalIP, family) + clientNodeInfo := NodeInfo{ node: &nodes.Items[0], name: nodes.Items[0].Name, nodeIP: ips[0], } + ips = e2enode.GetAddressesByTypeAndFamily(&nodes.Items[1], v1.NodeInternalIP, family) + serverNodeInfo := NodeInfo{ node: &nodes.Items[1], name: nodes.Items[1].Name, - nodeIP: ips[1], + nodeIP: ips[0], } // Create a pod to check the conntrack entries on the host node