From 9dc6e1539f82b1636a1396333f74a8acf0d14181 Mon Sep 17 00:00:00 2001 From: whitewindmills Date: Sat, 30 Mar 2024 21:27:41 +0800 Subject: [PATCH] labels cannot be deleted via Karmada propagation. Signed-off-by: whitewindmills --- pkg/util/helper/work.go | 2 +- pkg/util/label.go | 9 ++-- pkg/util/label_test.go | 98 +++++++++++++++++++++-------------------- 3 files changed, 56 insertions(+), 53 deletions(-) diff --git a/pkg/util/helper/work.go b/pkg/util/helper/work.go index b76f7374de05..ed83e7db1714 100644 --- a/pkg/util/helper/work.go +++ b/pkg/util/helper/work.go @@ -47,6 +47,7 @@ func CreateOrUpdateWork(client client.Client, workMeta metav1.ObjectMeta, resour } util.ReplaceAnnotation(workload, workv1alpha2.ResourceTemplateUIDAnnotation, string(workload.GetUID())) util.RecordManagedAnnotations(workload) + util.RecordManagedLabels(workload) workloadJSON, err := workload.MarshalJSON() if err != nil { klog.Errorf("Failed to marshal workload(%s/%s), Error: %v", workload.GetNamespace(), workload.GetName(), err) @@ -84,7 +85,6 @@ func CreateOrUpdateWork(client client.Client, workMeta metav1.ObjectMeta, resour if util.GetLabelValue(runtimeObject.Labels, workv1alpha2.WorkPermanentIDLabel) == "" { runtimeObject.Labels = util.DedupeAndMergeLabels(runtimeObject.Labels, map[string]string{workv1alpha2.WorkPermanentIDLabel: uuid.New().String()}) } - util.RecordManagedLabels(runtimeObject) return nil }) if err != nil { diff --git a/pkg/util/label.go b/pkg/util/label.go index a0f78db4728e..7a3adff0db3d 100644 --- a/pkg/util/label.go +++ b/pkg/util/label.go @@ -23,7 +23,6 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/sets" - workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1" workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2" ) @@ -111,18 +110,18 @@ func getDeletedLabelKeys(desired, observed *unstructured.Unstructured) sets.Set[ // RecordManagedLabels sets or updates the annotation(resourcetemplate.karmada.io/managed-labels) // to record the label keys. -func RecordManagedLabels(w *workv1alpha1.Work) { - annotations := w.GetAnnotations() +func RecordManagedLabels(object *unstructured.Unstructured) { + annotations := object.GetAnnotations() if annotations == nil { annotations = make(map[string]string, 1) } var managedKeys []string // record labels. - labels := w.GetLabels() + labels := object.GetLabels() for key := range labels { managedKeys = append(managedKeys, key) } sort.Strings(managedKeys) annotations[workv1alpha2.ManagedLabels] = strings.Join(managedKeys, ",") - w.SetAnnotations(annotations) + object.SetAnnotations(annotations) } diff --git a/pkg/util/label_test.go b/pkg/util/label_test.go index 45503d51d52d..6d15b89ecd5a 100644 --- a/pkg/util/label_test.go +++ b/pkg/util/label_test.go @@ -20,10 +20,8 @@ import ( "reflect" "testing" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - workv1alpha1 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha1" workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2" ) @@ -528,65 +526,71 @@ func TestRetainLabels(t *testing.T) { func TestRecordManagedLabels(t *testing.T) { tests := []struct { name string - object *workv1alpha1.Work - expected *workv1alpha1.Work + object *unstructured.Unstructured + expected *unstructured.Unstructured }{ { name: "nil label", - object: &workv1alpha1.Work{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "work.karmada.io/v1alpha1", - Kind: "Work", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "demo-work-1", - Namespace: "cluster1-ns", - Labels: nil, + object: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]interface{}{ + "name": "demo-deployment-1", + }, + "spec": map[string]interface{}{ + "replicas": 2, + }, }, }, - expected: &workv1alpha1.Work{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "work.karmada.io/v1alpha1", - Kind: "Work", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "demo-work-1", - Namespace: "cluster1-ns", - Annotations: map[string]string{ - workv1alpha2.ManagedLabels: "", + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]interface{}{ + "name": "demo-deployment-1", + "annotations": map[string]interface{}{ + workv1alpha2.ManagedLabels: "", + }, + }, + "spec": map[string]interface{}{ + "replicas": 2, }, - Labels: nil, }, }, }, { name: "object has has labels", - object: &workv1alpha1.Work{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "work.karmada.io/v1alpha1", - Kind: "Work", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "demo-work-1", - Namespace: "cluster1-ns", - Labels: map[string]string{ - "foo": "bar", + object: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]interface{}{ + "name": "demo-deployment-1", + "labels": map[string]interface{}{ + "foo": "foo", + }, + }, + "spec": map[string]interface{}{ + "replicas": 2, }, }, }, - expected: &workv1alpha1.Work{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "work.karmada.io/v1alpha1", - Kind: "Work", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "demo-work-1", - Namespace: "cluster1-ns", - Annotations: map[string]string{ - workv1alpha2.ManagedLabels: "foo", - }, - Labels: map[string]string{ - "foo": "bar", + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]interface{}{ + "name": "demo-deployment-1", + "annotations": map[string]interface{}{ + workv1alpha2.ManagedLabels: "foo", + }, + "labels": map[string]interface{}{ + "foo": "foo", + }, + }, + "spec": map[string]interface{}{ + "replicas": 2, }, }, },