diff --git a/doc/thinking/2026-04-26-namespace-manager-step18.md b/doc/thinking/2026-04-26-namespace-manager-step18.md new file mode 100644 index 00000000..5187c30a --- /dev/null +++ b/doc/thinking/2026-04-26-namespace-manager-step18.md @@ -0,0 +1,15 @@ +# 2026-04-26 — NamespaceManager rewrite, step 18 + +## Цель шага + +Подготовить watcher-friendly helper для преобразования Kubernetes Namespace в `NamespaceEvent`. + +## Что меняем + +1. Добавляем `NamespaceEventFromNamespace()`. +2. Добавляем unit tests на перенос имени и labels. + +## Что НЕ меняем + +- не подключаем helper к watcher-ам; +- не меняем runtime behavior. \ No newline at end of file diff --git a/pkg/utils/namespace.go b/pkg/utils/namespace.go index a0487761..1cd9c4fe 100644 --- a/pkg/utils/namespace.go +++ b/pkg/utils/namespace.go @@ -13,11 +13,11 @@ import ( ) const ( - ENV_FUNCTION_NAMESPACE string = "FISSION_FUNCTION_NAMESPACE" - ENV_BUILDER_NAMESPACE string = "FISSION_BUILDER_NAMESPACE" - ENV_DEFAULT_NAMESPACE string = "FISSION_DEFAULT_NAMESPACE" - ENV_ADDITIONAL_NAMESPACE string = "FISSION_RESOURCE_NAMESPACES" - ManagedNamespaceLabelKey string = "fission.io/managed" + ENV_FUNCTION_NAMESPACE string = "FISSION_FUNCTION_NAMESPACE" + ENV_BUILDER_NAMESPACE string = "FISSION_BUILDER_NAMESPACE" + ENV_DEFAULT_NAMESPACE string = "FISSION_DEFAULT_NAMESPACE" + ENV_ADDITIONAL_NAMESPACE string = "FISSION_RESOURCE_NAMESPACES" + ManagedNamespaceLabelKey string = "fission.io/managed" ManagedNamespaceLabelValue string = "true" ) diff --git a/pkg/utils/namespace_manager_model.go b/pkg/utils/namespace_manager_model.go index cfde9040..3d504600 100644 --- a/pkg/utils/namespace_manager_model.go +++ b/pkg/utils/namespace_manager_model.go @@ -1,6 +1,10 @@ package utils -import "time" +import ( + "time" + + corev1 "k8s.io/api/core/v1" +) const ( NamespacePartStateRegistering string = "registering" @@ -77,6 +81,13 @@ func ManagedNamespaceEvent(eventType NamespaceEventType, name string, source Nam }, source, observedAt) } +func NamespaceEventFromNamespace(eventType NamespaceEventType, namespace *corev1.Namespace, source NamespaceSource, observedAt time.Time) NamespaceEvent { + if namespace == nil { + return NewNamespaceEvent(eventType, "", nil, source, observedAt) + } + return NewNamespaceEvent(eventType, namespace.Name, namespace.Labels, source, observedAt) +} + func (nr NamespaceRecord) Clone() NamespaceRecord { clone := nr clone.Labels = cloneStringMap(nr.Labels) diff --git a/pkg/utils/namespace_manager_model_test.go b/pkg/utils/namespace_manager_model_test.go index c52cceff..bf0664d0 100644 --- a/pkg/utils/namespace_manager_model_test.go +++ b/pkg/utils/namespace_manager_model_test.go @@ -3,6 +3,8 @@ package utils import ( "testing" "time" + + corev1 "k8s.io/api/core/v1" ) func TestNamespaceRecordClone(t *testing.T) { @@ -86,3 +88,22 @@ func TestManagedNamespaceEvent(t *testing.T) { t.Fatalf("expected tenant-a event name") } } + +func TestNamespaceEventFromNamespace(t *testing.T) { + namespace := &corev1.Namespace{} + namespace.Name = "tenant-a" + namespace.Labels = map[string]string{ManagedNamespaceLabelKey: ManagedNamespaceLabelValue} + + event := NamespaceEventFromNamespace(NamespaceEventAdd, namespace, NamespaceSourceWatcher, time.Now().UTC()) + if event.Name != "tenant-a" { + t.Fatalf("expected tenant-a event name") + } + if event.Labels[ManagedNamespaceLabelKey] != ManagedNamespaceLabelValue { + t.Fatalf("expected namespace labels to be copied into event") + } + + namespace.Labels[ManagedNamespaceLabelKey] = "false" + if event.Labels[ManagedNamespaceLabelKey] != ManagedNamespaceLabelValue { + t.Fatalf("expected event labels to stay detached from original namespace") + } +}