@@ -61,7 +61,8 @@ func (c *Controller) enqueueUpdateVpc(oldObj, newObj any) {
61
61
oldVpc .Spec .EnableExternal != newVpc .Spec .EnableExternal ||
62
62
oldVpc .Spec .EnableBfd != newVpc .Spec .EnableBfd ||
63
63
vpcBFDPortChanged (oldVpc .Spec .BFDPort , newVpc .Spec .BFDPort ) ||
64
- oldVpc .Labels [util .VpcExternalLabel ] != newVpc .Labels [util .VpcExternalLabel ] {
64
+ oldVpc .Labels [util .VpcExternalLabel ] != newVpc .Labels [util .VpcExternalLabel ] ||
65
+ ! slices .Equal (oldVpc .Status .Subnets , newVpc .Status .Subnets ) {
65
66
// TODO:// label VpcExternalLabel replace with spec enable external
66
67
67
68
if newVpc .Annotations == nil {
@@ -268,7 +269,25 @@ func (c *Controller) handleAddOrUpdateVpc(key string) error {
268
269
return err
269
270
}
270
271
271
- if err = c .createVpcRouter (key , vpc .Spec .EnableExternal ); err != nil {
272
+ learnFromARPRequest := vpc .Spec .EnableExternal
273
+ if ! learnFromARPRequest {
274
+ for _ , subnetName := range vpc .Status .Subnets {
275
+ subnet , err := c .subnetsLister .Get (subnetName )
276
+ if err != nil {
277
+ if k8serrors .IsNotFound (err ) {
278
+ continue
279
+ }
280
+ klog .Errorf ("failed to get subnet %s for vpc %s: %v" , subnetName , key , err )
281
+ return err
282
+ }
283
+ if subnet .Spec .Vlan != "" && subnet .Spec .U2OInterconnection {
284
+ learnFromARPRequest = true
285
+ break
286
+ }
287
+ }
288
+ }
289
+
290
+ if err = c .createVpcRouter (key , learnFromARPRequest ); err != nil {
272
291
klog .Errorf ("failed to create vpc router for vpc %s: %v" , key , err )
273
292
return err
274
293
}
@@ -1231,11 +1250,12 @@ func (c *Controller) getVpcSubnets(vpc *kubeovnv1.Vpc) (subnets []string, defaul
1231
1250
defaultSubnet = vpc .Spec .DefaultSubnet
1232
1251
}
1233
1252
}
1253
+ sort .Strings (subnets )
1234
1254
return
1235
1255
}
1236
1256
1237
1257
// createVpcRouter create router to connect logical switches in vpc
1238
- func (c * Controller ) createVpcRouter (lr string , enableExternal bool ) error {
1258
+ func (c * Controller ) createVpcRouter (lr string , learnFromARPRequest bool ) error {
1239
1259
if err := c .OVNNbClient .CreateLogicalRouter (lr ); err != nil {
1240
1260
klog .Errorf ("create logical router %s failed: %v" , lr , err )
1241
1261
return err
@@ -1251,7 +1271,7 @@ func (c *Controller) createVpcRouter(lr string, enableExternal bool) error {
1251
1271
"mac_binding_age_threshold" : "300" ,
1252
1272
"dynamic_neigh_routers" : "true" ,
1253
1273
}
1254
- if ! enableExternal {
1274
+ if ! learnFromARPRequest {
1255
1275
lrOptions ["always_learn_from_arp_request" ] = "false"
1256
1276
}
1257
1277
if ! maps .Equal (vpcRouter .Options , lrOptions ) {
0 commit comments