@@ -3,9 +3,10 @@ package daemon
3
3
import (
4
4
"context"
5
5
"fmt"
6
- "strings"
7
6
7
+ k8serrors "k8s.io/apimachinery/pkg/api/errors"
8
8
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9
+ "k8s.io/apimachinery/pkg/labels"
9
10
"k8s.io/klog/v2"
10
11
11
12
kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
@@ -42,6 +43,7 @@ func (c *Controller) setExGateway() error {
42
43
return err
43
44
}
44
45
enable := node .Labels [util .ExGatewayLabel ]
46
+ externalBridge := util .ExternalBridgeName (c .config .ExternalGatewaySwitch )
45
47
if enable == "true" {
46
48
cm , err := c .config .KubeClient .CoreV1 ().ConfigMaps (c .config .ExternalGatewayConfigNS ).Get (context .Background (), util .ExternalGatewayConfig , metav1.GetOptions {})
47
49
if err != nil {
@@ -50,31 +52,84 @@ func (c *Controller) setExGateway() error {
50
52
}
51
53
// enable external-gw-config without 'external-gw-nic' configured
52
54
// 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
+ }
59
72
}
60
73
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 )
62
89
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
64
94
}
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
+ }
68
110
}
69
111
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 )
71
114
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
+ }
73
123
}
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
+ }
78
133
}
79
134
}
80
135
return nil
0 commit comments