From 6056c048930b9b6ad8a76d6bb9ac1ae232f44fba Mon Sep 17 00:00:00 2001 From: Suvaansh <34331549+suvaanshkumar@users.noreply.github.com> Date: Thu, 18 Sep 2025 22:24:46 -0400 Subject: [PATCH] Adding labels to the resources created by work controller (#1176) Signed-off-by: suvaanshkumar --- ...manifestworkreplicaset_deploy_reconcile.go | 17 +++++++++---- .../manifestwork_controller.go | 6 +++-- .../work/manifestworkreplicaset_test.go | 22 +++++++++++++++++ test/integration/work/work_test.go | 24 +++++++++++++++++++ 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/pkg/work/hub/controllers/manifestworkreplicasetcontroller/manifestworkreplicaset_deploy_reconcile.go b/pkg/work/hub/controllers/manifestworkreplicasetcontroller/manifestworkreplicaset_deploy_reconcile.go index 93217b542..2485e3d37 100644 --- a/pkg/work/hub/controllers/manifestworkreplicasetcontroller/manifestworkreplicaset_deploy_reconcile.go +++ b/pkg/work/hub/controllers/manifestworkreplicasetcontroller/manifestworkreplicaset_deploy_reconcile.go @@ -271,16 +271,25 @@ func CreateManifestWork( return nil, fmt.Errorf("invalid cluster namespace") } + // Get ManifestWorkReplicaSet labels + labels := mwrSet.Labels + // TODO consider how to trace the manifestworks spec changes for cloudevents work client + // Merge mwrSet.Labels with the required labels + mergedLabels := make(map[string]string) + for k, v := range labels { + mergedLabels[k] = v + } + + mergedLabels[ManifestWorkReplicaSetControllerNameLabelKey] = manifestWorkReplicaSetKey(mwrSet) + mergedLabels[ManifestWorkReplicaSetPlacementNameLabelKey] = placementRefName + return &workv1.ManifestWork{ ObjectMeta: metav1.ObjectMeta{ Name: mwrSet.Name, Namespace: clusterNS, - Labels: map[string]string{ - ManifestWorkReplicaSetControllerNameLabelKey: manifestWorkReplicaSetKey(mwrSet), - ManifestWorkReplicaSetPlacementNameLabelKey: placementRefName, - }, + Labels: mergedLabels, }, Spec: mwrSet.Spec.ManifestWorkTemplate, }, nil diff --git a/pkg/work/spoke/controllers/manifestcontroller/manifestwork_controller.go b/pkg/work/spoke/controllers/manifestcontroller/manifestwork_controller.go index 761a67114..2207d6eb0 100644 --- a/pkg/work/spoke/controllers/manifestcontroller/manifestwork_controller.go +++ b/pkg/work/spoke/controllers/manifestcontroller/manifestwork_controller.go @@ -139,7 +139,7 @@ func (m *ManifestWorkController) sync(ctx context.Context, controllerContext fac } // Apply appliedManifestWork - appliedManifestWork, err := m.applyAppliedManifestWork(ctx, manifestWork.Name, m.hubHash, m.agentID) + appliedManifestWork, err := m.applyAppliedManifestWork(ctx, manifestWork.Name, m.hubHash, m.agentID, manifestWork.ObjectMeta.Labels) if err != nil { return err } @@ -187,11 +187,13 @@ func (m *ManifestWorkController) sync(ctx context.Context, controllerContext fac return nil } -func (m *ManifestWorkController) applyAppliedManifestWork(ctx context.Context, workName, hubHash, agentID string) (*workapiv1.AppliedManifestWork, error) { +func (m *ManifestWorkController) applyAppliedManifestWork(ctx context.Context, workName, + hubHash, agentID string, labels map[string]string) (*workapiv1.AppliedManifestWork, error) { appliedManifestWorkName := fmt.Sprintf("%s-%s", m.hubHash, workName) requiredAppliedWork := &workapiv1.AppliedManifestWork{ ObjectMeta: metav1.ObjectMeta{ Name: appliedManifestWorkName, + Labels: labels, Finalizers: []string{workapiv1.AppliedManifestWorkFinalizer}, }, Spec: workapiv1.AppliedManifestWorkSpec{ diff --git a/test/integration/work/manifestworkreplicaset_test.go b/test/integration/work/manifestworkreplicaset_test.go index d4e23f4bb..489ab9bb7 100644 --- a/test/integration/work/manifestworkreplicaset_test.go +++ b/test/integration/work/manifestworkreplicaset_test.go @@ -129,6 +129,7 @@ var _ = ginkgo.Describe("ManifestWorkReplicaSet", func() { gomega.Expect(err).ToNot(gomega.HaveOccurred()) gomega.Eventually(assertWorksByReplicaSet(clusterNames, manifestWorkReplicaSet, 3), eventuallyTimeout, eventuallyInterval).Should(gomega.Succeed()) + gomega.Eventually(assertWorksSameLabelAsReplicaSet(manifestWorkReplicaSet), eventuallyTimeout, eventuallyInterval).Should(gomega.Succeed()) gomega.Eventually(assertSummary(workapiv1alpha1.ManifestWorkReplicaSetSummary{ Total: 3, }, manifestWorkReplicaSet), eventuallyTimeout, eventuallyInterval).Should(gomega.Succeed()) @@ -452,3 +453,24 @@ func assertWorksByReplicaSet(clusterNames sets.Set[string], mwrs *workapiv1alpha return nil } } + +func assertWorksSameLabelAsReplicaSet(mwrs *workapiv1alpha1.ManifestWorkReplicaSet) func() error { + return func() error { + key := fmt.Sprintf("%s.%s", mwrs.Namespace, mwrs.Name) + works, err := hubWorkClient.WorkV1().ManifestWorks(metav1.NamespaceAll).List(context.TODO(), metav1.ListOptions{ + LabelSelector: fmt.Sprintf("work.open-cluster-management.io/manifestworkreplicaset=%s", key), + }) + if err != nil { + return err + } + + for _, work := range works.Items { + for k, v := range mwrs.Labels { + if work.Labels[k] != v { + return fmt.Errorf("label %s mismatch: expected %s, got %s", k, v, work.Labels[k]) + } + } + } + return nil + } +} diff --git a/test/integration/work/work_test.go b/test/integration/work/work_test.go index 56b92beec..de9578ca8 100644 --- a/test/integration/work/work_test.go +++ b/test/integration/work/work_test.go @@ -868,6 +868,7 @@ var _ = ginkgo.Describe("ManifestWork", func() { }) ginkgo.Context("Work completion", func() { + ginkgo.BeforeEach(func() { manifests = []workapiv1.Manifest{ util.ToManifest(util.NewConfigmap(clusterName, cm1, map[string]string{"a": "b"}, nil)), @@ -938,5 +939,28 @@ var _ = ginkgo.Describe("ManifestWork", func() { return nil }, eventuallyTimeout, eventuallyInterval).Should(gomega.Succeed()) }) + + ginkgo.It("should propagate labels from ManifestWork to AppliedManifestWork", func() { + // Add labels to the work using Patch instead of Update + patchData := `{"metadata":{"labels":{"test-label":"test-value","test-label-2":"test-value-2"}}}` + + _, err := hubWorkClient.WorkV1().ManifestWorks(clusterName).Patch( + context.Background(), work.Name, types.MergePatchType, + []byte(patchData), metav1.PatchOptions{}) + gomega.Expect(err).ToNot(gomega.HaveOccurred()) + + // Verify AppliedManifestWork has the same labels + gomega.Eventually(func() bool { + appliedWork, err := spokeWorkClient.WorkV1().AppliedManifestWorks().Get( + context.Background(), appliedManifestWorkName, metav1.GetOptions{}) + if err != nil { + return false + } + + // Check if labels match + return appliedWork.Labels["test-label"] == "test-value" && + appliedWork.Labels["test-label-2"] == "test-value-2" + }, eventuallyTimeout, eventuallyInterval).Should(gomega.BeTrue()) + }) }) })