From a250f41b2d06d95c918b4cb50cb8cffd2cf255e7 Mon Sep 17 00:00:00 2001 From: Bobbie Soedirgo Date: Wed, 16 Sep 2026 23:47:03 +0800 Subject: [PATCH] fix: add project-ref annotation to toposerver, multiadmin, multiadmin-web Signed-off-by: Bobbie Soedirgo --- .../multigrescluster/builders_global.go | 37 ++++++++++++++++--- .../integration_lifecycle_test.go | 13 ++++++- .../multigrescluster/integration_test.go | 18 +++++++++ .../controller/toposerver/integration_test.go | 6 +++ .../controller/toposerver/statefulset.go | 6 +++ .../controller/toposerver/statefulset_test.go | 12 ++++++ 6 files changed, 85 insertions(+), 7 deletions(-) diff --git a/pkg/cluster-handler/controller/multigrescluster/builders_global.go b/pkg/cluster-handler/controller/multigrescluster/builders_global.go index e7eb917d..32410fcd 100644 --- a/pkg/cluster-handler/controller/multigrescluster/builders_global.go +++ b/pkg/cluster-handler/controller/multigrescluster/builders_global.go @@ -64,11 +64,19 @@ func BuildGlobalTopoServer( finalPolicy := multigresv1alpha1.MergePVCDeletionPolicy(etcdPolicy, mergedGlobal) + var annotations map[string]string + if projectRef := cluster.Annotations[metadata.AnnotationProjectRef]; projectRef != "" { + annotations = map[string]string{ + metadata.AnnotationProjectRef: projectRef, + } + } + ts := &multigresv1alpha1.TopoServer{ ObjectMeta: metav1.ObjectMeta{ - Name: cluster.Name + "-global-topo", - Namespace: cluster.Namespace, - Labels: labels, + Name: cluster.Name + "-global-topo", + Namespace: cluster.Namespace, + Labels: labels, + Annotations: annotations, }, Spec: multigresv1alpha1.TopoServerSpec{ Etcd: &multigresv1alpha1.EtcdSpec{ @@ -107,6 +115,8 @@ func BuildMultiadminDeployment( // Merge with user provided pod labels, but standard labels take precedence podLabels := metadata.MergeLabels(standardLabels, spec.PodLabels) + podAnnotations := podAnnotationsWithProjectRef(spec.PodAnnotations, cluster) + // Defensive copy so the built Deployment doesn't alias the resolver's PodPlacementSpec. var tolerations []corev1.Toleration if placement != nil { @@ -127,7 +137,7 @@ func BuildMultiadminDeployment( Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: podLabels, - Annotations: spec.PodAnnotations, + Annotations: podAnnotations, }, Spec: corev1.PodSpec{ ImagePullSecrets: cluster.Spec.Images.ImagePullSecrets, @@ -326,6 +336,8 @@ func BuildMultiadminWebDeployment( // Merge with user provided pod labels, but standard labels take precedence podLabels := metadata.MergeLabels(standardLabels, spec.PodLabels) + podAnnotations := podAnnotationsWithProjectRef(spec.PodAnnotations, cluster) + deploy := &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: fmt.Sprintf("%s-multiadmin-web", cluster.Name), @@ -340,7 +352,7 @@ func BuildMultiadminWebDeployment( Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: podLabels, - Annotations: spec.PodAnnotations, + Annotations: podAnnotations, }, Spec: corev1.PodSpec{ ImagePullSecrets: cluster.Spec.Images.ImagePullSecrets, @@ -661,3 +673,18 @@ func BuildAdminNetworkPolicies( return policies, nil } + +func podAnnotationsWithProjectRef( + userAnnotations map[string]string, + cluster *multigresv1alpha1.MultigresCluster, +) map[string]string { + out := make(map[string]string, len(userAnnotations)+1) + for k, v := range userAnnotations { + out[k] = v + } + out[metadata.AnnotationProjectRef] = metadata.ResolveProjectRef( + cluster.Annotations, + cluster.Name, + ) + return out +} diff --git a/pkg/cluster-handler/controller/multigrescluster/integration_lifecycle_test.go b/pkg/cluster-handler/controller/multigrescluster/integration_lifecycle_test.go index 083ffc27..073fc335 100644 --- a/pkg/cluster-handler/controller/multigrescluster/integration_lifecycle_test.go +++ b/pkg/cluster-handler/controller/multigrescluster/integration_lifecycle_test.go @@ -131,8 +131,11 @@ func TestMultigresCluster_Lifecycle(t *testing.T) { }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ - Labels: clusterLabels(t, "short-annot-bomb", "multiadmin", ""), - Annotations: map[string]string{"heavy-annotation": longAnnotation}, + Labels: clusterLabels(t, "short-annot-bomb", "multiadmin", ""), + Annotations: map[string]string{ + "heavy-annotation": longAnnotation, + "multigres.com/project-ref": "short-annot-bomb", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -245,6 +248,9 @@ func TestMultigresCluster_Lifecycle(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, "mut-test", "multiadmin", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": "mut-test", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{{ @@ -348,6 +354,9 @@ func TestMultigresCluster_Lifecycle(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, "mut-test", "multiadmin", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": "mut-test", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{{ diff --git a/pkg/cluster-handler/controller/multigrescluster/integration_test.go b/pkg/cluster-handler/controller/multigrescluster/integration_test.go index bfa2bea8..f27eeecc 100644 --- a/pkg/cluster-handler/controller/multigrescluster/integration_test.go +++ b/pkg/cluster-handler/controller/multigrescluster/integration_test.go @@ -300,6 +300,9 @@ func TestMultigresCluster_HappyPath(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, clusterName, "multiadmin", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": clusterName, + }, }, Spec: corev1.PodSpec{ ImagePullSecrets: []corev1.LocalObjectReference{{Name: "pull-secret"}}, @@ -393,6 +396,9 @@ func TestMultigresCluster_HappyPath(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, clusterName, "multiadmin-web", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": clusterName, + }, }, Spec: corev1.PodSpec{ ImagePullSecrets: []corev1.LocalObjectReference{{Name: "pull-secret"}}, @@ -666,6 +672,9 @@ func TestMultigresCluster_HappyPath(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, "minimal-cluster", "multiadmin", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": "minimal-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -758,6 +767,9 @@ func TestMultigresCluster_HappyPath(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, "minimal-cluster", "multiadmin-web", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": "minimal-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -1028,6 +1040,9 @@ func TestMultigresCluster_HappyPath(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, "lazy-cluster", "multiadmin", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": "lazy-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -1120,6 +1135,9 @@ func TestMultigresCluster_HappyPath(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: clusterLabels(t, "lazy-cluster", "multiadmin-web", ""), + Annotations: map[string]string{ + "multigres.com/project-ref": "lazy-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ diff --git a/pkg/resource-handler/controller/toposerver/integration_test.go b/pkg/resource-handler/controller/toposerver/integration_test.go index 4ca0ff4b..8b3ece46 100644 --- a/pkg/resource-handler/controller/toposerver/integration_test.go +++ b/pkg/resource-handler/controller/toposerver/integration_test.go @@ -102,6 +102,9 @@ func TestTopoServerReconciliation(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: toposerverLabels(t, "test-cluster"), + Annotations: map[string]string{ + "multigres.com/project-ref": "test-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -281,6 +284,9 @@ func TestTopoServerReconciliation(t *testing.T) { Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: toposerverLabels(t, "test-cluster"), + Annotations: map[string]string{ + "multigres.com/project-ref": "test-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ diff --git a/pkg/resource-handler/controller/toposerver/statefulset.go b/pkg/resource-handler/controller/toposerver/statefulset.go index f46dfdc4..16ab203f 100644 --- a/pkg/resource-handler/controller/toposerver/statefulset.go +++ b/pkg/resource-handler/controller/toposerver/statefulset.go @@ -130,6 +130,12 @@ func BuildStatefulSet( Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: labels, + Annotations: map[string]string{ + metadata.AnnotationProjectRef: metadata.ResolveProjectRef( + toposerver.Annotations, + clusterName, + ), + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ diff --git a/pkg/resource-handler/controller/toposerver/statefulset_test.go b/pkg/resource-handler/controller/toposerver/statefulset_test.go index 41d69934..3cee6d2d 100644 --- a/pkg/resource-handler/controller/toposerver/statefulset_test.go +++ b/pkg/resource-handler/controller/toposerver/statefulset_test.go @@ -87,6 +87,9 @@ func TestBuildStatefulSet(t *testing.T) { "app.kubernetes.io/managed-by": "multigres-operator", "multigres.com/cluster": "test-cluster", }, + Annotations: map[string]string{ + "multigres.com/project-ref": "test-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -235,6 +238,9 @@ func TestBuildStatefulSet(t *testing.T) { "app.kubernetes.io/managed-by": "multigres-operator", "multigres.com/cluster": "test-cluster", }, + Annotations: map[string]string{ + "multigres.com/project-ref": "test-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -385,6 +391,9 @@ func TestBuildStatefulSet(t *testing.T) { "app.kubernetes.io/managed-by": "multigres-operator", "multigres.com/cluster": "custom-cluster", }, + Annotations: map[string]string{ + "multigres.com/project-ref": "custom-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ @@ -529,6 +538,9 @@ func TestBuildStatefulSet(t *testing.T) { "app.kubernetes.io/managed-by": "multigres-operator", "multigres.com/cluster": "test-cluster", }, + Annotations: map[string]string{ + "multigres.com/project-ref": "test-cluster", + }, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{