From 0135a93a30ebfe5bc1a7db2e31bc394fd471f82d Mon Sep 17 00:00:00 2001 From: Naeel Date: Sun, 26 Apr 2026 10:34:04 +0300 Subject: [PATCH] layer1: hook router watcher to namespace manager --- .../2026-04-26-namespace-manager-step28.md | 19 +++++++++++++++++++ pkg/router/ns_watcher.go | 19 ++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 doc/thinking/2026-04-26-namespace-manager-step28.md diff --git a/doc/thinking/2026-04-26-namespace-manager-step28.md b/doc/thinking/2026-04-26-namespace-manager-step28.md new file mode 100644 index 00000000..ae936d94 --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step28.md @@ -0,0 +1,19 @@ +# 2026-04-26 — NamespaceManager rewrite, step 28 + +## Цель шага + +Сделать такой же runtime hook на `NamespaceManager` в `router` watcher. + +## Что меняем + +1. `router.StartNSWatcher()` поднимает локальный `NamespaceManager`. +2. Manager bootstrapped из текущего resolver snapshot. +3. Watcher `Add/Update` события прогоняет через: + - `Upsert()` + - `DispatchAdd()` или `DispatchResync()` +4. Подписчиком manager-а становится router subscriber adapter. + +## Что НЕ меняем + +- не добавляем remove path; +- не меняем `HTTPTriggerSet.AddNamespace()`. \ No newline at end of file diff --git a/pkg/router/ns_watcher.go b/pkg/router/ns_watcher.go index 49a28452..a8306149 100644 --- a/pkg/router/ns_watcher.go +++ b/pkg/router/ns_watcher.go @@ -30,6 +30,9 @@ func StartNSWatcher( ts *HTTPTriggerSet, mgr manager.Interface, ) { + nsManager := utils.NewBootstrappedNamespaceManager(utils.DefaultNSResolver(), utils.NamespaceSourceEnv, time.Now().UTC()) + nsManager.Subscribe(NewNamespaceSubscriber(ts, mgr)) + factory := k8sInformers.NewSharedInformerFactoryWithOptions( kubeClient, 30*time.Minute, @@ -42,13 +45,14 @@ func StartNSWatcher( _, _ = nsInformer.AddEventHandler(k8sCache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - ns := routerNSName(obj) - if ns == "" { + nsObj, ok := obj.(*corev1.Namespace) + if !ok || nsObj.Name == "" { return } - if err := registerRouterNamespace(ctx, ns, ts, mgr); err != nil { - logger.Error("router.NSWatcher: AddNamespace failed", - zap.String("namespace", ns), zap.Error(err)) + nsManager.Upsert(utils.NamespaceEventFromNamespace(utils.NamespaceEventAdd, nsObj, utils.NamespaceSourceWatcher, time.Now().UTC())) + if _, _, err := nsManager.DispatchAdd(ctx, nsObj.Name); err != nil { + logger.Error("router.NSWatcher: DispatchAdd failed", + zap.String("namespace", nsObj.Name), zap.Error(err)) } }, UpdateFunc: func(_, newObj interface{}) { @@ -56,8 +60,9 @@ func StartNSWatcher( if !ok || !utils.IsManagedNamespace(nsObj.Labels) { return } - if err := registerRouterNamespace(ctx, nsObj.Name, ts, mgr); err != nil { - logger.Error("router.NSWatcher: AddNamespace failed", + nsManager.Upsert(utils.NamespaceEventFromNamespace(utils.NamespaceEventUpdate, nsObj, utils.NamespaceSourceWatcher, time.Now().UTC())) + if _, _, err := nsManager.DispatchResync(ctx, nsObj.Name); err != nil { + logger.Error("router.NSWatcher: DispatchResync failed", zap.String("namespace", nsObj.Name), zap.Error(err)) } },