Skip to content

Commit

Permalink
feat: add UT for group score calc
Browse files Browse the repository at this point in the history
Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

feat: add UT for group score calc

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

feat: add UT for group score calc

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

feat: add unit test

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

chore: fix lint

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

feat: update the calc way of group score

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

re-test

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

chore: update comment

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

chore: re-test

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

fix: update weightUnit

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

Trigger checks

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

fix: lint error

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

fix: update the calc of group score

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

fix: golint error

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

feat: complete unit test

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>

feat: add test

Signed-off-by: ipsum-0320 <trueman.0320@zju.edu.cn>
  • Loading branch information
ipsum-0320 committed Oct 29, 2024
1 parent 5432d32 commit a41892b
Showing 1 changed file with 159 additions and 0 deletions.
159 changes: 159 additions & 0 deletions pkg/scheduler/core/spreadconstraint/group_clusters_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package spreadconstraint

import (
"fmt"
"testing"

clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
Expand Down Expand Up @@ -219,3 +220,161 @@ func Test_GroupClustersWithScore(t *testing.T) {
})
}
}

var duplicated = "duplicated"
var aggregated = "aggregated"
var dynamicWeight = "dynamicWeight"
var staticWeight = "staticWeight"

type RbSpecMap map[string]*workv1alpha2.ResourceBindingSpec

func generateRbSpec(replica int32) RbSpecMap {
rbspecDuplicated := &workv1alpha2.ResourceBindingSpec{
Replicas: replica,
Placement: &policyv1alpha1.Placement{
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDuplicated,
},
},
}
rbspecAggregated := &workv1alpha2.ResourceBindingSpec{
Replicas: replica,
Placement: &policyv1alpha1.Placement{
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceAggregated,
},
},
}
rbspecDynamicWeight := &workv1alpha2.ResourceBindingSpec{
Replicas: replica,
Placement: &policyv1alpha1.Placement{
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceWeighted,
WeightPreference: &policyv1alpha1.ClusterPreferences{
DynamicWeight: policyv1alpha1.DynamicWeightByAvailableReplicas,
},
},
},
}
rbspecStaticWeight := &workv1alpha2.ResourceBindingSpec{
Replicas: replica,
Placement: &policyv1alpha1.Placement{
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceWeighted,
WeightPreference: &policyv1alpha1.ClusterPreferences{
StaticWeightList: []policyv1alpha1.StaticClusterWeight{},
},
},
},
}
return RbSpecMap{
"duplicated": rbspecDuplicated,
"aggregated": rbspecAggregated,
"dynamicWeight": rbspecDynamicWeight,
"staticWeight": rbspecStaticWeight,
}
}

func generateClusterScores(n int, scores []int64, replicas []int64) []ClusterDetailInfo {
info := make([]ClusterDetailInfo, n)
for i := 0; i < n; i++ {
info[i] = ClusterDetailInfo{
Name: fmt.Sprintf("member%d", i+1),
Score: scores[i],
AvailableReplicas: replicas[i],
}
}
return info
}

type GroupScoreArgs struct {
id int
clusters1 []ClusterDetailInfo
clusters2 []ClusterDetailInfo
rbSpec *workv1alpha2.ResourceBindingSpec
minGroups int
group1Wins bool
description string
}

func generateArgs() []GroupScoreArgs {
argsList := []GroupScoreArgs{
{
id: 1,
clusters1: generateClusterScores(5, []int64{100, 100, 0, 0, 0}, []int64{30, 30, 30, 30, 30}),
clusters2: generateClusterScores(5, []int64{100, 100, 100, 100, 100}, []int64{30, 30, 30, 10, 10}),
rbSpec: generateRbSpec(20)[duplicated],
group1Wins: true,
description: "clusters1 is better than clusters2, because Because clusters1 meets the replica requirements for a larger number of clusters.",
},
{
id: 2,
clusters1: generateClusterScores(5, []int64{100, 100, 0, 0, 0}, []int64{30, 30, 30, 10, 10}),
clusters2: generateClusterScores(5, []int64{100, 100, 100, 100, 100}, []int64{30, 30, 30, 10, 10}),
rbSpec: generateRbSpec(20)[duplicated],
group1Wins: false,
description: "clusters2 is better than clusters1, because clusters1 and clusters2 meet the replica requirements for the same number of clusters, but clusters2 has a higher score.",
},
{
id: 3,
clusters1: generateClusterScores(5, []int64{100, 100, 0, 0, 0}, []int64{30, 30, 30, 10, 10}),
clusters2: generateClusterScores(5, []int64{100, 100, 100, 100, 100}, []int64{10, 10, 10, 5, 5}),
rbSpec: generateRbSpec(100)[aggregated],
minGroups: 2,
group1Wins: true,
description: "clusters1 is better than clusters2, because clusters1 meets the replica requirements, but clusters2 does not meet.",
},
{
id: 4,
clusters1: generateClusterScores(5, []int64{100, 100, 0, 0, 0}, []int64{10, 10, 10, 10, 5}),
clusters2: generateClusterScores(5, []int64{100, 100, 100, 100, 100}, []int64{10, 10, 10, 5, 5}),
rbSpec: generateRbSpec(100)[dynamicWeight],
minGroups: 2,
group1Wins: true,
description: "clusters1 is better than clusters2, because clusters1's available replica is larger than clusters2.",
},
{
id: 5,
clusters1: generateClusterScores(5, []int64{100, 100, 0, 0, 0}, []int64{10, 10, 10, 5, 5}),
clusters2: generateClusterScores(5, []int64{100, 100, 100, 100, 100}, []int64{10, 10, 10, 5, 5}),
rbSpec: generateRbSpec(100)[staticWeight],
minGroups: 2,
group1Wins: false,
description: "clusters2 is better than clusters1, because clusters2's score is higher than clusters1.",
},
{
id: 6,
clusters1: generateClusterScores(5, []int64{0, 0, 0, 0, 0}, []int64{100, 100, 100, 100, 100}),
clusters2: generateClusterScores(5, []int64{100, 100, 100, 100, 100}, []int64{50, 50, 50, 50, 50}),
rbSpec: generateRbSpec(100)[aggregated],
minGroups: 2,
group1Wins: false,
description: "clusters2 is better than clusters1, because clusters2's score is higher than clusters1, although clusters2's available replica is less than clusters1.",
},
}

return argsList
}

func Test_CalcGroupScore(t *testing.T) {
tests := generateArgs()
groupClustersInfo := &GroupClustersInfo{
Providers: make(map[string]ProviderInfo),
Regions: make(map[string]RegionInfo),
Zones: make(map[string]ZoneInfo),
}

for _, tt := range tests {
t.Run("", func(t *testing.T) {
score1 := groupClustersInfo.calcGroupScore(tt.clusters1, tt.rbSpec, tt.minGroups)
score2 := groupClustersInfo.calcGroupScore(tt.clusters2, tt.rbSpec, tt.minGroups)
t.Logf("test ID: %v, score1 = %v, score2 = %v, score1 >= score 2 res: %v, the description => %v", tt.id, score1, score2, score1 > score2, tt.description)
if tt.group1Wins != (score1 >= score2) {
t.Errorf("test ID: %v, score1 = %v, score2 = %v, score1 >= score 2 want %v, but res is %v", tt.id, score1, score2, tt.group1Wins, score1 > score2)
}
})
}
}

0 comments on commit a41892b

Please sign in to comment.