layer1: share update removal policy

This commit is contained in:
Naeel
2026-04-26 10:49:26 +03:00
parent 0755319fac
commit c3b161da83
6 changed files with 45 additions and 6 deletions
@@ -0,0 +1,16 @@
# 2026-04-26 — NamespaceManager rewrite, step 41
## Цель шага
Довести explicit removal strategy до полного покрытия watcher lifecycle paths.
## Что меняем
1. `HandleWatcherNamespaceUpdate()` теперь тоже принимает `NamespaceRemovalStrategy`.
2. `managed -> unmanaged` path использует ту же policy, что и `DeleteFunc`.
3. Добавляем unit test на update-path с `dispatch-remove`.
## Что НЕ меняем
- текущие watcher-ы остаются на `track-only`;
- runtime cleanup policy по умолчанию не меняется.
+1 -1
View File
@@ -56,7 +56,7 @@ func StartNSWatcher(
oldNSObj, _ := oldObj.(*corev1.Namespace)
nsObj, ok := newObj.(*corev1.Namespace)
if ok {
utils.HandleWatcherNamespaceUpdate(ctx, logger, "buildermgr.NSWatcher", nsManager, oldNSObj, nsObj)
utils.HandleWatcherNamespaceUpdate(ctx, logger, "buildermgr.NSWatcher", nsManager, oldNSObj, nsObj, utils.NamespaceRemovalStrategyTrackOnly)
}
},
DeleteFunc: func(obj interface{}) {
+1 -1
View File
@@ -124,7 +124,7 @@ func StartNSWatcher(
oldNSObj, _ := oldObj.(*corev1.Namespace)
nsObj, ok := newObj.(*corev1.Namespace)
if ok {
utils.HandleWatcherNamespaceUpdate(ctx, logger, "multitenant.NSWatcher", nsManager, oldNSObj, nsObj)
utils.HandleWatcherNamespaceUpdate(ctx, logger, "multitenant.NSWatcher", nsManager, oldNSObj, nsObj, utils.NamespaceRemovalStrategyTrackOnly)
}
},
DeleteFunc: func(obj interface{}) {
+1 -1
View File
@@ -56,7 +56,7 @@ func StartNSWatcher(
oldNSObj, _ := oldObj.(*corev1.Namespace)
nsObj, ok := newObj.(*corev1.Namespace)
if ok {
utils.HandleWatcherNamespaceUpdate(ctx, logger, "router.NSWatcher", nsManager, oldNSObj, nsObj)
utils.HandleWatcherNamespaceUpdate(ctx, logger, "router.NSWatcher", nsManager, oldNSObj, nsObj, utils.NamespaceRemovalStrategyTrackOnly)
}
},
DeleteFunc: func(obj interface{}) {
+2 -2
View File
@@ -147,12 +147,12 @@ func HandleWatcherNamespaceAdd(ctx context.Context, logger *zap.Logger, componen
}
}
func HandleWatcherNamespaceUpdate(ctx context.Context, logger *zap.Logger, component string, manager NamespaceManager, oldNamespace *corev1.Namespace, newNamespace *corev1.Namespace) {
func HandleWatcherNamespaceUpdate(ctx context.Context, logger *zap.Logger, component string, manager NamespaceManager, oldNamespace *corev1.Namespace, newNamespace *corev1.Namespace, strategy NamespaceRemovalStrategy) {
if newNamespace == nil {
return
}
if NamespaceBecameUnmanaged(oldNamespace, newNamespace) {
HandleWatcherNamespaceRemoval(ctx, logger, component, manager, newNamespace, NamespaceRemovalStrategyTrackOnly)
HandleWatcherNamespaceRemoval(ctx, logger, component, manager, newNamespace, strategy)
return
}
if !IsManagedNamespace(newNamespace.Labels) {
+24 -1
View File
@@ -352,7 +352,7 @@ func TestHandleWatcherNamespaceAddUpdateDelete(t *testing.T) {
t.Fatalf("expected add handler to dispatch add")
}
HandleWatcherNamespaceUpdate(context.Background(), logger, "router.NSWatcher", manager, namespace, namespace)
HandleWatcherNamespaceUpdate(context.Background(), logger, "router.NSWatcher", manager, namespace, namespace, NamespaceRemovalStrategyTrackOnly)
if router.resyncCalls != 1 {
t.Fatalf("expected update handler to dispatch resync")
}
@@ -383,6 +383,29 @@ func TestHandleWatcherNamespaceRemovalDispatch(t *testing.T) {
}
}
func TestHandleWatcherNamespaceUpdateDispatchRemoval(t *testing.T) {
manager := NewNamespaceManager()
router := &testNamespaceSubscriber{name: "router"}
manager.Subscribe(router)
logger := zap.NewNop()
oldNamespace := &corev1.Namespace{}
oldNamespace.Name = "tenant-a"
oldNamespace.Labels = map[string]string{ManagedNamespaceLabelKey: ManagedNamespaceLabelValue}
newNamespace := &corev1.Namespace{}
newNamespace.Name = "tenant-a"
newNamespace.Labels = map[string]string{}
manager.Upsert(NamespaceEvent{Type: NamespaceEventAdd, Name: "tenant-a", Source: NamespaceSourceWatcher})
HandleWatcherNamespaceUpdate(context.Background(), logger, "router.NSWatcher", manager, oldNamespace, newNamespace, NamespaceRemovalStrategyDispatchRemove)
record, ok := manager.Get("tenant-a")
if !ok || record.Phase != NamespacePhaseRemoved {
t.Fatalf("expected dispatch removal on managed->unmanaged transition")
}
if router.removeCalls != 1 {
t.Fatalf("expected remove subscriber to be called once on label drop")
}
}
func TestNamespaceManagerDispatchAdd(t *testing.T) {
manager := NewNamespaceManager()
manager.Upsert(NamespaceEvent{Type: NamespaceEventAdd, Name: "tenant-a", Source: NamespaceSourceWatcher})