layer1: share update removal policy
This commit is contained in:
@@ -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 по умолчанию не меняется.
|
||||||
@@ -56,7 +56,7 @@ func StartNSWatcher(
|
|||||||
oldNSObj, _ := oldObj.(*corev1.Namespace)
|
oldNSObj, _ := oldObj.(*corev1.Namespace)
|
||||||
nsObj, ok := newObj.(*corev1.Namespace)
|
nsObj, ok := newObj.(*corev1.Namespace)
|
||||||
if ok {
|
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{}) {
|
DeleteFunc: func(obj interface{}) {
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ func StartNSWatcher(
|
|||||||
oldNSObj, _ := oldObj.(*corev1.Namespace)
|
oldNSObj, _ := oldObj.(*corev1.Namespace)
|
||||||
nsObj, ok := newObj.(*corev1.Namespace)
|
nsObj, ok := newObj.(*corev1.Namespace)
|
||||||
if ok {
|
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{}) {
|
DeleteFunc: func(obj interface{}) {
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func StartNSWatcher(
|
|||||||
oldNSObj, _ := oldObj.(*corev1.Namespace)
|
oldNSObj, _ := oldObj.(*corev1.Namespace)
|
||||||
nsObj, ok := newObj.(*corev1.Namespace)
|
nsObj, ok := newObj.(*corev1.Namespace)
|
||||||
if ok {
|
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{}) {
|
DeleteFunc: func(obj interface{}) {
|
||||||
|
|||||||
@@ -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 {
|
if newNamespace == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if NamespaceBecameUnmanaged(oldNamespace, newNamespace) {
|
if NamespaceBecameUnmanaged(oldNamespace, newNamespace) {
|
||||||
HandleWatcherNamespaceRemoval(ctx, logger, component, manager, newNamespace, NamespaceRemovalStrategyTrackOnly)
|
HandleWatcherNamespaceRemoval(ctx, logger, component, manager, newNamespace, strategy)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !IsManagedNamespace(newNamespace.Labels) {
|
if !IsManagedNamespace(newNamespace.Labels) {
|
||||||
|
|||||||
@@ -352,7 +352,7 @@ func TestHandleWatcherNamespaceAddUpdateDelete(t *testing.T) {
|
|||||||
t.Fatalf("expected add handler to dispatch add")
|
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 {
|
if router.resyncCalls != 1 {
|
||||||
t.Fatalf("expected update handler to dispatch resync")
|
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) {
|
func TestNamespaceManagerDispatchAdd(t *testing.T) {
|
||||||
manager := NewNamespaceManager()
|
manager := NewNamespaceManager()
|
||||||
manager.Upsert(NamespaceEvent{Type: NamespaceEventAdd, Name: "tenant-a", Source: NamespaceSourceWatcher})
|
manager.Upsert(NamespaceEvent{Type: NamespaceEventAdd, Name: "tenant-a", Source: NamespaceSourceWatcher})
|
||||||
|
|||||||
Reference in New Issue
Block a user