@@ -56,7 +56,8 @@ func (c *Controller) enqueueUpdateVpc(oldObj, newObj interface{}) {
5656 ! reflect .DeepEqual (oldVpc .Spec .ExtraExternalSubnets , newVpc .Spec .ExtraExternalSubnets ) ||
5757 oldVpc .Spec .EnableExternal != newVpc .Spec .EnableExternal ||
5858 oldVpc .Spec .EnableBfd != newVpc .Spec .EnableBfd ||
59- oldVpc .Labels [util .VpcExternalLabel ] != newVpc .Labels [util .VpcExternalLabel ] {
59+ oldVpc .Labels [util .VpcExternalLabel ] != newVpc .Labels [util .VpcExternalLabel ] ||
60+ ! slices .Equal (oldVpc .Status .Subnets , newVpc .Status .Subnets ) {
6061 // TODO:// label VpcExternalLabel replace with spec enable external
6162 var (
6263 key string
@@ -279,7 +280,26 @@ func (c *Controller) handleAddOrUpdateVpc(key string) error {
279280 klog .Errorf ("failed to format vpc %s: %v" , key , err )
280281 return err
281282 }
282- if err = c .createVpcRouter (key , vpc .Spec .EnableExternal ); err != nil {
283+
284+ learnFromARPRequest := vpc .Spec .EnableExternal
285+ if ! learnFromARPRequest {
286+ for _ , subnetName := range vpc .Status .Subnets {
287+ subnet , err := c .subnetsLister .Get (subnetName )
288+ if err != nil {
289+ if k8serrors .IsNotFound (err ) {
290+ continue
291+ }
292+ klog .Errorf ("failed to get subnet %s for vpc %s: %v" , subnetName , key , err )
293+ return err
294+ }
295+ if subnet .Spec .Vlan != "" && subnet .Spec .U2OInterconnection {
296+ learnFromARPRequest = true
297+ break
298+ }
299+ }
300+ }
301+
302+ if err = c .createVpcRouter (key , learnFromARPRequest ); err != nil {
283303 klog .Errorf ("failed to create vpc router for vpc %s: %v" , key , err )
284304 return err
285305 }
@@ -1047,11 +1067,12 @@ func (c *Controller) getVpcSubnets(vpc *kubeovnv1.Vpc) (subnets []string, defaul
10471067 defaultSubnet = subnet .Name
10481068 }
10491069 }
1070+ sort .Strings (subnets )
10501071 return
10511072}
10521073
10531074// createVpcRouter create router to connect logical switches in vpc
1054- func (c * Controller ) createVpcRouter (lr string , enableExternal bool ) error {
1075+ func (c * Controller ) createVpcRouter (lr string , learnFromARPRequest bool ) error {
10551076 if err := c .OVNNbClient .CreateLogicalRouter (lr ); err != nil {
10561077 klog .Errorf ("create logical router %s failed: %v" , lr , err )
10571078 return err
@@ -1067,7 +1088,7 @@ func (c *Controller) createVpcRouter(lr string, enableExternal bool) error {
10671088 "mac_binding_age_threshold" : "300" ,
10681089 "dynamic_neigh_routers" : "true" ,
10691090 }
1070- if ! enableExternal {
1091+ if ! learnFromARPRequest {
10711092 lrOptions ["always_learn_from_arp_request" ] = "false"
10721093 }
10731094 if ! maps .Equal (vpcRouter .Options , lrOptions ) {
0 commit comments