@@ -61,7 +61,8 @@ func (c *Controller) enqueueUpdateVpc(oldObj, newObj any) {
6161 oldVpc .Spec .EnableExternal != newVpc .Spec .EnableExternal ||
6262 oldVpc .Spec .EnableBfd != newVpc .Spec .EnableBfd ||
6363 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 ) {
6566 // TODO:// label VpcExternalLabel replace with spec enable external
6667
6768 if newVpc .Annotations == nil {
@@ -268,7 +269,25 @@ func (c *Controller) handleAddOrUpdateVpc(key string) error {
268269 return err
269270 }
270271
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 {
272291 klog .Errorf ("failed to create vpc router for vpc %s: %v" , key , err )
273292 return err
274293 }
@@ -1231,11 +1250,12 @@ func (c *Controller) getVpcSubnets(vpc *kubeovnv1.Vpc) (subnets []string, defaul
12311250 defaultSubnet = vpc .Spec .DefaultSubnet
12321251 }
12331252 }
1253+ sort .Strings (subnets )
12341254 return
12351255}
12361256
12371257// 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 {
12391259 if err := c .OVNNbClient .CreateLogicalRouter (lr ); err != nil {
12401260 klog .Errorf ("create logical router %s failed: %v" , lr , err )
12411261 return err
@@ -1251,7 +1271,7 @@ func (c *Controller) createVpcRouter(lr string, enableExternal bool) error {
12511271 "mac_binding_age_threshold" : "300" ,
12521272 "dynamic_neigh_routers" : "true" ,
12531273 }
1254- if ! enableExternal {
1274+ if ! learnFromARPRequest {
12551275 lrOptions ["always_learn_from_arp_request" ] = "false"
12561276 }
12571277 if ! maps .Equal (vpcRouter .Options , lrOptions ) {
0 commit comments