Skip to content

Commit 96db6fd

Browse files
pperiyasamyjcaamano
authored andcommitted
Use Handler FilterFunc to filter out np peer namespace
This commits exports FilterFunc from handler and uses it while reconciling network policy for UDN peer namespaces. Signed-off-by: Periyasamy Palanisamy <[email protected]>
1 parent 2d2e445 commit 96db6fd

File tree

2 files changed

+38
-43
lines changed

2 files changed

+38
-43
lines changed

go-controller/pkg/factory/handler.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ func (h *Handler) OnDelete(obj interface{}) {
7676
}
7777
}
7878

79+
func (h *Handler) FilterFunc(obj interface{}) bool {
80+
return h.base.FilterFunc(obj)
81+
}
82+
7983
func (h *Handler) kill() bool {
8084
return atomic.CompareAndSwapUint32(&h.tombstone, handlerAlive, handlerDead)
8185
}

go-controller/pkg/ovn/base_network_controller_policy.go

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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

198195
func 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.
15051501
func (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

Comments
 (0)