layer1: add managed watcher config

This commit is contained in:
Naeel
2026-04-26 11:02:09 +03:00
parent b9236698f3
commit d2ff55f9e0
7 changed files with 89 additions and 12 deletions
+11 -7
View File
@@ -110,16 +110,20 @@ func NewWatcherNamespaceManager(ctx context.Context, namespaces []string, source
return manager, err
}
func PrepareManagedNamespaceWatcher(ctx context.Context, logger *zap.Logger, component string, namespaces []string, removalStrategy NamespaceRemovalStrategy, subscriber NamespaceSubscriber) (NamespaceManager, k8sCache.ResourceEventHandlerFuncs, error) {
manager, err := NewWatcherNamespaceManager(ctx, namespaces, NamespaceSourceEnv, time.Now().UTC(), subscriber)
handlers := NewNamespaceWatcherEventHandlers(ctx, logger, component, manager, removalStrategy)
LogNamespaceManagerSummary(logger, component+": prepared namespace manager", manager.Summary())
func PrepareManagedNamespaceWatcher(ctx context.Context, logger *zap.Logger, config ManagedNamespaceWatcherConfig) (NamespaceManager, k8sCache.ResourceEventHandlerFuncs, error) {
strategy := config.RemovalStrategy
if strategy == "" {
strategy = NamespaceRemovalStrategyTrackOnly
}
manager, err := NewWatcherNamespaceManager(ctx, config.Namespaces, NamespaceSourceEnv, time.Now().UTC(), config.Subscriber)
handlers := NewNamespaceWatcherEventHandlers(ctx, logger, config.Component, manager, strategy)
LogNamespaceManagerSummary(logger, config.Component+": prepared namespace manager", manager.Summary())
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)
func RunManagedNamespaceWatcher(ctx context.Context, logger *zap.Logger, kubeClient kubernetes.Interface, mgr managerPkg.Interface, config ManagedNamespaceWatcherConfig) (NamespaceManager, error) {
manager, handlers, err := PrepareManagedNamespaceWatcher(ctx, logger, config)
StartManagedNamespaceWatcher(ctx, logger, config.Component, kubeClient, mgr, handlers)
return manager, err
}
+7
View File
@@ -81,6 +81,13 @@ type NamespaceManagerSummary struct {
Subscribers []string
}
type ManagedNamespaceWatcherConfig struct {
Component string
Namespaces []string
RemovalStrategy NamespaceRemovalStrategy
Subscriber NamespaceSubscriber
}
func NewNamespaceEvent(eventType NamespaceEventType, name string, labels map[string]string, source NamespaceSource, observedAt time.Time) NamespaceEvent {
return NamespaceEvent{
Type: eventType,
+36 -2
View File
@@ -445,7 +445,12 @@ func TestNewNamespaceWatcherEventHandlers(t *testing.T) {
func TestPrepareManagedNamespaceWatcher(t *testing.T) {
router := &testNamespaceSubscriber{name: "router"}
logger := zap.NewNop()
manager, handlers, err := PrepareManagedNamespaceWatcher(context.Background(), logger, "router.NSWatcher", []string{"tenant-a"}, NamespaceRemovalStrategyTrackOnly, router)
manager, handlers, err := PrepareManagedNamespaceWatcher(context.Background(), logger, ManagedNamespaceWatcherConfig{
Component: "router.NSWatcher",
Namespaces: []string{"tenant-a"},
RemovalStrategy: NamespaceRemovalStrategyTrackOnly,
Subscriber: router,
})
if err != nil {
t.Fatalf("expected watcher preparation success: %v", err)
}
@@ -466,7 +471,12 @@ func TestRunManagedNamespaceWatcher(t *testing.T) {
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)
manager, err := RunManagedNamespaceWatcher(ctx, logger, k8sfake.NewSimpleClientset(), managerPkg.New(), ManagedNamespaceWatcherConfig{
Component: "router.NSWatcher",
Namespaces: []string{"tenant-a"},
RemovalStrategy: NamespaceRemovalStrategyTrackOnly,
Subscriber: router,
})
if err != nil {
t.Fatalf("expected managed namespace watcher run success: %v", err)
}
@@ -475,6 +485,30 @@ func TestRunManagedNamespaceWatcher(t *testing.T) {
}
}
func TestPrepareManagedNamespaceWatcherDefaultsToTrackOnly(t *testing.T) {
router := &testNamespaceSubscriber{name: "router"}
logger := zap.NewNop()
manager, handlers, err := PrepareManagedNamespaceWatcher(context.Background(), logger, ManagedNamespaceWatcherConfig{
Component: "router.NSWatcher",
Namespaces: []string{"tenant-a"},
Subscriber: router,
})
if err != nil {
t.Fatalf("expected watcher preparation success: %v", err)
}
namespace := &corev1.Namespace{}
namespace.Name = "tenant-a"
namespace.Labels = map[string]string{ManagedNamespaceLabelKey: ManagedNamespaceLabelValue}
handlers.DeleteFunc(k8sCache.DeletedFinalStateUnknown{Obj: namespace})
record, ok := manager.Get("tenant-a")
if !ok || record.Phase != NamespacePhaseRemoved {
t.Fatalf("expected default strategy to keep track-only removal semantics")
}
if router.removeCalls != 0 {
t.Fatalf("expected default strategy not to dispatch remove")
}
}
func TestNamespaceManagerSummary(t *testing.T) {
manager := NewNamespaceManager()
manager.Upsert(NamespaceEvent{Type: NamespaceEventAdd, Name: "tenant-a", Source: NamespaceSourceWatcher})