Skip to content

Commit 013a914

Browse files
authored
Merge pull request #6167 from XiShanYongYe-Chang/automated-cherry-pick-of-#6157-#6161-upstream-release-1.12
Automated cherry pick of #6157, #6161: fix(detector): Fixed the issue where the `detector` unnecessary updates for RB issue.
2 parents 265eb0b + 0ea2940 commit 013a914

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

pkg/detector/detector.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,8 @@ func (d *ResourceDetector) ApplyPolicy(object *unstructured.Unstructured, object
466466
// Just update necessary fields, especially avoid modifying Spec.Clusters which is scheduling result, if already exists.
467467
bindingCopy.Annotations = util.DedupeAndMergeAnnotations(bindingCopy.Annotations, binding.Annotations)
468468
bindingCopy.Labels = util.DedupeAndMergeLabels(bindingCopy.Labels, binding.Labels)
469+
bindingCopy.Finalizers = util.DedupeAndMergeFinalizers(bindingCopy.Finalizers, binding.Finalizers)
469470
bindingCopy.OwnerReferences = binding.OwnerReferences
470-
bindingCopy.Finalizers = binding.Finalizers
471471
bindingCopy.Spec.Resource = binding.Spec.Resource
472472
bindingCopy.Spec.ReplicaRequirements = binding.Spec.ReplicaRequirements
473473
bindingCopy.Spec.Replicas = binding.Spec.Replicas
@@ -555,8 +555,8 @@ func (d *ResourceDetector) ApplyClusterPolicy(object *unstructured.Unstructured,
555555
// Just update necessary fields, especially avoid modifying Spec.Clusters which is scheduling result, if already exists.
556556
bindingCopy.Annotations = util.DedupeAndMergeAnnotations(bindingCopy.Annotations, binding.Annotations)
557557
bindingCopy.Labels = util.DedupeAndMergeLabels(bindingCopy.Labels, binding.Labels)
558+
bindingCopy.Finalizers = util.DedupeAndMergeFinalizers(bindingCopy.Finalizers, binding.Finalizers)
558559
bindingCopy.OwnerReferences = binding.OwnerReferences
559-
bindingCopy.Finalizers = binding.Finalizers
560560
bindingCopy.Spec.Resource = binding.Spec.Resource
561561
bindingCopy.Spec.ReplicaRequirements = binding.Spec.ReplicaRequirements
562562
bindingCopy.Spec.Replicas = binding.Spec.Replicas
@@ -603,8 +603,8 @@ func (d *ResourceDetector) ApplyClusterPolicy(object *unstructured.Unstructured,
603603
// Just update necessary fields, especially avoid modifying Spec.Clusters which is scheduling result, if already exists.
604604
bindingCopy.Annotations = util.DedupeAndMergeAnnotations(bindingCopy.Annotations, binding.Annotations)
605605
bindingCopy.Labels = util.DedupeAndMergeLabels(bindingCopy.Labels, binding.Labels)
606+
bindingCopy.Finalizers = util.DedupeAndMergeFinalizers(bindingCopy.Finalizers, binding.Finalizers)
606607
bindingCopy.OwnerReferences = binding.OwnerReferences
607-
bindingCopy.Finalizers = binding.Finalizers
608608
bindingCopy.Spec.Resource = binding.Spec.Resource
609609
bindingCopy.Spec.ReplicaRequirements = binding.Spec.ReplicaRequirements
610610
bindingCopy.Spec.Replicas = binding.Spec.Replicas

pkg/util/label.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,21 @@ func RecordManagedLabels(object *unstructured.Unstructured) {
124124
annotations[workv1alpha2.ManagedLabels] = strings.Join(managedKeys, ",")
125125
object.SetAnnotations(annotations)
126126
}
127+
128+
// DedupeAndMergeFinalizers merges the new finalizers into exist finalizers.
129+
func DedupeAndMergeFinalizers(existFinalizers, newFinalizers []string) []string {
130+
if len(existFinalizers) == 0 {
131+
return newFinalizers
132+
}
133+
existFinalizerSets := sets.Set[string]{}
134+
existFinalizerSets.Insert(existFinalizers...)
135+
136+
var mergedFinalizers []string
137+
mergedFinalizers = append(mergedFinalizers, existFinalizers...)
138+
for _, item := range newFinalizers {
139+
if !existFinalizerSets.Has(item) {
140+
mergedFinalizers = append(mergedFinalizers, item)
141+
}
142+
}
143+
return mergedFinalizers
144+
}

pkg/util/label_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"reflect"
2121
"testing"
2222

23+
"github.com/stretchr/testify/assert"
2324
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2425

2526
workv1alpha2 "github.com/karmada-io/karmada/pkg/apis/work/v1alpha2"
@@ -713,3 +714,69 @@ func TestRecordManagedLabels(t *testing.T) {
713714
})
714715
}
715716
}
717+
718+
func TestDedupeAndMergeFinalizers(t *testing.T) {
719+
type args struct {
720+
existFinalizers []string
721+
newFinalizers []string
722+
}
723+
tests := []struct {
724+
name string
725+
args args
726+
want []string
727+
}{
728+
{
729+
name: "existFinalizers is nil",
730+
args: args{
731+
existFinalizers: nil,
732+
newFinalizers: []string{"karmada.io/binding-controller"},
733+
},
734+
want: []string{"karmada.io/binding-controller"},
735+
},
736+
{
737+
name: "newFinalizers is nil",
738+
args: args{
739+
existFinalizers: []string{"karmada.io/binding-controller"},
740+
newFinalizers: nil,
741+
},
742+
want: []string{"karmada.io/binding-controller"},
743+
},
744+
{
745+
name: "binding-controller in front of binding-dependencies-distributor",
746+
args: args{
747+
existFinalizers: []string{"karmada.io/binding-controller", "karmada.io/binding-dependencies-distributor"},
748+
newFinalizers: []string{"karmada.io/binding-controller"},
749+
},
750+
want: []string{"karmada.io/binding-controller", "karmada.io/binding-dependencies-distributor"},
751+
},
752+
{
753+
name: "binding-dependencies-distributor in front of binding-controller",
754+
args: args{
755+
existFinalizers: []string{"karmada.io/binding-dependencies-distributor", "karmada.io/binding-controller"},
756+
newFinalizers: []string{"karmada.io/binding-controller"},
757+
},
758+
want: []string{"karmada.io/binding-dependencies-distributor", "karmada.io/binding-controller"},
759+
},
760+
{
761+
name: "new finalizers have all Finalizers",
762+
args: args{
763+
existFinalizers: []string{"karmada.io/binding-dependencies-distributor", "karmada.io/binding-controller"},
764+
newFinalizers: []string{"karmada.io/binding-controller", "karmada.io/binding-dependencies-distributor"},
765+
},
766+
want: []string{"karmada.io/binding-dependencies-distributor", "karmada.io/binding-controller"},
767+
},
768+
{
769+
name: "existFinalizers have only one item",
770+
args: args{
771+
existFinalizers: []string{"karmada.io/binding-dependencies-distributor"},
772+
newFinalizers: []string{"karmada.io/binding-controller", "karmada.io/binding-dependencies-distributor"},
773+
},
774+
want: []string{"karmada.io/binding-dependencies-distributor", "karmada.io/binding-controller"},
775+
},
776+
}
777+
for _, tt := range tests {
778+
t.Run(tt.name, func(t *testing.T) {
779+
assert.Equalf(t, tt.want, DedupeAndMergeFinalizers(tt.args.existFinalizers, tt.args.newFinalizers), "DedupeAndMergeFinalizers(%v, %v)", tt.args.existFinalizers, tt.args.newFinalizers)
780+
})
781+
}
782+
}

0 commit comments

Comments
 (0)