Skip to content

Commit 33ab351

Browse files
committed
test: verify source IP is preserved
1 parent 800a8a9 commit 33ab351

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

test/e2e/serviceloadbalancer_helpers.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"context"
1010
"fmt"
1111
"io"
12+
"net"
1213
"net/http"
1314
"net/url"
1415
"strings"
@@ -20,12 +21,14 @@ import (
2021
corev1 "k8s.io/api/core/v1"
2122
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2223
"k8s.io/apimachinery/pkg/util/intstr"
24+
"k8s.io/klog/v2"
2325
"k8s.io/utils/ptr"
2426
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2527
"sigs.k8s.io/cluster-api/test/framework"
2628
"sigs.k8s.io/controller-runtime/pkg/client"
2729

2830
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
31+
capiutils "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/capi/utils"
2932
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/lifecycle/serviceloadbalancer/metallb"
3033
)
3134

@@ -170,6 +173,31 @@ func EnsureLoadBalancerService(
170173
}
171174
output := testServiceLoadBalancer(ctx, getClientIPURL, input.ServiceIntervals)
172175
Expect(output).ToNot(BeEmpty())
176+
klog.Infof("Kubernetes Service LoadBalancer output: %q", output)
177+
178+
By("Verifying that the source IP is as expected")
179+
// It is not simple to get the source IP of the runner because its possible connect through a VPN.
180+
//
181+
// When source IP preservation is not enabled,
182+
// the source IP that the LoadBalancer Service responds with an IP from the Cluster's Pod subnet.
183+
// When source IP preservation is enabled, we test the source IP is different from the Pod IP.
184+
// The output will be something like:
185+
// 192.168.1.141:32768 - when source IP preservation is not enabled.
186+
// 10.22.24.12:32768 - when source IP preservation is enabled.
187+
// Get the source IP from the output.
188+
sourceIPStr := strings.Split(output, ":")[0]
189+
sourceIP := net.ParseIP(sourceIPStr)
190+
Expect(sourceIP).ToNot(BeNil())
191+
// Get the Cluster's Pod subnet.
192+
podCIDRStr := input.WorkloadCluster.Spec.ClusterNetwork.Pods.CIDRBlocks[0]
193+
_, podCIDR, err := net.ParseCIDR(podCIDRStr)
194+
Expect(err).ToNot(HaveOccurred())
195+
Expect(podCIDR).ToNot(BeNil())
196+
197+
// When skip kube-proxy is false (i.e. kube-proxy is enabled), sourceIP should be from the Pod subnet.
198+
// Otherwise, sourceIP will be some external IP.
199+
expectIPFromPodSubnet := !capiutils.ShouldSkipKubeProxy(input.WorkloadCluster)
200+
Expect(podCIDR.Contains(sourceIP)).To(Equal(expectIPFromPodSubnet))
173201
}
174202

175203
func createTestService(

0 commit comments

Comments
 (0)