@@ -10,6 +10,7 @@ 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"
1314 "k8s.io/apimachinery/pkg/util/sets"
1415 "k8s.io/klog/v2"
1516 utilnet "k8s.io/utils/net"
@@ -23,6 +24,7 @@ import (
2324 libovsdbutil "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/libovsdb/util"
2425 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/metrics"
2526 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/nbdb"
27+ "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/retry"
2628 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/types"
2729 "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util"
2830 utilerrors "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/util/errors"
@@ -162,6 +164,8 @@ type networkPolicy struct {
162164 localPodHandler * factory.Handler
163165 // peer namespace handlers
164166 nsHandlerList []* factory.Handler
167+ // peer namespace reconcilers
168+ reconcilePeerNamespaces []* reconcilePeerNamespaces
165169 // peerAddressSets stores PodSelectorAddressSet keys for peers that this network policy was successfully added to.
166170 // Required for cleanup.
167171 peerAddressSets []string
@@ -186,17 +190,23 @@ type networkPolicy struct {
186190 cancelableContext * util.CancelableContext
187191}
188192
193+ type reconcilePeerNamespaces struct {
194+ retryNamespaces * retry.RetryFramework
195+ namespaceSelector * metav1.LabelSelector
196+ }
197+
189198func NewNetworkPolicy (policy * knet.NetworkPolicy ) * networkPolicy {
190199 policyTypeIngress , policyTypeEgress := getPolicyType (policy )
191200 np := & networkPolicy {
192- name : policy .Name ,
193- namespace : policy .Namespace ,
194- ingressPolicies : make ([]* gressPolicy , 0 ),
195- egressPolicies : make ([]* gressPolicy , 0 ),
196- isIngress : policyTypeIngress ,
197- isEgress : policyTypeEgress ,
198- nsHandlerList : make ([]* factory.Handler , 0 ),
199- localPods : sync.Map {},
201+ name : policy .Name ,
202+ namespace : policy .Namespace ,
203+ ingressPolicies : make ([]* gressPolicy , 0 ),
204+ egressPolicies : make ([]* gressPolicy , 0 ),
205+ isIngress : policyTypeIngress ,
206+ isEgress : policyTypeEgress ,
207+ nsHandlerList : make ([]* factory.Handler , 0 ),
208+ reconcilePeerNamespaces : make ([]* reconcilePeerNamespaces , 0 ),
209+ localPods : sync.Map {},
200210 }
201211 return np
202212}
@@ -1490,6 +1500,63 @@ func (bnc *BaseNetworkController) peerNamespaceUpdate(np *networkPolicy, gp *gre
14901500 return err
14911501}
14921502
1503+ // requeuePeerNamespaces enqueues the namespace into network policy peer namespace
1504+ // retry framework object(s) which need to be retried immediately with add event.
1505+ func (bnc * BaseNetworkController ) requeuePeerNamespaces (namespaces []string ) error {
1506+ npKeys := bnc .networkPolicies .GetKeys ()
1507+ var errors []error
1508+ for _ , npKey := range npKeys {
1509+ err := bnc .networkPolicies .DoWithLock (npKey , func (npKey string ) error {
1510+ np , ok := bnc .networkPolicies .Load (npKey )
1511+ if ! ok {
1512+ return nil
1513+ }
1514+ np .RLock ()
1515+ defer np .RUnlock ()
1516+ var errors []error
1517+ for _ , reconcilePeerNamespace := range np .reconcilePeerNamespaces {
1518+ 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+ }
1533+ // Filter out namespace when it's labels not matching with network policy peer namespace
1534+ // selector.
1535+ if ! peerNamespaceSelector .Matches (namespaceLabels ) {
1536+ continue
1537+ }
1538+ err = reconcilePeerNamespace .retryNamespaces .AddRetryObjWithAddNoBackoff (namespace )
1539+ if err != nil {
1540+ 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 ))
1542+ continue
1543+ }
1544+ namespaceAdded = true
1545+ }
1546+ if namespaceAdded {
1547+ reconcilePeerNamespace .retryNamespaces .RequestRetryObjs ()
1548+ }
1549+ }
1550+ return utilerrors .Join (errors ... )
1551+ })
1552+ if err != nil {
1553+ errors = append (errors , fmt .Errorf ("failed to retry peer namespaces for network policy %s on network %s: %w" ,
1554+ npKey , bnc .GetNetworkName (), err ))
1555+ }
1556+ }
1557+ return utilerrors .Join (errors ... )
1558+ }
1559+
14931560// addPeerNamespaceHandler starts a watcher for PeerNamespaceSelectorType.
14941561// Sync function and Add event for every existing namespace will be executed sequentially first, and an error will be
14951562// returned if something fails.
@@ -1522,7 +1589,17 @@ func (bnc *BaseNetworkController) addPeerNamespaceHandler(
15221589 klog .Errorf ("WatchResource failed for addPeerNamespaceHandler: %v" , err )
15231590 return err
15241591 }
1525-
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
1595+ // 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+ }
15261603 np .nsHandlerList = append (np .nsHandlerList , namespaceHandler )
15271604 return nil
15281605}
@@ -1540,6 +1617,7 @@ func (bnc *BaseNetworkController) shutdownHandlers(np *networkPolicy) {
15401617 for _ , handler := range np .nsHandlerList {
15411618 bnc .watchFactory .RemoveNamespaceHandler (handler )
15421619 }
1620+ np .reconcilePeerNamespaces = make ([]* reconcilePeerNamespaces , 0 )
15431621 np .nsHandlerList = make ([]* factory.Handler , 0 )
15441622}
15451623
0 commit comments