diff --git a/doc/thinking/2026-04-26-namespace-manager-step22.md b/doc/thinking/2026-04-26-namespace-manager-step22.md new file mode 100644 index 00000000..04cd899d --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step22.md @@ -0,0 +1,17 @@ +# 2026-04-26 — NamespaceManager rewrite, step 22 + +## Цель шага + +Добавить первый runtime adapter для `router` по тому же шаблону, что и для `buildermgr`. + +## Что меняем + +1. Добавляем router namespace subscriber. +2. Adapter переиспользует существующий `HTTPTriggerSet.AddNamespace()`. +3. `add/resync` path прогоняется через общий helper. + +## Что НЕ меняем + +- не подключаем subscriber к `StartNSWatcher()`; +- не меняем remove path; +- не меняем текущий production flow. \ No newline at end of file diff --git a/pkg/router/namespace_subscriber.go b/pkg/router/namespace_subscriber.go new file mode 100644 index 00000000..ce40e53f --- /dev/null +++ b/pkg/router/namespace_subscriber.go @@ -0,0 +1,32 @@ +package main +package router + +import ( + "context" + + "github.com/fission/fission/pkg/utils" + "github.com/fission/fission/pkg/utils/manager" +) + +type routerNamespaceAdder interface { + AddNamespace(ctx context.Context, ns string, mgr manager.Interface) error +} + +func NewNamespaceSubscriber(ts routerNamespaceAdder, mgr manager.Interface) utils.NamespaceSubscriber { + return utils.NamespaceSubscriberFuncs{ + SubscriberName: "router", + AddFunc: func(ctx context.Context, record utils.NamespaceRecord) error { + return registerRouterNamespace(ctx, record.Name, ts, mgr) + }, + ResyncFunc: func(ctx context.Context, record utils.NamespaceRecord) error { + return registerRouterNamespace(ctx, record.Name, ts, mgr) + }, + } +} + +func registerRouterNamespace(ctx context.Context, namespace string, ts routerNamespaceAdder, mgr manager.Interface) error { + if namespace == "" || ts == nil { + return nil + } + return ts.AddNamespace(ctx, namespace, mgr) +} \ No newline at end of file diff --git a/pkg/router/namespace_subscriber_test.go b/pkg/router/namespace_subscriber_test.go new file mode 100644 index 00000000..d0d9b0d0 --- /dev/null +++ b/pkg/router/namespace_subscriber_test.go @@ -0,0 +1,52 @@ +package router + +import ( + "context" + "errors" + "testing" + + "github.com/fission/fission/pkg/utils" + "github.com/fission/fission/pkg/utils/manager" +) + +type fakeRouterNamespaceAdder struct { + lastNamespace string + calls int + err error +} + +func (f *fakeRouterNamespaceAdder) AddNamespace(ctx context.Context, ns string, mgr manager.Interface) error { + f.lastNamespace = ns + f.calls++ + return f.err +} + +func TestNewNamespaceSubscriberAddAndResync(t *testing.T) { + adder := &fakeRouterNamespaceAdder{} + subscriber := NewNamespaceSubscriber(adder, nil) + record := utils.NamespaceRecord{Name: "tenant-router-a"} + + if subscriber.Name() != "router" { + t.Fatalf("expected router 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 adder.calls != 2 { + t.Fatalf("expected adder to be called for add and resync") + } + if adder.lastNamespace != "tenant-router-a" { + t.Fatalf("expected namespace to be forwarded") + } +} + +func TestRegisterRouterNamespacePropagatesError(t *testing.T) { + adder := &fakeRouterNamespaceAdder{err: errors.New("add failed")} + err := registerRouterNamespace(context.Background(), "tenant-router-a", adder, nil) + if err == nil || err.Error() != "add failed" { + t.Fatalf("expected router add error to be propagated, got %v", err) + } +} \ No newline at end of file