mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-24 19:38:02 +00:00
@@ -403,3 +403,26 @@ func GetClusterIPByFamily(ipFamily v1.IPFamily, service *v1.Service) string {
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// FilterIncorrectLoadBalancerIngress filters out the ingresses with an IP version different from the given one
|
||||
func FilterIncorrectLoadBalancerIngress(ingresses []v1.LoadBalancerIngress, ipFamily v1.IPFamily) ([]v1.LoadBalancerIngress, []v1.LoadBalancerIngress) {
|
||||
var validIngresses []v1.LoadBalancerIngress
|
||||
var invalidIngresses []v1.LoadBalancerIngress
|
||||
|
||||
for _, ing := range ingresses {
|
||||
// []string{ing.IP} have a len of 1, so len(correctIPs) + len(incorrectIPs) == 1
|
||||
correctIPs, _ := FilterIncorrectIPVersion([]string{ing.IP}, ipFamily)
|
||||
|
||||
// len is either 1 or 0
|
||||
if len(correctIPs) == 1 {
|
||||
// Update the LoadBalancerStatus with the filtered IP
|
||||
validIngresses = append(validIngresses, ing)
|
||||
continue
|
||||
}
|
||||
|
||||
// here len(incorrectIPs) == 1 since len(correctIPs) == 0
|
||||
invalidIngresses = append(invalidIngresses, ing)
|
||||
}
|
||||
|
||||
return validIngresses, invalidIngresses
|
||||
}
|
||||
|
@@ -822,3 +822,179 @@ func TestGetClusterIPByFamily(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestFilterIncorrectLoadBalancerIngress(t *testing.T) {
|
||||
ipModeVIP := v1.LoadBalancerIPModeVIP
|
||||
testCases := []struct {
|
||||
name string
|
||||
ingresses []v1.LoadBalancerIngress
|
||||
ipFamily v1.IPFamily
|
||||
expectedCorrect []v1.LoadBalancerIngress
|
||||
expectedIncorrect []v1.LoadBalancerIngress
|
||||
}{
|
||||
{
|
||||
name: "IPv4 only valid ingresses",
|
||||
ipFamily: v1.IPv4Protocol,
|
||||
ingresses: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
IP: "1.2.3.5",
|
||||
},
|
||||
},
|
||||
expectedCorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
IP: "1.2.3.5",
|
||||
},
|
||||
},
|
||||
expectedIncorrect: nil,
|
||||
},
|
||||
{
|
||||
name: "IPv4 some invalid ingresses",
|
||||
ipFamily: v1.IPv4Protocol,
|
||||
ingresses: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
IP: "2000::1",
|
||||
},
|
||||
{
|
||||
Hostname: "dummy",
|
||||
},
|
||||
},
|
||||
expectedCorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
Hostname: "dummy", // weirdly no IP is a valid IPv4 but invalid IPv6
|
||||
},
|
||||
},
|
||||
expectedIncorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "IPv4 only invalid ingresses",
|
||||
ipFamily: v1.IPv4Protocol,
|
||||
ingresses: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
},
|
||||
{
|
||||
IP: "2000::1",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
},
|
||||
expectedCorrect: nil,
|
||||
expectedIncorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
},
|
||||
{
|
||||
IP: "2000::1",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "IPv6 only valid ingresses",
|
||||
ipFamily: v1.IPv6Protocol,
|
||||
ingresses: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
IP: "2000::2",
|
||||
},
|
||||
},
|
||||
expectedCorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
IP: "2000::2",
|
||||
},
|
||||
},
|
||||
expectedIncorrect: nil,
|
||||
},
|
||||
{
|
||||
name: "IPv6 some invalid ingresses",
|
||||
ipFamily: v1.IPv6Protocol,
|
||||
ingresses: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
},
|
||||
{
|
||||
Hostname: "dummy",
|
||||
},
|
||||
},
|
||||
expectedCorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "2000::1",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
},
|
||||
expectedIncorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
},
|
||||
{
|
||||
Hostname: "dummy", // weirdly no IP is a valid IPv4 but invalid IPv6
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "IPv6 only invalid ingresses",
|
||||
ipFamily: v1.IPv6Protocol,
|
||||
ingresses: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
},
|
||||
{
|
||||
IP: "1.2.3.5",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
},
|
||||
expectedCorrect: nil,
|
||||
expectedIncorrect: []v1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "1.2.3.4",
|
||||
},
|
||||
{
|
||||
IP: "1.2.3.5",
|
||||
IPMode: &ipModeVIP,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, testCase := range testCases {
|
||||
t.Run(testCase.name, func(t *testing.T) {
|
||||
correctIngresses, incorrectIngresses := FilterIncorrectLoadBalancerIngress(testCase.ingresses, testCase.ipFamily)
|
||||
if !reflect.DeepEqual(correctIngresses, testCase.expectedCorrect) {
|
||||
t.Errorf("Test %v failed: expected %v, got %v", testCase.name, testCase.expectedCorrect, correctIngresses)
|
||||
}
|
||||
if !reflect.DeepEqual(incorrectIngresses, testCase.expectedIncorrect) {
|
||||
t.Errorf("Test %v failed: expected %v, got %v", testCase.name, testCase.expectedIncorrect, incorrectIngresses)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user