From 1b0174f28c9d97e42a9281261e58dbc130396e27 Mon Sep 17 00:00:00 2001 From: Xu Liu Date: Sat, 15 Feb 2025 05:00:32 +0800 Subject: [PATCH] Fix test failure of ServiceExternalIP with LoadBalancerModeDSR (#6994) Fixes: #6992 Signed-off-by: Xu Liu --- test/e2e/framework.go | 19 +++++++++++++++++++ test/e2e/service_externalip_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/test/e2e/framework.go b/test/e2e/framework.go index d18f65c482a..8064723c2f2 100644 --- a/test/e2e/framework.go +++ b/test/e2e/framework.go @@ -494,6 +494,25 @@ func controlPlaneNoScheduleTolerations() []corev1.Toleration { } } +func (data *TestData) getDefaultLoadBalancerMode() (config.LoadBalancerMode, error) { + featureGate, err := GetAgentFeatures() + if err != nil { + return config.LoadBalancerModeInvalid, err + } + if !featureGate.Enabled(features.LoadBalancerModeDSR) { + return config.LoadBalancerModeNAT, nil + } + agentConf, err := data.GetAntreaAgentConf() + if err != nil { + return config.LoadBalancerModeInvalid, err + } + valid, mode := config.GetLoadBalancerModeFromStr(agentConf.AntreaProxy.DefaultLoadBalancerMode) + if !valid { + return config.LoadBalancerModeInvalid, fmt.Errorf("invalid LoadBalancer mode %s", agentConf.AntreaProxy.DefaultLoadBalancerMode) + } + return mode, nil +} + func (data *TestData) InitProvider(providerName, providerConfigPath string) error { providerFactory := map[string]func(string) (providers.ProviderInterface, error){ "vagrant": providers.NewVagrantProvider, diff --git a/test/e2e/service_externalip_test.go b/test/e2e/service_externalip_test.go index aab57e935df..25ff395acfb 100644 --- a/test/e2e/service_externalip_test.go +++ b/test/e2e/service_externalip_test.go @@ -35,6 +35,7 @@ import ( utilnet "k8s.io/utils/net" "antrea.io/antrea/pkg/agent/apis" + "antrea.io/antrea/pkg/agent/config" antreaagenttypes "antrea.io/antrea/pkg/agent/types" "antrea.io/antrea/pkg/apis/crd/v1beta1" "antrea.io/antrea/pkg/features" @@ -779,6 +780,32 @@ func testExternalIPAccess(t *testing.T, data *TestData) { externalIP, host, err := waitExternalIPConfigured(service) require.NoError(t, err) + lbMode, err := data.getDefaultLoadBalancerMode() + require.NoError(t, err) + // A route to the client IP is required in DSR mode. + if lbMode == config.LoadBalancerModeDSR { + nodeInfo := getNodeByName(host) + workerNodeIP := clusterInfo.nodes[nodeInfo.idx].ip() + addRouteToClientIPCmd := []string{"ip", "route", "replace", tt.clientIP, "via", workerNodeIP} + delRouteToClientIPCmd := []string{"ip", "route", "del", tt.clientIP, "via", workerNodeIP} + // We run backend Pods for the Service on two Nodes, + // so we need the route to be installed on the Node + // where the client is not running. + for idx := range nodes { + node := nodes[idx] + if node == host { + continue + } + stdout, stderr, err := data.RunCommandFromAntreaPodOnNode(node, addRouteToClientIPCmd) + require.NoError(t, err, "Failed to add route to client IP on Node %s, stdout: %s, stderr: %s: cmd: %q", node, stdout, stderr, addRouteToClientIPCmd) + + defer func() { + stdout, stderr, err := data.RunCommandFromAntreaPodOnNode(node, delRouteToClientIPCmd) + assert.NoError(t, err, "Failed to delete route to client IP on Node %s, stdout: %s, stderr: %s", node, stdout, stderr) + }() + } + } + // Create a pod in a different netns with the same subnet of the external IP to mock as another Node in the same subnet. cmd, netns := getCommandInFakeExternalNetwork("sleep 3600", tt.clientIPMaskLen, tt.clientIP, tt.localIP)