@@ -17,6 +17,7 @@ import (
1717
1818type namespace struct {
1919 name string
20+ labelsMap map [string ]string
2021 setMap map [string ]string
2122 podMap map [types.UID ]* corev1.Pod
2223 rawNpMap map [string ]* networkingv1.NetworkPolicy
@@ -29,6 +30,7 @@ type namespace struct {
2930func newNs (name string ) (* namespace , error ) {
3031 ns := & namespace {
3132 name : name ,
33+ labelsMap : make (map [string ]string ),
3234 setMap : make (map [string ]string ),
3335 podMap : make (map [types.UID ]* corev1.Pod ),
3436 rawNpMap : make (map [string ]* networkingv1.NetworkPolicy ),
@@ -138,6 +140,9 @@ func (npMgr *NetworkPolicyManager) AddNamespace(nsObj *corev1.Namespace) error {
138140 if err != nil {
139141 log .Errorf ("Error: failed to create namespace %s" , nsName )
140142 }
143+
144+ // Append all labels to the cache NS obj
145+ ns .labelsMap = util .AppendMap (ns .labelsMap , nsLabel )
141146 npMgr .nsMap [nsName ] = ns
142147
143148 return nil
@@ -157,16 +162,84 @@ func (npMgr *NetworkPolicyManager) UpdateNamespace(oldNsObj *corev1.Namespace, n
157162 oldNsNs , oldNsLabel , newNsNs , newNsLabel ,
158163 )
159164
160- if err = npMgr .DeleteNamespace (oldNsObj ); err != nil {
161- return err
165+ if oldNsNs != newNsNs {
166+ if err = npMgr .DeleteNamespace (oldNsObj ); err != nil {
167+ return err
168+ }
169+
170+ if newNsObj .ObjectMeta .DeletionTimestamp == nil && newNsObj .ObjectMeta .DeletionGracePeriodSeconds == nil {
171+ if err = npMgr .AddNamespace (newNsObj ); err != nil {
172+ return err
173+ }
174+ }
175+
176+ return nil
177+ }
178+
179+ // If orignal AddNamespace failed for some reason, then NS will not be found
180+ // in nsMap, resulting in retry of ADD.
181+ curNsObj , exists := npMgr .nsMap [newNsNs ]
182+ if ! exists {
183+ if newNsObj .ObjectMeta .DeletionTimestamp == nil && newNsObj .ObjectMeta .DeletionGracePeriodSeconds == nil {
184+ if err = npMgr .AddNamespace (newNsObj ); err != nil {
185+ return err
186+ }
187+ }
188+
189+ return nil
190+ }
191+
192+ //if no change in labels then return
193+ if reflect .DeepEqual (curNsObj .labelsMap , newNsLabel ) {
194+ log .Logf (
195+ "NAMESPACE UPDATING:\n nothing to delete or add. old namespace: [%s/%v]\n cache namespace: [%s/%v] new namespace: [%s/%v]" ,
196+ oldNsNs , oldNsLabel , curNsObj .name , curNsObj .labelsMap , newNsNs , newNsLabel ,
197+ )
198+ return nil
199+ }
200+
201+ //If the Namespace is not deleted, delete removed labels and create new labels
202+ toAddNsLabels , toDeleteNsLabels := util .CompareMapDiff (curNsObj .labelsMap , newNsLabel )
203+
204+ // Delete the namespace from its label's ipset list.
205+ ipsMgr := npMgr .nsMap [util .KubeAllNamespacesFlag ].ipsMgr
206+ for nsLabelKey , nsLabelVal := range toDeleteNsLabels {
207+ labelKey := "ns-" + nsLabelKey
208+ log .Logf ("Deleting namespace %s from ipset list %s" , oldNsNs , labelKey )
209+ if err = ipsMgr .DeleteFromList (labelKey , oldNsNs ); err != nil {
210+ log .Errorf ("Error: failed to delete namespace %s from ipset list %s" , oldNsNs , labelKey )
211+ return err
212+ }
213+
214+ label := "ns-" + nsLabelKey + ":" + nsLabelVal
215+ log .Logf ("Deleting namespace %s from ipset list %s" , oldNsNs , label )
216+ if err = ipsMgr .DeleteFromList (label , oldNsNs ); err != nil {
217+ log .Errorf ("Error: failed to delete namespace %s from ipset list %s" , oldNsNs , label )
218+ return err
219+ }
162220 }
163221
164- if newNsObj .ObjectMeta .DeletionTimestamp == nil && newNsObj .ObjectMeta .DeletionGracePeriodSeconds == nil {
165- if err = npMgr .AddNamespace (newNsObj ); err != nil {
222+ // Add the namespace to its label's ipset list.
223+ for nsLabelKey , nsLabelVal := range toAddNsLabels {
224+ labelKey := "ns-" + nsLabelKey
225+ log .Logf ("Adding namespace %s to ipset list %s" , oldNsNs , labelKey )
226+ if err = ipsMgr .AddToList (labelKey , oldNsNs ); err != nil {
227+ log .Errorf ("Error: failed to add namespace %s to ipset list %s" , oldNsNs , labelKey )
228+ return err
229+ }
230+
231+ label := "ns-" + nsLabelKey + ":" + nsLabelVal
232+ log .Logf ("Adding namespace %s to ipset list %s" , oldNsNs , label )
233+ if err = ipsMgr .AddToList (label , oldNsNs ); err != nil {
234+ log .Errorf ("Error: failed to add namespace %s to ipset list %s" , oldNsNs , label )
166235 return err
167236 }
168237 }
169238
239+ // Append all labels to the cache NS obj
240+ curNsObj .labelsMap = util .ClearAndAppendMap (curNsObj .labelsMap , newNsLabel )
241+ npMgr .nsMap [newNsNs ] = curNsObj
242+
170243 return nil
171244}
172245
0 commit comments