Skip to content

Commit b2b1901

Browse files
committed
cni-server: fix ovn mappings for vpc nat gateway (#3075)
1 parent da86070 commit b2b1901

File tree

2 files changed

+83
-37
lines changed

2 files changed

+83
-37
lines changed

pkg/daemon/gateway_linux.go

+10-19
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,7 @@ func (c *Controller) setExGateway() error {
791791
return err
792792
}
793793
enable := node.Labels[util.ExGatewayLabel]
794-
externalBride := fmt.Sprintf("br-%s", c.config.ExternalGatewaySwitch)
794+
externalBridge := util.ExternalBridgeName(c.config.ExternalGatewaySwitch)
795795
if enable == "true" {
796796
cm, err := c.config.KubeClient.CoreV1().ConfigMaps(c.config.ExternalGatewayConfigNS).Get(context.Background(), util.ExternalGatewayConfig, metav1.GetOptions{})
797797
if err != nil {
@@ -804,38 +804,29 @@ func (c *Controller) setExGateway() error {
804804
if !exist || len(linkName) == 0 {
805805
return nil
806806
}
807-
link, err := netlink.LinkByName(cm.Data["external-gw-nic"])
807+
link, err := netlink.LinkByName(linkName)
808808
if err != nil {
809-
klog.Errorf("failed to get nic %s, %v", cm.Data["external-gw-nic"], err)
809+
klog.Errorf("failed to get nic %s, %v", linkName, err)
810810
return err
811811
}
812812
if err := netlink.LinkSetUp(link); err != nil {
813-
klog.Errorf("failed to set gateway nic %s up, %v", cm.Data["external-gw-nic"], err)
813+
klog.Errorf("failed to set gateway nic %s up, %v", linkName, err)
814814
return err
815815
}
816816
if _, err := ovs.Exec(
817-
ovs.MayExist, "add-br", externalBride, "--",
818-
ovs.MayExist, "add-port", externalBride, cm.Data["external-gw-nic"],
817+
ovs.MayExist, "add-br", externalBridge, "--",
818+
ovs.MayExist, "add-port", externalBridge, cm.Data["external-gw-nic"],
819819
); err != nil {
820820
return fmt.Errorf("failed to enable external gateway, %v", err)
821821
}
822822

823-
output, err := ovs.Exec(ovs.IfExists, "get", "open", ".", "external-ids:ovn-bridge-mappings")
824-
if err != nil {
825-
return fmt.Errorf("failed to get external-ids, %v", err)
826-
}
827-
bridgeMappings := fmt.Sprintf("external:%s", externalBride)
828-
if output != "" && !util.IsStringIn(bridgeMappings, strings.Split(output, ",")) {
829-
bridgeMappings = fmt.Sprintf("%s,%s", output, bridgeMappings)
830-
}
831-
832-
output, err = ovs.Exec("set", "open", ".", fmt.Sprintf("external-ids:ovn-bridge-mappings=%s", bridgeMappings))
833-
if err != nil {
834-
return fmt.Errorf("failed to set bridge-mappings, %v: %q", err, output)
823+
if err = addOvnMapping("ovn-bridge-mappings", c.config.ExternalGatewaySwitch, externalBridge, true); err != nil {
824+
klog.Error(err)
825+
return err
835826
}
836827
} else {
837828
if _, err := ovs.Exec(
838-
ovs.IfExists, "del-br", externalBride); err != nil {
829+
ovs.IfExists, "del-br", externalBridge); err != nil {
839830
return fmt.Errorf("failed to disable external gateway, %v", err)
840831
}
841832
}

pkg/daemon/gateway_windows.go

+73-18
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ package daemon
33
import (
44
"context"
55
"fmt"
6-
"strings"
76

7+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
88
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/apimachinery/pkg/labels"
910
"k8s.io/klog/v2"
1011

1112
kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
@@ -42,6 +43,7 @@ func (c *Controller) setExGateway() error {
4243
return err
4344
}
4445
enable := node.Labels[util.ExGatewayLabel]
46+
externalBridge := util.ExternalBridgeName(c.config.ExternalGatewaySwitch)
4547
if enable == "true" {
4648
cm, err := c.config.KubeClient.CoreV1().ConfigMaps(c.config.ExternalGatewayConfigNS).Get(context.Background(), util.ExternalGatewayConfig, metav1.GetOptions{})
4749
if err != nil {
@@ -50,31 +52,84 @@ func (c *Controller) setExGateway() error {
5052
}
5153
// enable external-gw-config without 'external-gw-nic' configured
5254
// to reuse existing physical network from arg 'external-gateway-net'
53-
// TODO
54-
if _, err := ovs.Exec(
55-
ovs.MayExist, "add-br", "br-external", "--",
56-
ovs.MayExist, "add-port", "br-external", cm.Data["external-gw-nic"],
57-
); err != nil {
58-
return fmt.Errorf("failed to enable external gateway, %v", err)
55+
linkName, exist := cm.Data["external-gw-nic"]
56+
if !exist || len(linkName) == 0 {
57+
return nil
58+
}
59+
externalBrReady := false
60+
// if external nic already attached into another bridge
61+
if existBr, err := ovs.Exec("port-to-br", linkName); err == nil {
62+
if existBr == externalBridge {
63+
externalBrReady = true
64+
} else {
65+
klog.Infof("external bridge should change from %s to %s, delete external bridge %s", existBr, externalBridge, existBr)
66+
if _, err := ovs.Exec(ovs.IfExists, "del-br", existBr); err != nil {
67+
err = fmt.Errorf("failed to del external br %s, %v", existBr, err)
68+
klog.Error(err)
69+
return err
70+
}
71+
}
5972
}
6073

61-
output, err := ovs.Exec(ovs.IfExists, "get", "open", ".", "external-ids:ovn-bridge-mappings")
74+
if !externalBrReady {
75+
if _, err := ovs.Exec(
76+
ovs.MayExist, "add-br", externalBridge, "--",
77+
ovs.MayExist, "add-port", externalBridge, linkName,
78+
); err != nil {
79+
err = fmt.Errorf("failed to enable external gateway, %v", err)
80+
klog.Error(err)
81+
}
82+
}
83+
if err = addOvnMapping("ovn-bridge-mappings", c.config.ExternalGatewaySwitch, externalBridge, true); err != nil {
84+
klog.Error(err)
85+
return err
86+
}
87+
} else {
88+
brExists, err := ovs.BridgeExists(externalBridge)
6289
if err != nil {
63-
return fmt.Errorf("failed to get external-ids, %v", err)
90+
return fmt.Errorf("failed to check OVS bridge existence: %v", err)
91+
}
92+
if !brExists {
93+
return nil
6494
}
65-
bridgeMappings := "external:br-external"
66-
if output != "" && !util.IsStringIn(bridgeMappings, strings.Split(output, ",")) {
67-
bridgeMappings = fmt.Sprintf("%s,%s", output, bridgeMappings)
95+
96+
providerNetworks, err := c.providerNetworksLister.List(labels.Everything())
97+
if err != nil && !k8serrors.IsNotFound(err) {
98+
klog.Errorf("failed to list provider networks: %v", err)
99+
return err
100+
}
101+
102+
for _, pn := range providerNetworks {
103+
// if external nic already attached into another bridge
104+
if existBr, err := ovs.Exec("port-to-br", pn.Spec.DefaultInterface); err == nil {
105+
if existBr == externalBridge {
106+
// delete switch after related provider network not exist
107+
return nil
108+
}
109+
}
68110
}
69111

70-
output, err = ovs.Exec("set", "open", ".", fmt.Sprintf("external-ids:ovn-bridge-mappings=%s", bridgeMappings))
112+
keepExternalSubnet := false
113+
externalSubnet, err := c.subnetsLister.Get(c.config.ExternalGatewaySwitch)
71114
if err != nil {
72-
return fmt.Errorf("failed to set bridge-mappings, %v: %q", err, output)
115+
if !k8serrors.IsNotFound(err) {
116+
klog.Errorf("failed to get subnet %s, %v", c.config.ExternalGatewaySwitch, err)
117+
return err
118+
}
119+
} else {
120+
if externalSubnet.Spec.Vlan != "" {
121+
keepExternalSubnet = true
122+
}
73123
}
74-
} else {
75-
if _, err := ovs.Exec(
76-
ovs.IfExists, "del-br", "br-external"); err != nil {
77-
return fmt.Errorf("failed to disable external gateway, %v", err)
124+
125+
if !keepExternalSubnet {
126+
klog.Infof("delete external bridge %s", externalBridge)
127+
if _, err := ovs.Exec(
128+
ovs.IfExists, "del-br", externalBridge); err != nil {
129+
err = fmt.Errorf("failed to disable external gateway, %v", err)
130+
klog.Error(err)
131+
return err
132+
}
78133
}
79134
}
80135
return nil

0 commit comments

Comments
 (0)