Skip to content

Commit 0bbfdd8

Browse files
committed
[e2e fix] Parse JoinIPs from the NAD spec instead of annotation.
Signed-off-by: Nadia Pinaeva <[email protected]>
1 parent 0e565af commit 0bbfdd8

File tree

2 files changed

+61
-20
lines changed

2 files changed

+61
-20
lines changed

test/e2e/kubevirt.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import (
5858
ipamclaimsv1alpha1 "github.com/k8snetworkplumbingwg/ipamclaims/pkg/crd/ipamclaims/v1alpha1"
5959
nadapi "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
6060
nadv1 "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/apis/k8s.cni.cncf.io/v1"
61+
nadclient "github.com/k8snetworkplumbingwg/network-attachment-definition-client/pkg/client/clientset/versioned/typed/k8s.cni.cncf.io/v1"
6162

6263
iputils "github.com/containernetworking/plugins/pkg/ip"
6364

@@ -111,6 +112,7 @@ var _ = Describe("Kubevirt Virtual Machines", feature.VirtualMachineSupport, fun
111112
httpServerTestPods = []*corev1.Pod{}
112113
iperfServerTestPods = []*corev1.Pod{}
113114
clientSet kubernetes.Interface
115+
nadClient nadclient.K8sCniCncfIoV1Interface
114116
providerCtx infraapi.Context
115117
// Systemd resolvd prevent resolving kube api service by fqdn, so
116118
// we replace it here with NetworkManager
@@ -1329,6 +1331,15 @@ fi
13291331
return ra.Status.Status
13301332
}, 30*time.Second, time.Second).Should(Equal("Accepted"))
13311333
}
1334+
1335+
getJoinIPs = func(cudn *udnv1.ClusterUserDefinedNetwork) []string {
1336+
nad, err := nadClient.NetworkAttachmentDefinitions(namespace).Get(context.TODO(), cudn.Name, metav1.GetOptions{})
1337+
Expect(err).NotTo(HaveOccurred())
1338+
var result map[string]interface{}
1339+
err = json.Unmarshal([]byte(nad.Spec.Config), &result)
1340+
Expect(err).NotTo(HaveOccurred())
1341+
return strings.Split(result["joinSubnet"].(string), ",")
1342+
}
13321343
)
13331344
BeforeEach(func() {
13341345
// So we can use it at AfterEach, since fr.ClientSet is nil there
@@ -1341,6 +1352,9 @@ fi
13411352

13421353
virtClient, err = kubevirt.NewClient("/tmp")
13431354
Expect(err).NotTo(HaveOccurred())
1355+
1356+
nadClient, err = nadclient.NewForConfig(fr.ClientConfig())
1357+
Expect(err).NotTo(HaveOccurred())
13441358
})
13451359

