Skip to content

Commit a03b852

Browse files
committed
feat(detector): resource detector matched policy potimization
Signed-off-by: chang.qiangqiang <[email protected]>
1 parent b5c6660 commit a03b852

File tree

7 files changed

+103
-268
lines changed

7 files changed

+103
-268
lines changed

pkg/detector/compare.go

+22-11
Original file line numberDiff line numberDiff line change
@@ -21,37 +21,43 @@ import (
2121

2222
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2323
"k8s.io/klog/v2"
24+
"k8s.io/utils/ptr"
2425

2526
policyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/policy/v1alpha1"
2627
"github.com/karmada-io/karmada/pkg/util"
2728
"github.com/karmada-io/karmada/pkg/util/fedinformer/keys"
2829
)
2930

30-
func getHighestPriorityPropagationPolicy(policies []*policyv1alpha1.PropagationPolicy, resource *unstructured.Unstructured, objectKey keys.ClusterWideKey) *policyv1alpha1.PropagationPolicy {
31+
func getHighestPriorityPropagationPolicy(policies []policyv1alpha1.PropagationPolicy, resource *unstructured.Unstructured, objectKey keys.ClusterWideKey) *policyv1alpha1.PropagationPolicy {
3132
matchedPolicyImplicitPriority := util.PriorityMisMatch
3233
matchedPolicyExplicitPriority := int32(math.MinInt32)
3334
var matchedPolicy *policyv1alpha1.PropagationPolicy
3435

3536
for _, policy := range policies {
36-
implicitPriority := util.ResourceMatchSelectorsPriority(resource, policy.Spec.ResourceSelectors...)
37+
policyPointer := ptr.To(policy)
38+
if !policyPointer.DeletionTimestamp.IsZero() {
39+
klog.V(4).Infof("Propagation policy(%s/%s) cannot match any resource template because it's being deleted.", policyPointer.Namespace, policyPointer.Name)
40+
continue
41+
}
42+
implicitPriority := util.ResourceMatchSelectorsPriority(resource, policyPointer.Spec.ResourceSelectors...)
3743
if implicitPriority <= util.PriorityMisMatch {
3844
continue
3945
}
40-
explicitPriority := policy.ExplicitPriority()
46+
explicitPriority := policyPointer.ExplicitPriority()
4147

4248
if matchedPolicyExplicitPriority < explicitPriority {
4349
matchedPolicyImplicitPriority = implicitPriority
4450
matchedPolicyExplicitPriority = explicitPriority
45-
matchedPolicy = policy
51+
matchedPolicy = policyPointer
4652
continue
4753
}
4854

4955
if matchedPolicyExplicitPriority == explicitPriority {
5056
if implicitPriority > matchedPolicyImplicitPriority {
5157
matchedPolicyImplicitPriority = implicitPriority
52-
matchedPolicy = policy
58+
matchedPolicy = policyPointer
5359
} else if implicitPriority == matchedPolicyImplicitPriority {
54-
matchedPolicy = getHigherPriorityPropagationPolicy(matchedPolicy, policy)
60+
matchedPolicy = getHigherPriorityPropagationPolicy(matchedPolicy, policyPointer)
5561
}
5662
}
5763
}
@@ -64,31 +70,36 @@ func getHighestPriorityPropagationPolicy(policies []*policyv1alpha1.PropagationP
6470
return matchedPolicy
6571
}
6672

67-
func getHighestPriorityClusterPropagationPolicy(policies []*policyv1alpha1.ClusterPropagationPolicy, resource *unstructured.Unstructured, objectKey keys.ClusterWideKey) *policyv1alpha1.ClusterPropagationPolicy {
73+
func getHighestPriorityClusterPropagationPolicy(policies []policyv1alpha1.ClusterPropagationPolicy, resource *unstructured.Unstructured, objectKey keys.ClusterWideKey) *policyv1alpha1.ClusterPropagationPolicy {
6874
matchedClusterPolicyImplicitPriority := util.PriorityMisMatch
6975
matchedClusterPolicyExplicitPriority := int32(math.MinInt32)
7076
var matchedClusterPolicy *policyv1alpha1.ClusterPropagationPolicy
7177

7278
for _, policy := range policies {
79+
policyPointer := ptr.To(policy)
80+
if !policyPointer.DeletionTimestamp.IsZero() {
81+
klog.V(4).Infof("Cluster propagation policy(%s/%s) cannot match any resource template because it's being deleted.", policyPointer.Namespace, policyPointer.Name)
82+
continue
83+
}
7384
implicitPriority := util.ResourceMatchSelectorsPriority(resource, policy.Spec.ResourceSelectors...)
7485
if implicitPriority <= util.PriorityMisMatch {
7586
continue
7687
}
77-
explicitPriority := policy.ExplicitPriority()
88+
explicitPriority := policyPointer.ExplicitPriority()
7889

7990
if matchedClusterPolicyExplicitPriority < explicitPriority {
8091
matchedClusterPolicyImplicitPriority = implicitPriority
8192
matchedClusterPolicyExplicitPriority = explicitPriority
82-
matchedClusterPolicy = policy
93+
matchedClusterPolicy = policyPointer
8394
continue
8495
}
8596

8697
if matchedClusterPolicyExplicitPriority == explicitPriority {
8798
if implicitPriority > matchedClusterPolicyImplicitPriority {
8899
matchedClusterPolicyImplicitPriority = implicitPriority
89-
matchedClusterPolicy = policy
100+
matchedClusterPolicy = policyPointer
90101
} else if implicitPriority == matchedClusterPolicyImplicitPriority {
91-
matchedClusterPolicy = getHigherPriorityClusterPropagationPolicy(matchedClusterPolicy, policy)
102+
matchedClusterPolicy = getHigherPriorityClusterPropagationPolicy(matchedClusterPolicy, policyPointer)
92103
}
93104
}
94105
}

pkg/detector/compare_test.go

+20-20
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ func Test_GetHigherPriorityClusterPropagationPolicy(t *testing.T) {
207207

208208
func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
209209
type args struct {
210-
policies []*policyv1alpha1.PropagationPolicy
210+
policies []policyv1alpha1.PropagationPolicy
211211
resource *unstructured.Unstructured
212212
objectKey keys.ClusterWideKey
213213
}
@@ -219,7 +219,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
219219
{
220220
name: "empty policies",
221221
args: args{
222-
policies: []*policyv1alpha1.PropagationPolicy{},
222+
policies: []policyv1alpha1.PropagationPolicy{},
223223
resource: &unstructured.Unstructured{
224224
Object: map[string]interface{}{
225225
"apiVersion": "apps/v1",
@@ -237,7 +237,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
237237
{
238238
name: "mo policy match for resource",
239239
args: args{
240-
policies: []*policyv1alpha1.PropagationPolicy{
240+
policies: []policyv1alpha1.PropagationPolicy{
241241
{
242242
ObjectMeta: metav1.ObjectMeta{Name: "match-with-name", Namespace: "test"},
243243
Spec: policyv1alpha1.PropagationSpec{
@@ -278,7 +278,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
278278
{
279279
name: "different implicit priority policy",
280280
args: args{
281-
policies: []*policyv1alpha1.PropagationPolicy{
281+
policies: []policyv1alpha1.PropagationPolicy{
282282
{
283283
ObjectMeta: metav1.ObjectMeta{Name: "match-with-name", Namespace: "test"},
284284
Spec: policyv1alpha1.PropagationSpec{
@@ -339,7 +339,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
339339
{
340340
name: "same implicit priority policy",
341341
args: args{
342-
policies: []*policyv1alpha1.PropagationPolicy{
342+
policies: []policyv1alpha1.PropagationPolicy{
343343
{
344344
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
345345
Spec: policyv1alpha1.PropagationSpec{
@@ -390,7 +390,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
390390
{
391391
name: "one policy with implicit priority, one policy with explicit priority 1",
392392
args: args{
393-
policies: []*policyv1alpha1.PropagationPolicy{
393+
policies: []policyv1alpha1.PropagationPolicy{
394394
{
395395
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
396396
Spec: policyv1alpha1.PropagationSpec{
@@ -449,7 +449,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
449449
{
450450
name: "one policy with explicit priority 1(name match), one policy with explicit priority 2(label selector match)",
451451
args: args{
452-
policies: []*policyv1alpha1.PropagationPolicy{
452+
policies: []policyv1alpha1.PropagationPolicy{
453453
{
454454
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
455455
Spec: policyv1alpha1.PropagationSpec{
@@ -512,7 +512,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
512512
{
513513
name: "two policies with explicit priority 1(name match), select the one with lower alphabetical order",
514514
args: args{
515-
policies: []*policyv1alpha1.PropagationPolicy{
515+
policies: []policyv1alpha1.PropagationPolicy{
516516
{
517517
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
518518
Spec: policyv1alpha1.PropagationSpec{
@@ -575,7 +575,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
575575
{
576576
name: "one policy with explicit priority 1(name match), one policy with explicit priority 1(label selector match)",
577577
args: args{
578-
policies: []*policyv1alpha1.PropagationPolicy{
578+
policies: []policyv1alpha1.PropagationPolicy{
579579
{
580580
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
581581
Spec: policyv1alpha1.PropagationSpec{
@@ -638,7 +638,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
638638
{
639639
name: "one policy with explicit priority -1(name match), one policy with implicit priority(label selector match)",
640640
args: args{
641-
policies: []*policyv1alpha1.PropagationPolicy{
641+
policies: []policyv1alpha1.PropagationPolicy{
642642
{
643643
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
644644
Spec: policyv1alpha1.PropagationSpec{
@@ -702,7 +702,7 @@ func Test_getHighestPriorityPropagationPolicies(t *testing.T) {
702702

703703
func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
704704
type args struct {
705-
policies []*policyv1alpha1.ClusterPropagationPolicy
705+
policies []policyv1alpha1.ClusterPropagationPolicy
706706
resource *unstructured.Unstructured
707707
objectKey keys.ClusterWideKey
708708
}
@@ -714,7 +714,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
714714
{
715715
name: "empty policies",
716716
args: args{
717-
policies: []*policyv1alpha1.ClusterPropagationPolicy{},
717+
policies: []policyv1alpha1.ClusterPropagationPolicy{},
718718
resource: &unstructured.Unstructured{
719719
Object: map[string]interface{}{
720720
"apiVersion": "apps/v1",
@@ -732,7 +732,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
732732
{
733733
name: "mo policy match for resource",
734734
args: args{
735-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
735+
policies: []policyv1alpha1.ClusterPropagationPolicy{
736736
{
737737
ObjectMeta: metav1.ObjectMeta{Name: "match-with-name", Namespace: "test"},
738738
Spec: policyv1alpha1.PropagationSpec{
@@ -773,7 +773,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
773773
{
774774
name: "different implicit priority policy",
775775
args: args{
776-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
776+
policies: []policyv1alpha1.ClusterPropagationPolicy{
777777
{
778778
ObjectMeta: metav1.ObjectMeta{Name: "match-with-name", Namespace: "test"},
779779
Spec: policyv1alpha1.PropagationSpec{
@@ -834,7 +834,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
834834
{
835835
name: "same implicit priority policy",
836836
args: args{
837-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
837+
policies: []policyv1alpha1.ClusterPropagationPolicy{
838838
{
839839
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
840840
Spec: policyv1alpha1.PropagationSpec{
@@ -885,7 +885,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
885885
{
886886
name: "one policy with implicit priority, one policy with explicit priority 1",
887887
args: args{
888-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
888+
policies: []policyv1alpha1.ClusterPropagationPolicy{
889889
{
890890
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
891891
Spec: policyv1alpha1.PropagationSpec{
@@ -944,7 +944,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
944944
{
945945
name: "one policy with explicit priority 1(name match), one policy with explicit priority 2(label selector match)",
946946
args: args{
947-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
947+
policies: []policyv1alpha1.ClusterPropagationPolicy{
948948
{
949949
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
950950
Spec: policyv1alpha1.PropagationSpec{
@@ -1007,7 +1007,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
10071007
{
10081008
name: "two policies with explicit priority 1(name match), select the one with lower alphabetical order",
10091009
args: args{
1010-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
1010+
policies: []policyv1alpha1.ClusterPropagationPolicy{
10111011
{
10121012
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
10131013
Spec: policyv1alpha1.PropagationSpec{
@@ -1070,7 +1070,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
10701070
{
10711071
name: "one policy with explicit priority 1(name match), one policy with explicit priority 1(label selector match)",
10721072
args: args{
1073-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
1073+
policies: []policyv1alpha1.ClusterPropagationPolicy{
10741074
{
10751075
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
10761076
Spec: policyv1alpha1.PropagationSpec{
@@ -1133,7 +1133,7 @@ func Test_getHighestPriorityClusterPropagationPolicies(t *testing.T) {
11331133
{
11341134
name: "one policy with explicit priority -1(name match), one policy with implicit priority(label selector match)",
11351135
args: args{
1136-
policies: []*policyv1alpha1.ClusterPropagationPolicy{
1136+
policies: []policyv1alpha1.ClusterPropagationPolicy{
11371137
{
11381138
ObjectMeta: metav1.ObjectMeta{Name: "a-pp", Namespace: "test"},
11391139
Spec: policyv1alpha1.PropagationSpec{

0 commit comments

Comments
 (0)