Skip to content

Commit 0213526

Browse files
committed
fix addRoutes
1 parent ee30bde commit 0213526

File tree

3 files changed

+87
-56
lines changed

3 files changed

+87
-56
lines changed

cns/middlewares/k8sSwiftV2.go

Lines changed: 1 addition & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package middlewares
33
import (
44
"context"
55
"fmt"
6-
"net"
7-
"net/netip"
86

97
"github.com/Azure/azure-container-networking/cns"
108
"github.com/Azure/azure-container-networking/cns/configuration"
@@ -252,37 +250,8 @@ func (k *K8sSWIFTv2Middleware) Type() cns.SWIFTV2Mode {
252250
return cns.K8sSWIFTV2
253251
}
254252

255-
// always pick up .1 as the default ipv4 gateway for each IP address
256-
func (k *K8sSWIFTv2Middleware) getWindowsIPv4Gateway(cidr string) (string, error) {
257-
ip, _, err := net.ParseCIDR(cidr)
258-
if err != nil {
259-
return "", errors.Wrap(err, "failed to parse cidr")
260-
}
261-
ip = ip.To4()
262-
ip[3] = 1
263-
264-
return ip.String(), nil
265-
}
266-
267-
// Linux always use fixed gateway IP for infraVNETCIDRs, podCIDRs and serviceCIDRs
268-
// Windows uses .1 as the gateway IP for each CIDR
269-
func (k *K8sSWIFTv2Middleware) addRoutes(cidrs []string, gatewayIP string) []cns.Route {
270-
routes := make([]cns.Route, len(cidrs))
271-
for i, cidr := range cidrs {
272-
if gatewayIP == "" {
273-
gatewayIP, _ = k.getWindowsIPv4Gateway(cidr)
274-
}
275-
routes[i] = cns.Route{
276-
IPAddress: cidr,
277-
GatewayIPAddress: gatewayIP,
278-
}
279-
}
280-
281-
return routes
282-
}
283-
284253
// CNS gets node, pod and service CIDRs from configuration env and parse them to get the v4 and v6 IPs
285-
func (k *K8sSWIFTv2Middleware) getCidrs() (v4IPs, v6IPs []string, err error) {
254+
func (k *K8sSWIFTv2Middleware) GetCidrs() (v4IPs, v6IPs []string, err error) {
286255
v4IPs = []string{}
287256
v6IPs = []string{}
288257

@@ -326,25 +295,3 @@ func (k *K8sSWIFTv2Middleware) getCidrs() (v4IPs, v6IPs []string, err error) {
326295

327296
return v4IPs, v6IPs, nil
328297
}
329-
330-
func (k *K8sSWIFTv2Middleware) SetInfraRoutes(podIPInfo *cns.PodIpInfo, gwv4, gwv6 string) ([]cns.Route, error) {
331-
var routes []cns.Route
332-
333-
ip, err := netip.ParseAddr(podIPInfo.PodIPConfig.IPAddress)
334-
if err != nil {
335-
return nil, errors.Wrapf(err, "failed to parse podIPConfig IP address %s", podIPInfo.PodIPConfig.IPAddress)
336-
}
337-
338-
v4IPs, v6IPs, err := k.getCidrs()
339-
if err != nil {
340-
return nil, errors.Wrap(err, "failed to get CIDRs")
341-
}
342-
343-
if ip.Is4() {
344-
routes = append(routes, k.addRoutes(v4IPs, gwv4)...)
345-
} else {
346-
routes = append(routes, k.addRoutes(v6IPs, gwv6)...)
347-
}
348-
349-
return routes, nil
350-
}

cns/middlewares/k8sSwiftV2_linux.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package middlewares
22

33
import (
44
"fmt"
5+
"net/netip"
56

67
"github.com/Azure/azure-container-networking/cns"
78
"github.com/Azure/azure-container-networking/cns/logger"
@@ -28,7 +29,7 @@ func (k *K8sSWIFTv2Middleware) setRoutes(podIPInfo *cns.PodIpInfo) error {
2829

2930
case cns.InfraNIC:
3031
// Linux uses 169.254.1.1 as the default ipv4 gateway and fe80::1234:5678:9abc as the default ipv6 gateway
31-
infraRoutes, err := k.SetInfraRoutes(podIPInfo, overlayGatewayv4, overlayGatewayV6)
32+
infraRoutes, err := k.setInfraRoutes(podIPInfo)
3233
if err != nil {
3334
return errors.Wrap(err, "failed to set routes for infraNIC interface")
3435
}
@@ -51,3 +52,36 @@ func (k *K8sSWIFTv2Middleware) assignSubnetPrefixLengthFields(_ *cns.PodIpInfo,
5152
}
5253

5354
func (k *K8sSWIFTv2Middleware) addDefaultRoute(*cns.PodIpInfo, string) {}
55+
56+
func (k *K8sSWIFTv2Middleware) addRoutes(cidrs []string, gatewayIP string) []cns.Route {
57+
routes := make([]cns.Route, len(cidrs))
58+
for i, cidr := range cidrs {
59+
routes[i] = cns.Route{
60+
IPAddress: cidr,
61+
GatewayIPAddress: gatewayIP,
62+
}
63+
}
64+
return routes
65+
}
66+
67+
func (k *K8sSWIFTv2Middleware) setInfraRoutes(podIPInfo *cns.PodIpInfo) ([]cns.Route, error) {
68+
var routes []cns.Route
69+
70+
ip, err := netip.ParseAddr(podIPInfo.PodIPConfig.IPAddress)
71+
if err != nil {
72+
return nil, errors.Wrapf(err, "failed to parse podIPConfig IP address %s", podIPInfo.PodIPConfig.IPAddress)
73+
}
74+
75+
v4IPs, v6IPs, err := k.GetCidrs()
76+
if err != nil {
77+
return nil, errors.Wrap(err, "failed to get CIDRs")
78+
}
79+
80+
if ip.Is4() {
81+
routes = append(routes, k.addRoutes(v4IPs, overlayGatewayv4)...)
82+
} else {
83+
routes = append(routes, k.addRoutes(v6IPs, overlayGatewayV6)...)
84+
}
85+
86+
return routes, nil
87+
}

cns/middlewares/k8sSwiftV2_windows.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package middlewares
22

33
import (
4+
"net"
5+
"net/netip"
6+
47
"github.com/Azure/azure-container-networking/cns"
58
"github.com/Azure/azure-container-networking/cns/middlewares/utils"
69
"github.com/Azure/azure-container-networking/crd/multitenancy/api/v1alpha1"
@@ -22,7 +25,7 @@ func (k *K8sSWIFTv2Middleware) setRoutes(podIPInfo *cns.PodIpInfo) error {
2225

2326
// set routes(pod/node/service cidrs) for infraNIC interface
2427
// Swiftv2 Windows does not support IPv6
25-
infraRoutes, err := k.SetInfraRoutes(podIPInfo, "", "")
28+
infraRoutes, err := k.setInfraRoutes(podIPInfo)
2629
if err != nil {
2730
return errors.Wrap(err, "failed to set routes for infraNIC interface")
2831
}
@@ -65,3 +68,50 @@ func (k *K8sSWIFTv2Middleware) addDefaultRoute(podIPInfo *cns.PodIpInfo, gateway
6568
}
6669
podIPInfo.Routes = append(podIPInfo.Routes, route)
6770
}
71+
72+
// always pick up .1 as the default ipv4 gateway for each IP address
73+
func (k *K8sSWIFTv2Middleware) getIPv4Gateway(cidr string) (string, error) {
74+
ip, _, err := net.ParseCIDR(cidr)
75+
if err != nil {
76+
return "", errors.Wrap(err, "failed to parse cidr")
77+
}
78+
ip = ip.To4()
79+
ip[3] = 1
80+
81+
return ip.String(), nil
82+
}
83+
84+
// Windows uses .1 as the gateway IP for each CIDR
85+
func (k *K8sSWIFTv2Middleware) addRoutes(cidrs []string) []cns.Route {
86+
routes := make([]cns.Route, len(cidrs))
87+
for i, cidr := range cidrs {
88+
gatewayIP, _ := k.getIPv4Gateway(cidr)
89+
routes[i] = cns.Route{
90+
IPAddress: cidr,
91+
GatewayIPAddress: gatewayIP,
92+
}
93+
}
94+
return routes
95+
}
96+
97+
func (k *K8sSWIFTv2Middleware) setInfraRoutes(podIPInfo *cns.PodIpInfo) ([]cns.Route, error) {
98+
var routes []cns.Route
99+
100+
ip, err := netip.ParseAddr(podIPInfo.PodIPConfig.IPAddress)
101+
if err != nil {
102+
return nil, errors.Wrapf(err, "failed to parse podIPConfig IP address %s", podIPInfo.PodIPConfig.IPAddress)
103+
}
104+
105+
v4IPs, v6IPs, err := k.GetCidrs()
106+
if err != nil {
107+
return nil, errors.Wrap(err, "failed to get CIDRs")
108+
}
109+
110+
if ip.Is4() {
111+
routes = append(routes, k.addRoutes(v4IPs)...)
112+
} else {
113+
routes = append(routes, k.addRoutes(v6IPs)...)
114+
}
115+
116+
return routes, nil
117+
}

0 commit comments

Comments
 (0)