13461360
Context("with default pod network", Ordered, func() {
@@ -1882,7 +1896,7 @@ ip route add %[3]s via %[4]s
18821896
nodeRunningVMI, err := fr.ClientSet.CoreV1().Nodes().Get(context.Background(), vmi.Status.NodeName, metav1.GetOptions{})
18831897
Expect(err).NotTo(HaveOccurred(), step)
18841898

1885-
expectedIPv6GatewayPath, err := kubevirt.GenerateGatewayIPv6RouterLLA(nodeRunningVMI, networkName)
1899+
expectedIPv6GatewayPath, err := kubevirt.GenerateGatewayIPv6RouterLLA(nodeRunningVMI, getJoinIPs(cudn))
18861900
Expect(err).NotTo(HaveOccurred())
18871901
Eventually(kubevirt.RetrieveIPv6Gateways).
18881902
WithArguments(virtClient, vmi).
@@ -1953,7 +1967,7 @@ ip route add %[3]s via %[4]s
19531967
targetNode, err := fr.ClientSet.CoreV1().Nodes().Get(context.Background(), vmi.Status.MigrationState.TargetNode, metav1.GetOptions{})
19541968
Expect(err).NotTo(HaveOccurred(), step)
19551969

1956-
expectedGatewayMAC, err := kubevirt.GenerateGatewayMAC(targetNode, networkName)
1970+
expectedGatewayMAC, err := kubevirt.GenerateGatewayMAC(targetNode, getJoinIPs(cudn))
19571971
Expect(err).NotTo(HaveOccurred(), step)
19581972

19591973
Expect(err).NotTo(HaveOccurred(), step)
@@ -1969,7 +1983,7 @@ ip route add %[3]s via %[4]s
19691983
targetNode, err := fr.ClientSet.CoreV1().Nodes().Get(context.Background(), vmi.Status.MigrationState.TargetNode, metav1.GetOptions{})
19701984
Expect(err).NotTo(HaveOccurred(), step)
19711985

1972-
targetNodeIPv6GatewayPath, err := kubevirt.GenerateGatewayIPv6RouterLLA(targetNode, networkName)
1986+
targetNodeIPv6GatewayPath, err := kubevirt.GenerateGatewayIPv6RouterLLA(targetNode, getJoinIPs(cudn))
19731987
Expect(err).NotTo(HaveOccurred())
19741988
Eventually(kubevirt.RetrieveIPv6Gateways).
19751989
WithArguments(virtClient, vmi).

test/e2e/kubevirt/net.go

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"strings"
88
"time"
99

10+
iputils "github.com/containernetworking/plugins/pkg/ip"
11+
1012
corev1 "k8s.io/api/core/v1"
1113

1214
kubevirtv1 "kubevirt.io/api/core/v1"
@@ -65,37 +67,62 @@ func RetrieveIPv6Gateways(cli *Client, vmi *v1.VirtualMachineInstance) ([]string
6567
return paths, nil
6668
}
6769

68-
func GenerateGatewayMAC(node *corev1.Node, networkName string) (string, error) {
70+
func GenerateGatewayMAC(node *corev1.Node, joinSubnets []string) (string, error) {
6971
config.IPv4Mode = true
70-
lrpJoinAddress, err := util.ParseNodeGatewayRouterJoinNetwork(node, networkName)
72+
lrpJoinAddress, err := GetDefaultUDNGWRouterIPs(node, joinSubnets)
7173
if err != nil {
7274
return "", err
7375
}
7476

75-
lrpJoinIPString := lrpJoinAddress.IPv4
76-
if lrpJoinIPString == "" {
77-
lrpJoinIPString = lrpJoinAddress.IPv6
77+
if len(lrpJoinAddress) == 0 {
78+
return "", fmt.Errorf("missing lrp join ip at node %q", node.Name)
7879
}
7980

80-
if lrpJoinIPString == "" {
81-
return "", fmt.Errorf("missing lrp join ip at node %q with network %q", node.Name)
82-
}
81+
return util.IPAddrToHWAddr(*lrpJoinAddress[0]).String(), nil
82+
}
8383

84-
lrpJoinIP, _, err := net.ParseCIDR(lrpJoinIPString)
84+
func GenerateGatewayIPv6RouterLLA(node *corev1.Node, joinSubnets []string) (string, error) {
85+
config.IPv4Mode = true
86+
joinAddresses, err := GetDefaultUDNGWRouterIPs(node, joinSubnets)
8587
if err != nil {
8688
return "", err
8789
}
88-
89-
return util.IPAddrToHWAddr(lrpJoinIP).String(), nil
90+
if len(joinAddresses) == 0 {
91+
return "", fmt.Errorf("missing join addresses at node %q", node.Name)
92+
}
93+
return util.HWAddrToIPv6LLA(util.IPAddrToHWAddr(*joinAddresses[0])).String(), nil
9094
}
9195

92-
func GenerateGatewayIPv6RouterLLA(node *corev1.Node, networkName string) (string, error) {
93-
joinAddresses, err := util.ParseNodeGatewayRouterJoinAddrs(node, networkName)
96+
func GetDefaultUDNGWRouterIPs(node *corev1.Node, joinSubnets []string) ([]*net.IP, error) {
97+
nodeID, err := util.GetNodeID(node)
9498
if err != nil {
95-
return "", err
99+
// Don't consider this node as cluster-manager has not allocated node id yet.
100+
return nil, err
96101
}
97-
if len(joinAddresses) == 0 {
98-
return "", fmt.Errorf("missing join addresses at node %q for network %q", node.Name, networkName)
102+
var udnJoinNetv4, udnJoinNetv6 net.IP
103+
for _, subnet := range joinSubnets {
104+
ip, _, err := net.ParseCIDR(subnet)
105+
if err != nil {
106+
return nil, fmt.Errorf("failed to parse CIDR %q: %v", subnet, err)
107+
}
108+
if ip.To4() != nil {
109+
udnJoinNetv4 = ip
110+
} else {
111+
udnJoinNetv6 = ip
112+
}
113+
}
114+
res := []*net.IP{}
115+
if config.IPv4Mode {
116+
for range nodeID {
117+
udnJoinNetv4 = iputils.NextIP(udnJoinNetv4)
118+
}
119+
res = append(res, &udnJoinNetv4)
120+
}
121+
if config.IPv6Mode {
122+
for range nodeID {
123+
udnJoinNetv6 = iputils.NextIP(udnJoinNetv6)
124+
}
125+
res = append(res, &udnJoinNetv6)
99126
}
100-
return util.HWAddrToIPv6LLA(util.IPAddrToHWAddr(joinAddresses[0].IP)).String(), nil
127+
return res, nil
101128
}

0 commit comments

Comments
 (0)