@@ -71,21 +71,12 @@ func configureEmptyMirror(portName string, mtu int) error {
71
71
return configureMirrorLink (portName , mtu )
72
72
}
73
73
74
- func updateOvnMapping (name , key , value string ) error {
75
- output , err := ovs .Exec (ovs .IfExists , "get" , "open" , "." , "external-ids:" + name )
76
- if err != nil {
77
- return fmt .Errorf ("failed to get %s, %v: %q" , name , err , output )
74
+ func decodeOvnMappings (s string ) map [string ]string {
75
+ if len (s ) == 0 {
76
+ return map [string ]string {}
78
77
}
79
78
80
- if len (output ) == 0 {
81
- s := fmt .Sprintf ("external-ids:%s=%s:%s" , name , key , value )
82
- if output , err = ovs .Exec ("set" , "open" , "." , s ); err != nil {
83
- return fmt .Errorf ("failed to set %s, %v: %q" , name , err , output )
84
- }
85
- return nil
86
- }
87
-
88
- fields := strings .Split (output , "," )
79
+ fields := strings .Split (s , "," )
89
80
mappings := make (map [string ]string , len (fields )+ 1 )
90
81
for _ , f := range fields {
91
82
idx := strings .IndexRune (f , ':' )
@@ -95,17 +86,37 @@ func updateOvnMapping(name, key, value string) error {
95
86
}
96
87
mappings [f [:idx ]] = f [idx + 1 :]
97
88
}
98
- mappings [key ] = value
89
+ return mappings
90
+ }
91
+
92
+ func encodeOvnMappings (mappings map [string ]string ) string {
93
+ if len (mappings ) == 0 {
94
+ return ""
95
+ }
99
96
100
- fields = make ([]string , 0 , len (mappings ))
97
+ fields : = make ([]string , 0 , len (mappings ))
101
98
for k , v := range mappings {
102
- fields = append (fields , fmt .Sprintf ("%s:%s " , k , v ))
99
+ fields = append (fields , fmt .Sprintf ("%s:%v " , k , v ))
103
100
}
101
+ return strings .Join (fields , "," )
102
+ }
104
103
105
- if len (fields ) == 0 {
104
+ func getOvnMappings (name string ) (map [string ]string , error ) {
105
+ output , err := ovs .Exec (ovs .IfExists , "get" , "open" , "." , "external-ids:" + name )
106
+ if err != nil {
107
+ return nil , fmt .Errorf ("failed to get %s, %v: %q" , name , err , output )
108
+ }
109
+
110
+ return decodeOvnMappings (output ), nil
111
+ }
112
+
113
+ func setOvnMappings (name string , mappings map [string ]string ) error {
114
+ var err error
115
+ var output string
116
+ if s := encodeOvnMappings (mappings ); len (s ) == 0 {
106
117
output , err = ovs .Exec (ovs .IfExists , "remove" , "open" , "." , "external-ids" , name )
107
118
} else {
108
- output , err = ovs .Exec ("set" , "open" , "." , fmt .Sprintf ("external-ids:%s=%s" , name , strings . Join ( fields , "," ) ))
119
+ output , err = ovs .Exec ("set" , "open" , "." , fmt .Sprintf ("external-ids:%s=%s" , name , s ))
109
120
}
110
121
if err != nil {
111
122
return fmt .Errorf ("failed to set %s, %v: %q" , name , err , output )
@@ -114,6 +125,42 @@ func updateOvnMapping(name, key, value string) error {
114
125
return nil
115
126
}
116
127
128
+ func addOvnMapping (name , key , value string , overwrite bool ) error {
129
+ mappings , err := getOvnMappings (name )
130
+ if err != nil {
131
+ return err
132
+ }
133
+
134
+ if mappings [key ] == value || (mappings [key ] != "" && ! overwrite ) {
135
+ return nil
136
+ }
137
+
138
+ mappings [key ] = value
139
+ if err = setOvnMappings (name , mappings ); err != nil {
140
+ return err
141
+ }
142
+
143
+ return nil
144
+ }
145
+
146
+ func removeOvnMapping (name , key string ) error {
147
+ mappings , err := getOvnMappings (name )
148
+ if err != nil {
149
+ return err
150
+ }
151
+
152
+ length := len (mappings )
153
+ delete (mappings , key )
154
+ if len (mappings ) == length {
155
+ return nil
156
+ }
157
+ if err = setOvnMappings (name , mappings ); err != nil {
158
+ return err
159
+ }
160
+
161
+ return nil
162
+ }
163
+
117
164
func configExternalBridge (provider , bridge , nic string , exchangeLinkName , macLearningFallback bool ) error {
118
165
brExists , err := ovs .BridgeExists (bridge )
119
166
if err != nil {
@@ -152,7 +199,7 @@ func configExternalBridge(provider, bridge, nic string, exchangeLinkName, macLea
152
199
}
153
200
}
154
201
155
- if err = updateOvnMapping ("ovn-bridge-mappings" , provider , bridge ); err != nil {
202
+ if err = addOvnMapping ("ovn-bridge-mappings" , provider , bridge , true ); err != nil {
156
203
klog .Error (err )
157
204
return err
158
205
}
@@ -161,23 +208,9 @@ func configExternalBridge(provider, bridge, nic string, exchangeLinkName, macLea
161
208
}
162
209
163
210
func initProviderChassisMac (provider string ) error {
164
- output , err := ovs .Exec (ovs .IfExists , "get" , "open" , "." , "external-ids:ovn-chassis-mac-mappings" )
165
- if err != nil {
166
- return fmt .Errorf ("failed to get ovn-bridge-mappings, %v" , err )
167
- }
168
-
169
- for _ , macMap := range strings .Split (output , "," ) {
170
- if len (macMap ) == len (provider )+ 18 && strings .Contains (output , provider ) {
171
- return nil
172
- }
173
- }
174
-
175
- macMappings := fmt .Sprintf ("%s:%s" , provider , util .GenerateMac ())
176
- if output != "" {
177
- macMappings = fmt .Sprintf ("%s,%s" , output , macMappings )
178
- }
179
- if output , err = ovs .Exec ("set" , "open" , "." , "external-ids:ovn-chassis-mac-mappings=" + macMappings ); err != nil {
180
- return fmt .Errorf ("failed to set ovn-chassis-mac-mappings, %v: %q" , err , output )
211
+ if err := addOvnMapping ("ovn-chassis-mac-mappings" , provider , util .GenerateMac (), false ); err != nil {
212
+ klog .Error (err )
213
+ return err
181
214
}
182
215
return nil
183
216
}
0 commit comments