diff --git a/doc/thinking/2026-04-26-namespace-manager-step25.md b/doc/thinking/2026-04-26-namespace-manager-step25.md new file mode 100644 index 00000000..671b76cc --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step25.md @@ -0,0 +1,17 @@ +# 2026-04-26 — NamespaceManager rewrite, step 25 + +## Цель шага + +Добавить runtime adapter для `executor/multitenant` поверх уже выделенного helper-а. + +## Что меняем + +1. Добавляем executor namespace subscriber. +2. `add/resync` path переиспользует `registerNamespace()`. +3. Добавляем unit test на вызов executor type-ов. + +## Что НЕ меняем + +- не подключаем subscriber к watcher-у; +- не меняем remove path; +- не меняем внешний API watcher-а. \ No newline at end of file diff --git a/pkg/executor/multitenant/namespace_subscriber.go b/pkg/executor/multitenant/namespace_subscriber.go new file mode 100644 index 00000000..c4178e4e --- /dev/null +++ b/pkg/executor/multitenant/namespace_subscriber.go @@ -0,0 +1,32 @@ +package multitenant + +import ( + "context" + + "go.uber.org/zap" + "k8s.io/client-go/kubernetes" + + fv1 "github.com/fission/fission/pkg/apis/core/v1" + "github.com/fission/fission/pkg/executor/executortype" + "github.com/fission/fission/pkg/utils" + "github.com/fission/fission/pkg/utils/manager" +) + +func NewNamespaceSubscriber( + logger *zap.Logger, + kubernetesClient kubernetes.Interface, + executorTypes map[fv1.ExecutorType]executortype.ExecutorType, + mgr manager.Interface, +) utils.NamespaceSubscriber { + return utils.NamespaceSubscriberFuncs{ + SubscriberName: "executor", + AddFunc: func(ctx context.Context, record utils.NamespaceRecord) error { + registerNamespace(ctx, logger, kubernetesClient, record.Name, executorTypes, mgr) + return nil + }, + ResyncFunc: func(ctx context.Context, record utils.NamespaceRecord) error { + registerNamespace(ctx, logger, kubernetesClient, record.Name, executorTypes, mgr) + return nil + }, + } +} \ No newline at end of file diff --git a/pkg/executor/multitenant/namespace_subscriber_test.go b/pkg/executor/multitenant/namespace_subscriber_test.go new file mode 100644 index 00000000..abecb9a0 --- /dev/null +++ b/pkg/executor/multitenant/namespace_subscriber_test.go @@ -0,0 +1,37 @@ +package multitenant + +import ( + "context" + "testing" + + "go.uber.org/zap" + k8sfake "k8s.io/client-go/kubernetes/fake" + + fv1 "github.com/fission/fission/pkg/apis/core/v1" + "github.com/fission/fission/pkg/executor/executortype" + "github.com/fission/fission/pkg/utils" +) + +func TestNewNamespaceSubscriberAddAndResync(t *testing.T) { + poolmgr := &fakeExecutorType{} + subscriber := NewNamespaceSubscriber(zap.NewNop(), k8sfake.NewSimpleClientset(), map[fv1.ExecutorType]executortype.ExecutorType{ + fv1.ExecutorTypePoolmgr: poolmgr, + }, nil) + record := utils.NamespaceRecord{Name: "tenant-executor-b"} + + if subscriber.Name() != "executor" { + t.Fatalf("expected executor 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 poolmgr.addCalls != 2 { + t.Fatalf("expected executor type to receive add and resync calls") + } + if poolmgr.lastNamespace != "tenant-executor-b" { + t.Fatalf("expected namespace to be forwarded to executor type") + } +} \ No newline at end of file