From 7d7fe561a80aa559a9f7557e050f57ee68f6fd33 Mon Sep 17 00:00:00 2001 From: Naeel Date: Sun, 26 Apr 2026 11:51:03 +0300 Subject: [PATCH] layer1: log namespace summary active flag --- .../2026-04-26-namespace-manager-step49.md | 15 ++++++++++ pkg/utils/namespace_manager.go | 1 + pkg/utils/namespace_manager_test.go | 28 ++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/doc/thinking/2026-04-26-namespace-manager-step49.md b/doc/thinking/2026-04-26-namespace-manager-step49.md index 0330d457..e3015117 100644 --- a/doc/thinking/2026-04-26-namespace-manager-step49.md +++ b/doc/thinking/2026-04-26-namespace-manager-step49.md @@ -2,6 +2,21 @@ ## Цель шага +Довести `HasActiveNamespaces()` до реального use-site, чтобы helper не оставался чисто декларативным. + +## Что изменено + +1. `LogNamespaceManagerSummary()` теперь пишет флаг `has_active_namespaces`. +2. Добавлен unit test на presence и значение этого поля в structured log. + +## Почему это безопасно + +- watcher behavior не меняется; +- изменён только debug/logging contract; +- покрыто `go test ./pkg/utils/...`.# 2026-04-26 — NamespaceManager rewrite, step 49 + +## Цель шага + Собрать `prepare + start` managed namespace watcher в один общий entrypoint. ## Что меняем diff --git a/pkg/utils/namespace_manager.go b/pkg/utils/namespace_manager.go index 4f0e7ba0..aaf23724 100644 --- a/pkg/utils/namespace_manager.go +++ b/pkg/utils/namespace_manager.go @@ -143,6 +143,7 @@ func LogNamespaceManagerSummary(logger *zap.Logger, message string, summary Name logger.Info(message, zap.Int("total_namespaces", summary.TotalNamespaces), zap.Int("live_namespaces", summary.LiveNamespaces), + zap.Bool("has_active_namespaces", summary.HasActiveNamespaces()), zap.Any("phase_counts", summary.PhaseCounts), zap.Any("source_counts", summary.SourceCounts), zap.Strings("subscribers", summary.Subscribers), diff --git a/pkg/utils/namespace_manager_test.go b/pkg/utils/namespace_manager_test.go index c2930453..f47ce939 100644 --- a/pkg/utils/namespace_manager_test.go +++ b/pkg/utils/namespace_manager_test.go @@ -8,6 +8,7 @@ import ( "time" "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" corev1 "k8s.io/api/core/v1" k8sfake "k8s.io/client-go/kubernetes/fake" k8sCache "k8s.io/client-go/tools/cache" @@ -570,7 +571,7 @@ func TestLogNamespaceManagerSummary(t *testing.T) { TotalNamespaces: 2, LiveNamespaces: 1, PhaseCounts: map[NamespacePhase]int{ - NamespacePhaseActive: 1, + NamespacePhaseActive: 1, NamespacePhaseRemoved: 1, }, SourceCounts: map[NamespaceSource]int{ @@ -583,6 +584,31 @@ func TestLogNamespaceManagerSummary(t *testing.T) { LogNamespaceManagerSummary(logger, "namespace summary", summary) } +func TestLogNamespaceManagerSummaryIncludesHasActiveNamespaces(t *testing.T) { + core, logs := observer.New(zap.InfoLevel) + logger := zap.New(core) + + LogNamespaceManagerSummary(logger, "namespace summary", NamespaceManagerSummary{ + LiveNamespaces: 1, + PhaseCounts: map[NamespacePhase]int{}, + SourceCounts: map[NamespaceSource]int{}, + Subscribers: []string{}, + }) + + entries := logs.AllUntimed() + if len(entries) != 1 { + t.Fatalf("expected one log entry, got %d", len(entries)) + } + fields := entries[0].ContextMap() + active, ok := fields["has_active_namespaces"].(bool) + if !ok { + t.Fatalf("expected has_active_namespaces field in log context") + } + if !active { + t.Fatalf("expected has_active_namespaces=true in log context") + } +} + func TestNamespaceManagerSummaryEmptyContract(t *testing.T) { manager := NewNamespaceManager() summary := manager.Summary()