Skip to content

Commit 4818f22

Browse files
committed
e2e, kv, udpn: Check ipv6 gateway is reconciled
Signed-off-by: Enrique Llorente <[email protected]>
1 parent f8474e1 commit 4818f22

File tree

2 files changed

+62
-14
lines changed

2 files changed

+62
-14
lines changed

test/e2e/kubevirt.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,7 @@ runcmd:
15551555
l[RequiredUDNNamespaceLabel] = ""
15561556
}
15571557
ns, err := fr.CreateNamespace(context.TODO(), fr.BaseName, l)
1558-
Expect(err).ToNot(HaveOccurred())
1558+
Expect(err).NotTo(HaveOccurred())
15591559
fr.Namespace = ns
15601560
namespace = fr.Namespace.Name
15611561

@@ -1705,22 +1705,38 @@ runcmd:
17051705
checkNorthSouthEgressICMPTraffic(vmi, []string{externalContainerIPV4Address, externalContainerIPV6Address}, step)
17061706
}
17071707

1708-
if td.role == "primary" && td.test.description == liveMigrate.description && isIPv4Supported() && isInterconnectEnabled() {
1709-
step = by(vm.Name, fmt.Sprintf("Checking IPv4 gateway cached mac after %s %s", td.resource.description, td.test.description))
1710-
Expect(crClient.Get(context.TODO(), crclient.ObjectKeyFromObject(vmi), vmi)).To(Succeed())
1708+
if td.role == "primary" && td.test.description == liveMigrate.description && isInterconnectEnabled() {
1709+
if isIPv4Supported() {
1710+
step = by(vmi.Name, fmt.Sprintf("Checking IPv4 gateway cached mac after %s %s", td.resource.description, td.test.description))
1711+
Expect(crClient.Get(context.TODO(), crclient.ObjectKeyFromObject(vmi), vmi)).To(Succeed())
17111712

1712-
targetNode, err := fr.ClientSet.CoreV1().Nodes().Get(context.Background(), vmi.Status.MigrationState.TargetNode, metav1.GetOptions{})
1713-
Expect(err).ToNot(HaveOccurred(), step)
1713+
targetNode, err := fr.ClientSet.CoreV1().Nodes().Get(context.Background(), vmi.Status.MigrationState.TargetNode, metav1.GetOptions{})
1714+
Expect(err).NotTo(HaveOccurred(), step)
17141715

1715-
expectedGatewayMAC, err := kubevirt.GenerateGatewayMAC(targetNode, netConfig.networkName)
1716-
Expect(err).ToNot(HaveOccurred(), step)
1716+
expectedGatewayMAC, err := kubevirt.GenerateGatewayMAC(targetNode, netConfig.networkName)
1717+
Expect(err).NotTo(HaveOccurred(), step)
17171718

1718-
Expect(err).ToNot(HaveOccurred(), step)
1719-
Eventually(kubevirt.RetrieveCachedGatewayMAC).
1720-
WithArguments(vmi, "enp1s0", cidrIPv4).
1721-
WithTimeout(10*time.Second).
1722-
WithPolling(time.Second).
1723-
Should(Equal(expectedGatewayMAC), step)
1719+
Expect(err).NotTo(HaveOccurred(), step)
1720+
Eventually(kubevirt.RetrieveCachedGatewayMAC).
1721+
WithArguments(vmi, "enp1s0", cidrIPv4).
1722+
WithTimeout(10*time.Second).
1723+
WithPolling(time.Second).
1724+
Should(Equal(expectedGatewayMAC), step)
1725+
}
1726+
if isIPv6Supported() {
1727+
step = by(vmi.Name, fmt.Sprintf("Checking IPv6 gateway after %s %s", td.resource.description, td.test.description))
1728+
1729+
targetNode, err := fr.ClientSet.CoreV1().Nodes().Get(context.Background(), vmi.Status.MigrationState.TargetNode, metav1.GetOptions{})
1730+
Expect(err).NotTo(HaveOccurred(), step)
1731+
1732+
targetNodeIPv6GatewayPath, err := kubevirt.GenerateGatewayIPv6RouterLLA(targetNode, netConfig.networkName)
1733+
Expect(err).NotTo(HaveOccurred())
1734+
Eventually(kubevirt.RetrieveIPv6Gateways).
1735+
WithArguments(vmi).
1736+
WithTimeout(5*time.Second).
1737+
WithPolling(time.Second).
1738+
Should(Equal([]string{targetNodeIPv6GatewayPath}), "should reconcile ipv6 gateway nexthop after live migration")
1739+
}
17241740
}
17251741
},
17261742
func(td testData) string {

test/e2e/kubevirt/net.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package kubevirt
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"net"
67
"strings"
@@ -9,6 +10,7 @@ import (
910
corev1 "k8s.io/api/core/v1"
1011

1112
kubevirtv1 "kubevirt.io/api/core/v1"
13+
v1 "kubevirt.io/api/core/v1"
1214

1315
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/config"
1416
"github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
@@ -44,6 +46,25 @@ func RetrieveCachedGatewayMAC(vmi *kubevirtv1.VirtualMachineInstance, dev, cidr
4446
return outputSplit[4], nil
4547
}
4648

49+
func RetrieveIPv6Gateways(vmi *v1.VirtualMachineInstance) ([]string, error) {
50+
routes := []struct {
51+
Gateway string `json:"gateway"`
52+
}{}
53+
54+
output, err := RunCommand(vmi, "ip -6 -j route list default", 2*time.Second)
55+
if err != nil {
56+
return nil, fmt.Errorf("%s: %v", output, err)
57+
}
58+
if err := json.Unmarshal([]byte(output), &routes); err != nil {
59+
return nil, fmt.Errorf("%s: %v", output, err)
60+
}
61+
paths := []string{}
62+
for _, route := range routes {
63+
paths = append(paths, route.Gateway)
64+
}
65+
return paths, nil
66+
}
67+
4768
func GenerateGatewayMAC(node *corev1.Node, networkName string) (string, error) {
4869
config.IPv4Mode = true
4970
lrpJoinAddress, err := util.ParseNodeGatewayRouterJoinNetwork(node, networkName)
@@ -67,3 +88,14 @@ func GenerateGatewayMAC(node *corev1.Node, networkName string) (string, error) {
6788

6889
return util.IPAddrToHWAddr(lrpJoinIP).String(), nil
6990
}
91+
92+
func GenerateGatewayIPv6RouterLLA(node *corev1.Node, networkName string) (string, error) {
93+
joinAddresses, err := util.ParseNodeGatewayRouterJoinAddrs(node, networkName)
94+
if err != nil {
95+
return "", err
96+
}
97+
if len(joinAddresses) == 0 {
98+
return "", fmt.Errorf("missing join addresses at node %q for network %q", node.Name, networkName)
99+
}
100+
return util.HWAddrToIPv6LLA(util.IPAddrToHWAddr(joinAddresses[0].IP)).String(), nil
101+
}

0 commit comments

Comments
 (0)