From b9236698f3aede0bee8c9971a05e172c1f094936 Mon Sep 17 00:00:00 2001 From: Naeel Date: Sun, 26 Apr 2026 11:01:05 +0300 Subject: [PATCH] layer1: run managed namespace watchers --- .../2026-04-26-namespace-manager-step49.md | 20 +++++++++++++++++++ pkg/buildermgr/ns_watcher.go | 3 +-- pkg/executor/multitenant/ns_watcher.go | 3 +-- pkg/router/ns_watcher.go | 3 +-- pkg/utils/namespace_manager.go | 6 ++++++ pkg/utils/namespace_manager_test.go | 17 ++++++++++++++++ 6 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 doc/thinking/2026-04-26-namespace-manager-step49.md diff --git a/doc/thinking/2026-04-26-namespace-manager-step49.md b/doc/thinking/2026-04-26-namespace-manager-step49.md new file mode 100644 index 00000000..0330d457 --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step49.md @@ -0,0 +1,20 @@ +# 2026-04-26 — NamespaceManager rewrite, step 49 + +## Цель шага + +Собрать `prepare + start` managed namespace watcher в один общий entrypoint. + +## Что меняем + +1. Добавляем `RunManagedNamespaceWatcher()`. +2. Helper: + - готовит manager; + - строит handlers; + - запускает managed namespace informer. +3. Три `StartNSWatcher()` переходят на новый entrypoint. +4. Добавляем минимальный unit test с fake client. + +## Что НЕ меняем + +- не меняем subscriber logic; +- не меняем selector/strategy semantics. \ No newline at end of file diff --git a/pkg/buildermgr/ns_watcher.go b/pkg/buildermgr/ns_watcher.go index 2aada7d8..4cd94108 100644 --- a/pkg/buildermgr/ns_watcher.go +++ b/pkg/buildermgr/ns_watcher.go @@ -25,9 +25,8 @@ func StartNSWatcher( pkgw *packageWatcher, mgr manager.Interface, ) { - _, handlers, err := utils.PrepareManagedNamespaceWatcher(ctx, logger, "buildermgr.NSWatcher", utils.DefaultNSResolver().Snapshot(), utils.NamespaceRemovalStrategyTrackOnly, NewNamespaceSubscriber(envw, pkgw, mgr)) + _, err := utils.RunManagedNamespaceWatcher(ctx, logger, "buildermgr.NSWatcher", kubeClient, mgr, utils.DefaultNSResolver().Snapshot(), utils.NamespaceRemovalStrategyTrackOnly, NewNamespaceSubscriber(envw, pkgw, mgr)) if err != nil { logger.Error("buildermgr.NSWatcher: BootstrapAndDispatch failed", zap.Error(err)) } - utils.StartManagedNamespaceWatcher(ctx, logger, "buildermgr.NSWatcher", kubeClient, mgr, handlers) } diff --git a/pkg/executor/multitenant/ns_watcher.go b/pkg/executor/multitenant/ns_watcher.go index a3b704b6..dd122d5c 100644 --- a/pkg/executor/multitenant/ns_watcher.go +++ b/pkg/executor/multitenant/ns_watcher.go @@ -87,11 +87,10 @@ func StartNSWatcher( executorTypes map[fv1.ExecutorType]executortype.ExecutorType, mgr manager.Interface, ) { - _, handlers, err := utils.PrepareManagedNamespaceWatcher(ctx, logger, "multitenant.NSWatcher", utils.DefaultNSResolver().Snapshot(), utils.NamespaceRemovalStrategyTrackOnly, NewNamespaceSubscriber(logger, kubernetesClient, executorTypes, mgr)) + _, err := utils.RunManagedNamespaceWatcher(ctx, logger, "multitenant.NSWatcher", kubernetesClient, mgr, utils.DefaultNSResolver().Snapshot(), utils.NamespaceRemovalStrategyTrackOnly, NewNamespaceSubscriber(logger, kubernetesClient, executorTypes, mgr)) if err != nil { logger.Error("multitenant.NSWatcher: BootstrapAndDispatch failed", zap.Error(err)) } - utils.StartManagedNamespaceWatcher(ctx, logger, "multitenant.NSWatcher", kubernetesClient, mgr, handlers) } // registerNamespace calls AddNamespace on every executor type for the given namespace. diff --git a/pkg/router/ns_watcher.go b/pkg/router/ns_watcher.go index 9a73ec0e..54c19a49 100644 --- a/pkg/router/ns_watcher.go +++ b/pkg/router/ns_watcher.go @@ -25,9 +25,8 @@ func StartNSWatcher( ts *HTTPTriggerSet, mgr manager.Interface, ) { - _, handlers, err := utils.PrepareManagedNamespaceWatcher(ctx, logger, "router.NSWatcher", utils.DefaultNSResolver().Snapshot(), utils.NamespaceRemovalStrategyTrackOnly, NewNamespaceSubscriber(ts, mgr)) + _, err := utils.RunManagedNamespaceWatcher(ctx, logger, "router.NSWatcher", kubeClient, mgr, utils.DefaultNSResolver().Snapshot(), utils.NamespaceRemovalStrategyTrackOnly, NewNamespaceSubscriber(ts, mgr)) if err != nil { logger.Error("router.NSWatcher: BootstrapAndDispatch failed", zap.Error(err)) } - utils.StartManagedNamespaceWatcher(ctx, logger, "router.NSWatcher", kubeClient, mgr, handlers) } diff --git a/pkg/utils/namespace_manager.go b/pkg/utils/namespace_manager.go index 68610e40..170a3073 100644 --- a/pkg/utils/namespace_manager.go +++ b/pkg/utils/namespace_manager.go @@ -117,6 +117,12 @@ func PrepareManagedNamespaceWatcher(ctx context.Context, logger *zap.Logger, com return manager, handlers, err } +func RunManagedNamespaceWatcher(ctx context.Context, logger *zap.Logger, component string, kubeClient kubernetes.Interface, mgr managerPkg.Interface, namespaces []string, removalStrategy NamespaceRemovalStrategy, subscriber NamespaceSubscriber) (NamespaceManager, error) { + manager, handlers, err := PrepareManagedNamespaceWatcher(ctx, logger, component, namespaces, removalStrategy, subscriber) + StartManagedNamespaceWatcher(ctx, logger, component, kubeClient, mgr, handlers) + return manager, err +} + func LogNamespaceManagerSummary(logger *zap.Logger, message string, summary NamespaceManagerSummary) { if logger == nil { return diff --git a/pkg/utils/namespace_manager_test.go b/pkg/utils/namespace_manager_test.go index f00cb9a2..c5163256 100644 --- a/pkg/utils/namespace_manager_test.go +++ b/pkg/utils/namespace_manager_test.go @@ -9,7 +9,10 @@ import ( "go.uber.org/zap" corev1 "k8s.io/api/core/v1" + k8sfake "k8s.io/client-go/kubernetes/fake" k8sCache "k8s.io/client-go/tools/cache" + + managerPkg "github.com/fission/fission/pkg/utils/manager" ) type testNamespaceSubscriber struct { @@ -458,6 +461,20 @@ func TestPrepareManagedNamespaceWatcher(t *testing.T) { } } +func TestRunManagedNamespaceWatcher(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + router := &testNamespaceSubscriber{name: "router"} + logger := zap.NewNop() + manager, err := RunManagedNamespaceWatcher(ctx, logger, "router.NSWatcher", k8sfake.NewSimpleClientset(), managerPkg.New(), []string{"tenant-a"}, NamespaceRemovalStrategyTrackOnly, router) + if err != nil { + t.Fatalf("expected managed namespace watcher run success: %v", err) + } + if !reflect.DeepEqual([]string{"tenant-a"}, manager.Snapshot()) { + t.Fatalf("expected watcher manager snapshot to contain bootstrapped namespace") + } +} + func TestNamespaceManagerSummary(t *testing.T) { manager := NewNamespaceManager() manager.Upsert(NamespaceEvent{Type: NamespaceEventAdd, Name: "tenant-a", Source: NamespaceSourceWatcher})