From 5e5058ba0ed5daaabe52f67a59d1541cdeb8456b Mon Sep 17 00:00:00 2001 From: Naeel Date: Sun, 26 Apr 2026 10:03:09 +0300 Subject: [PATCH] layer1: add namespace manager bridge step 12 --- .../2026-04-26-namespace-manager-step12.md | 17 +++++++++++++++ pkg/utils/namespace_manager.go | 9 ++++++++ pkg/utils/namespace_manager_test.go | 21 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 doc/thinking/2026-04-26-namespace-manager-step12.md diff --git a/doc/thinking/2026-04-26-namespace-manager-step12.md b/doc/thinking/2026-04-26-namespace-manager-step12.md new file mode 100644 index 00000000..068cd053 --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step12.md @@ -0,0 +1,17 @@ +# 2026-04-26 — NamespaceManager rewrite, step 12 + +## Цель шага + +Добавить bridge helper между legacy `NamespaceResolver` и новым `NamespaceManager`. + +## Что меняем + +1. Добавляем helper `NewBootstrappedNamespaceManager()`. +2. Helper берёт snapshot из resolver и bootstraps manager. +3. Добавляем unit test на bootstrap from resolver. + +## Что НЕ меняем + +- не подключаем helper к production startup path; +- не меняем watcher-ы; +- не меняем runtime components. \ No newline at end of file diff --git a/pkg/utils/namespace_manager.go b/pkg/utils/namespace_manager.go index a024cd4f..e631e7c5 100644 --- a/pkg/utils/namespace_manager.go +++ b/pkg/utils/namespace_manager.go @@ -35,6 +35,15 @@ func NewNamespaceManager() NamespaceManager { } } +func NewBootstrappedNamespaceManager(resolver *NamespaceResolver, source NamespaceSource, observedAt time.Time) NamespaceManager { + manager := NewNamespaceManager() + if resolver == nil { + return manager + } + manager.Bootstrap(resolver.Snapshot(), source, observedAt) + return manager +} + func (m *inMemoryNamespaceManager) Subscribe(subscriber NamespaceSubscriber) { m.mu.Lock() defer m.mu.Unlock() diff --git a/pkg/utils/namespace_manager_test.go b/pkg/utils/namespace_manager_test.go index 1efa2191..d27d983d 100644 --- a/pkg/utils/namespace_manager_test.go +++ b/pkg/utils/namespace_manager_test.go @@ -157,4 +157,25 @@ func TestNamespaceManagerBootstrap(t *testing.T) { if record.Source != NamespaceSourceBackfill { t.Fatalf("expected bootstrap source backfill, got %s", record.Source) } +} + +func TestNewBootstrappedNamespaceManager(t *testing.T) { + resolver := &NamespaceResolver{ + FissionResourceNS: map[string]string{ + "tenant-b": "tenant-b", + "tenant-a": "tenant-a", + }, + } + + manager := NewBootstrappedNamespaceManager(resolver, NamespaceSourceEnv, time.Now().UTC()) + if !reflect.DeepEqual([]string{"tenant-a", "tenant-b"}, manager.Snapshot()) { + t.Fatalf("expected bootstrapped manager snapshot from resolver") + } + record, ok := manager.Get("tenant-a") + if !ok { + t.Fatalf("expected tenant-a in bootstrapped manager") + } + if record.Source != NamespaceSourceEnv { + t.Fatalf("expected env source, got %s", record.Source) + } } \ No newline at end of file