|
8 | 8 |
|
9 | 9 | "github.com/containernetworking/cni/pkg/types" |
10 | 10 |
|
| 11 | + "k8s.io/apimachinery/pkg/util/sets" |
11 | 12 | "k8s.io/apimachinery/pkg/util/wait" |
12 | 13 | clientset "k8s.io/client-go/kubernetes" |
13 | 14 | "k8s.io/client-go/tools/record" |
@@ -139,8 +140,12 @@ func (cm *ControllerManager) GetDefaultNetworkController() networkmanager.Reconc |
139 | 140 |
|
140 | 141 | func (cm *ControllerManager) CleanupStaleNetworks(validNetworks ...util.NetInfo) error { |
141 | 142 | existingNetworksMap := map[string]string{} |
| 143 | + validNetworksSubnets := sets.New[string]() |
142 | 144 | for _, network := range validNetworks { |
143 | 145 | existingNetworksMap[network.GetNetworkName()] = network.TopologyType() |
| 146 | + for _, subnet := range network.Subnets() { |
| 147 | + validNetworksSubnets.Insert(subnet.CIDR.String()) |
| 148 | + } |
144 | 149 | } |
145 | 150 |
|
146 | 151 | // Get all the existing secondary networks and its logical entities |
@@ -188,6 +193,29 @@ func (cm *ControllerManager) CleanupStaleNetworks(validNetworks ...util.NetInfo) |
188 | 193 | klog.Errorf("Failed to delete stale OVN logical entities for network %s: %v", netName, err) |
189 | 194 | } |
190 | 195 | } |
| 196 | + |
| 197 | + if util.IsRouteAdvertisementsEnabled() { |
| 198 | + // Remove stale subnets from the advertised networks address set used for isolation |
| 199 | + // NOTE: network reconciliation will take care of removing the subnets for existing networks that are no longer |
| 200 | + // advertised. |
| 201 | + addressSetFactory := addressset.NewOvnAddressSetFactory(cm.nbClient, config.IPv4Mode, config.IPv6Mode) |
| 202 | + advertisedSubnets, err := addressSetFactory.GetAddressSet(ovn.GetAdvertisedNetworkSubnetsAddressSetDBIDs()) |
| 203 | + if err != nil { |
| 204 | + return fmt.Errorf("failed to get advertised subnets addresset %s: %w", ovn.GetAdvertisedNetworkSubnetsAddressSetDBIDs(), err) |
| 205 | + } |
| 206 | + v4AdvertisedSubnets, v6AdvertisedSubnets := advertisedSubnets.GetAddresses() |
| 207 | + var invalidSubnets []string |
| 208 | + for _, subnet := range append(v4AdvertisedSubnets, v6AdvertisedSubnets...) { |
| 209 | + if !validNetworksSubnets.Has(subnet) { |
| 210 | + klog.Infof("Cleanup stale advertised subnet: %q", subnet) |
| 211 | + invalidSubnets = append(invalidSubnets, subnet) |
| 212 | + } |
| 213 | + } |
| 214 | + |
| 215 | + if err := advertisedSubnets.DeleteAddresses(invalidSubnets); err != nil { |
| 216 | + klog.Errorf("Failed to delete stale advertised subnets: %v", invalidSubnets) |
| 217 | + } |
| 218 | + } |
191 | 219 | return nil |
192 | 220 | } |
193 | 221 |
|
@@ -451,6 +479,11 @@ func (cm *ControllerManager) Start(ctx context.Context) error { |
451 | 479 | return fmt.Errorf("failed to init default network controller: %v", err) |
452 | 480 | } |
453 | 481 |
|
| 482 | + if util.IsRouteAdvertisementsEnabled() { |
| 483 | + if err := cm.configureAdvertisedNetworkIsolation(); err != nil { |
| 484 | + return fmt.Errorf("failed to initialize advertised network isolation: %w", err) |
| 485 | + } |
| 486 | + } |
454 | 487 | if cm.networkManager != nil { |
455 | 488 | if err = cm.networkManager.Start(); err != nil { |
456 | 489 | return fmt.Errorf("failed to start NAD Controller :%v", err) |
@@ -495,3 +528,9 @@ func (cm *ControllerManager) Stop() { |
495 | 528 | func (cm *ControllerManager) Reconcile(_ string, _, _ util.NetInfo) error { |
496 | 529 | return nil |
497 | 530 | } |
| 531 | + |
| 532 | +func (cm *ControllerManager) configureAdvertisedNetworkIsolation() error { |
| 533 | + addressSetFactory := addressset.NewOvnAddressSetFactory(cm.nbClient, config.IPv4Mode, config.IPv6Mode) |
| 534 | + _, err := addressSetFactory.EnsureAddressSet(ovn.GetAdvertisedNetworkSubnetsAddressSetDBIDs()) |
| 535 | + return err |
| 536 | +} |
0 commit comments