@@ -10,7 +10,6 @@ import (
1010 corev1 "k8s.io/api/core/v1"
1111 knet "k8s.io/api/networking/v1"
1212 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13- "k8s.io/apimachinery/pkg/labels"
1413 "k8s.io/apimachinery/pkg/util/sets"
1514 "k8s.io/klog/v2"
1615 utilnet "k8s.io/utils/net"
@@ -162,10 +161,8 @@ type networkPolicy struct {
162161
163162 // network policy owns only 1 local pod handler
164163 localPodHandler * factory.Handler
165- // peer namespace handlers
166- nsHandlerList []* factory.Handler
167164 // peer namespace reconcilers
168- reconcilePeerNamespaces []* reconcilePeerNamespaces
165+ reconcilePeerNamespaces []* peerNamespacesRetry
169166 // peerAddressSets stores PodSelectorAddressSet keys for peers that this network policy was successfully added to.
170167 // Required for cleanup.
171168 peerAddressSets []string
@@ -190,9 +187,9 @@ type networkPolicy struct {
190187 cancelableContext * util.CancelableContext
191188}
192189
193- type reconcilePeerNamespaces struct {
194- retryNamespaces * retry.RetryFramework
195- namespaceSelector * metav1. LabelSelector
190+ type peerNamespacesRetry struct {
191+ retryFramework * retry.RetryFramework
192+ handler * factory. Handler
196193}
197194
198195func NewNetworkPolicy (policy * knet.NetworkPolicy ) * networkPolicy {
@@ -204,8 +201,7 @@ func NewNetworkPolicy(policy *knet.NetworkPolicy) *networkPolicy {
204201 egressPolicies : make ([]* gressPolicy , 0 ),
205202 isIngress : policyTypeIngress ,
206203 isEgress : policyTypeEgress ,
207- nsHandlerList : make ([]* factory.Handler , 0 ),
208- reconcilePeerNamespaces : make ([]* reconcilePeerNamespaces , 0 ),
204+ reconcilePeerNamespaces : make ([]* peerNamespacesRetry , 0 ),
209205 localPods : sync.Map {},
210206 }
211207 return np
@@ -1503,8 +1499,18 @@ func (bnc *BaseNetworkController) peerNamespaceUpdate(np *networkPolicy, gp *gre
15031499// requeuePeerNamespaces enqueues the namespace into network policy peer namespace
15041500// retry framework object(s) which need to be retried immediately with add event.
15051501func (bnc * BaseNetworkController ) requeuePeerNamespaces (namespaces []string ) error {
1506- npKeys := bnc .networkPolicies .GetKeys ()
15071502 var errors []error
1503+ var peerNamespaces []* corev1.Namespace
1504+ for _ , ns := range namespaces {
1505+ namespace , err := bnc .watchFactory .GetNamespace (ns )
1506+ if err != nil {
1507+ errors = append (errors , fmt .Errorf ("failed to retrieve namespace %s for reconciling network %s: %w" ,
1508+ ns , bnc .GetNetworkName (), err ))
1509+ continue
1510+ }
1511+ peerNamespaces = append (peerNamespaces , namespace )
1512+ }
1513+ npKeys := bnc .networkPolicies .GetKeys ()
15081514 for _ , npKey := range npKeys {
15091515 err := bnc .networkPolicies .DoWithLock (npKey , func (npKey string ) error {
15101516 np , ok := bnc .networkPolicies .Load (npKey )
@@ -1516,35 +1522,22 @@ func (bnc *BaseNetworkController) requeuePeerNamespaces(namespaces []string) err
15161522 var errors []error
15171523 for _ , reconcilePeerNamespace := range np .reconcilePeerNamespaces {
15181524 namespaceAdded := false
1519- for _ , ns := range namespaces {
1520- namespace , err := bnc .watchFactory .GetNamespace (ns )
1521- if err != nil {
1522- errors = append (errors , fmt .Errorf ("failed to retrieve peer namespace %s for network policy %s on network %s: %w" ,
1523- ns , npKey , bnc .GetNetworkName (), err ))
1524- continue
1525- }
1526- namespaceLabels := labels .Set (namespace .Labels )
1527- peerNamespaceSelector , err := metav1 .LabelSelectorAsSelector (reconcilePeerNamespace .namespaceSelector )
1528- if err != nil {
1529- errors = append (errors , fmt .Errorf ("failed to parse peer namespace %s selector for network policy %s on network %s: %w" ,
1530- ns , npKey , bnc .GetNetworkName (), err ))
1531- continue
1532- }
1525+ for _ , namespace := range peerNamespaces {
15331526 // Filter out namespace when it's labels not matching with network policy peer namespace
15341527 // selector.
1535- if ! peerNamespaceSelector . Matches ( namespaceLabels ) {
1528+ if ! reconcilePeerNamespace . handler . FilterFunc ( namespace ) {
15361529 continue
15371530 }
1538- err = reconcilePeerNamespace .retryNamespaces .AddRetryObjWithAddNoBackoff (namespace )
1531+ err : = reconcilePeerNamespace .retryFramework .AddRetryObjWithAddNoBackoff (namespace )
15391532 if err != nil {
15401533 errors = append (errors , fmt .Errorf ("failed to retry peer namespace %s for network policy %s on network %s: %w" ,
1541- ns , npKey , bnc .GetNetworkName (), err ))
1534+ namespace . Name , npKey , bnc .GetNetworkName (), err ))
15421535 continue
15431536 }
15441537 namespaceAdded = true
15451538 }
15461539 if namespaceAdded {
1547- reconcilePeerNamespace .retryNamespaces .RequestRetryObjs ()
1540+ reconcilePeerNamespace .retryFramework .RequestRetryObjs ()
15481541 }
15491542 }
15501543 return utilerrors .Join (errors ... )
@@ -1589,18 +1582,17 @@ func (bnc *BaseNetworkController) addPeerNamespaceHandler(
15891582 klog .Errorf ("WatchResource failed for addPeerNamespaceHandler: %v" , err )
15901583 return err
15911584 }
1592- // Add peer namespace retry framework object into np.retryPeerNamespaces list so that
1593- // when a new peer namespace is newly created later under UDN network, it gets reconciled
1594- // and address set is created for the namespace. so we must reconcile it for network policy
1585+
1586+ // Add peer namespace retry framework object into np.reconcilePeerNamespaces so that when
1587+ // a new peer namespace is newly created later under UDN network, it gets reconciled and
1588+ // address set is created for the namespace. so we must reconcile it for network policy
15951589 // as well to update gress policy ACL with matching peer namespace address set.
1596- if util .IsNetworkSegmentationSupportEnabled () && bnc .IsPrimaryNetwork () {
1597- np .Lock ()
1598- np .reconcilePeerNamespaces = append (np .reconcilePeerNamespaces ,
1599- & reconcilePeerNamespaces {retryNamespaces : retryPeerNamespaces ,
1600- namespaceSelector : namespaceSelector })
1601- np .Unlock ()
1602- }
1603- np .nsHandlerList = append (np .nsHandlerList , namespaceHandler )
1590+ np .Lock ()
1591+ np .reconcilePeerNamespaces = append (np .reconcilePeerNamespaces ,
1592+ & peerNamespacesRetry {retryFramework : retryPeerNamespaces ,
1593+ handler : namespaceHandler })
1594+ np .Unlock ()
1595+
16041596 return nil
16051597}
16061598
@@ -1614,11 +1606,10 @@ func (bnc *BaseNetworkController) shutdownHandlers(np *networkPolicy) {
16141606 bnc .watchFactory .RemovePodHandler (np .localPodHandler )
16151607 np .localPodHandler = nil
16161608 }
1617- for _ , handler := range np .nsHandlerList {
1618- bnc .watchFactory .RemoveNamespaceHandler (handler )
1609+ for _ , retry := range np .reconcilePeerNamespaces {
1610+ bnc .watchFactory .RemoveNamespaceHandler (retry . handler )
16191611 }
1620- np .reconcilePeerNamespaces = make ([]* reconcilePeerNamespaces , 0 )
1621- np .nsHandlerList = make ([]* factory.Handler , 0 )
1612+ np .reconcilePeerNamespaces = make ([]* peerNamespacesRetry , 0 )
16221613}
16231614
16241615// The following 2 functions should return the same key for network policy based on k8s on internal networkPolicy object
0 commit comments