diff --git a/doc/thinking/2026-04-26-namespace-manager-step20.md b/doc/thinking/2026-04-26-namespace-manager-step20.md new file mode 100644 index 00000000..0d5f9ef2 --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step20.md @@ -0,0 +1,21 @@ +# 2026-04-26 — NamespaceManager rewrite, step 20 + +## Цель шага + +Сделать первый реальный runtime adapter для `NamespaceManager` в `buildermgr`. + +## Что меняем + +1. Добавляем buildermgr namespace subscriber. +2. Adapter переиспользует существующие `envWatcher.AddNamespace()` и `packageWatcher.AddNamespace()`. +3. `add/resync` path повторяет текущую логику watcher-а: + - добавить namespace в resolver; + - вызвать env watcher; + - вызвать package watcher. +4. Добавляем unit test на вызов обоих watcher-ов. + +## Что НЕ меняем + +- не подключаем subscriber к `StartNSWatcher()`; +- не меняем remove behavior; +- не ломаем текущий production flow. \ No newline at end of file diff --git a/pkg/buildermgr/namespace_subscriber.go b/pkg/buildermgr/namespace_subscriber.go new file mode 100644 index 00000000..12c0b327 --- /dev/null +++ b/pkg/buildermgr/namespace_subscriber.go @@ -0,0 +1,44 @@ +package buildermgr +package buildermgr + +import ( + "context" + + "github.com/fission/fission/pkg/utils" + "github.com/fission/fission/pkg/utils/manager" +) + +type builderEnvNamespaceAdder interface { + AddNamespace(ctx context.Context, ns string, mgr manager.Interface) +} + +type builderPkgNamespaceAdder interface { + AddNamespace(ctx context.Context, ns string, mgr manager.Interface) +} + +func NewNamespaceSubscriber(envw builderEnvNamespaceAdder, pkgw builderPkgNamespaceAdder, mgr manager.Interface) utils.NamespaceSubscriber { + return utils.NamespaceSubscriberFuncs{ + SubscriberName: "buildermgr", + AddFunc: func(ctx context.Context, record utils.NamespaceRecord) error { + registerBuilderNamespace(ctx, record.Name, envw, pkgw, mgr) + return nil + }, + ResyncFunc: func(ctx context.Context, record utils.NamespaceRecord) error { + registerBuilderNamespace(ctx, record.Name, envw, pkgw, mgr) + return nil + }, + } +} + +func registerBuilderNamespace(ctx context.Context, namespace string, envw builderEnvNamespaceAdder, pkgw builderPkgNamespaceAdder, mgr manager.Interface) { + if namespace == "" { + return + } + utils.DefaultNSResolver().AddNamespace(namespace) + if envw != nil { + envw.AddNamespace(ctx, namespace, mgr) + } + if pkgw != nil { + pkgw.AddNamespace(ctx, namespace, mgr) + } +} \ No newline at end of file diff --git a/pkg/buildermgr/namespace_subscriber_test.go b/pkg/buildermgr/namespace_subscriber_test.go new file mode 100644 index 00000000..d82c9f84 --- /dev/null +++ b/pkg/buildermgr/namespace_subscriber_test.go @@ -0,0 +1,52 @@ +package buildermgr + +import ( + "context" + "testing" + + "github.com/fission/fission/pkg/utils" + "github.com/fission/fission/pkg/utils/manager" +) + +type fakeBuilderEnvNamespaceAdder struct { + lastNamespace string + calls int +} + +func (f *fakeBuilderEnvNamespaceAdder) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) { + f.lastNamespace = ns + f.calls++ +} + +type fakeBuilderPkgNamespaceAdder struct { + lastNamespace string + calls int +} + +func (f *fakeBuilderPkgNamespaceAdder) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) { + f.lastNamespace = ns + f.calls++ +} + +func TestNewNamespaceSubscriberAddAndResync(t *testing.T) { + envw := &fakeBuilderEnvNamespaceAdder{} + pkgw := &fakeBuilderPkgNamespaceAdder{} + subscriber := NewNamespaceSubscriber(envw, pkgw, nil) + record := utils.NamespaceRecord{Name: "tenant-builder-a"} + + if subscriber.Name() != "buildermgr" { + t.Fatalf("expected buildermgr subscriber name") + } + if err := subscriber.OnNamespaceAdd(context.Background(), record); err != nil { + t.Fatalf("expected add to succeed: %v", err) + } + if err := subscriber.OnNamespaceResync(context.Background(), record); err != nil { + t.Fatalf("expected resync to succeed: %v", err) + } + if envw.calls != 2 || pkgw.calls != 2 { + t.Fatalf("expected both watchers to be called for add and resync") + } + if envw.lastNamespace != "tenant-builder-a" || pkgw.lastNamespace != "tenant-builder-a" { + t.Fatalf("expected namespace to be forwarded to both watchers") + } +} \ No newline at end of file