package test import ( "fmt" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/entity" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/service/collector" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy" "math/rand" "testing" "time" ) func TestReplication(t *testing.T) { parts := []entity.Participant{ {Name: "test1", Participant_id: 1}, {Name: "test2", Participant_id: 2}, {Name: "test3", Participant_id: 3}, } rsc := []*collector.ResourceStats{ { ClusterId: "1", Name: "test1", }, { ClusterId: "2", Name: "test2"}, { ClusterId: "3", Name: "test3"}, } tests := []struct { name string replica int32 ps []entity.Participant res []*collector.ResourceStats }{ { name: "test1", replica: 1, ps: parts, }, { name: "test2", replica: 2, ps: parts, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var clusterIds []string for _, stats := range rsc { clusterIds = append(clusterIds, stats.ClusterId) } repl := strategy.NewReplicationStrategy(clusterIds, 0) schedule, err := repl.Schedule() if err != nil { return } for _, cluster := range schedule { fmt.Println(cluster) } }) } } func TestStaticWeight(t *testing.T) { parts := map[string]int32{ "test1": 6, "test2": 5, "test3": 2, } tests := []struct { name string replica int32 ps map[string]int32 }{ { name: "test1", replica: 1, ps: parts, }, { name: "test2", replica: 5, ps: parts, }, { name: "test2", replica: 6, ps: parts, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { repl := strategy.NewStaticWeightStrategy(tt.ps, tt.replica) schedule, err := repl.Schedule() if err != nil { return } for _, cluster := range schedule { fmt.Println(cluster) } }) } } func TestRandom(t *testing.T) { // 使用当前时间作为随机数种子,确保每次程序运行产生的随机数序列都不同 rand.Seed(time.Now().UnixNano()) /*randomNum := randInt(1, 100) fmt.Println("Random number:", randomNum)*/ total := 5 // 假设总数是5 first, second := splitIntoTwoRandomParts(total) fmt.Printf("第一部分的数量: %d, 第二部分的数量: %d\n", first, second) } // randInt 生成一个指定范围内的随机整数,包括min但不包括max func randInt(min, max int) int { return min + rand.Intn(max-min) } func splitIntoTwoRandomParts(total int) (int, int) { if total < 2 { // 如果总数小于2,则无法分成两部分 return 0, 0 } // 生成一个随机数作为第一部分的数量(范围在[1, total-1]之间) firstPart := rand.Intn(total-1) + 1 // 第二部分的数量就是总数减去第一部分的数量 secondPart := total - firstPart return firstPart, secondPart } func splitIntoRandomParts(total int) (int, int) { if total < 2 { // 如果总数小于2,则无法分成两部分 return 0, 0 } // 生成一个随机数作为第一部分的数量(范围在[1, total-1]之间) firstPart := rand.Intn(total-1) + 1 // 第二部分的数量就是总数减去第一部分的数量 secondPart := total - firstPart return firstPart, secondPart } func TestRandoms(t *testing.T) { // 使用当前时间作为随机数种子,确保每次程序运行产生的随机数序列都不同 rand.Seed(time.Now().UnixNano()) /*randomNum := randInt(1, 100) fmt.Println("Random number:", randomNum)*/ total := 10 // 假设总数是5 parts := splitRandomParts(total) fmt.Println("分配结果:", parts) } // splitIntoRandomParts 将总数total随机分成多个部分,并返回这些部分的切片 func splitRandomParts(total int) []int { if total < 2 { // 如果总数小于2,则无法分成多个部分 return []int{total} } // 创建一个切片来保存每个部分的数量 var parts []int // 剩余要分配的副本数 remaining := total // 随机决定要分成的部分数量(至少2个部分) numParts := rand.Intn(total-1) + 2 // 确保每个部分至少获得1个副本 for i := 0; i < numParts-1; i++ { // 生成一个随机数(1到剩余副本数之间) // 为了避免最后一个部分太小,我们可能需要调整随机数范围 minPartSize := 1 if remaining <= numParts-i { // 如果剩余副本数不足以让每个部分都至少获得1个,则调整最小部分大小 minPartSize = remaining / (numParts - i) if remaining%(numParts-i) > 0 { minPartSize++ } } // 生成一个大于等于minPartSize且小于等于remaining的随机数 partSize := minPartSize + rand.Intn(remaining-minPartSize+1) parts = append(parts, partSize) remaining -= partSize } // 最后一个部分的数量就是剩余的副本数 parts = append(parts, remaining) return parts } func TestNumRandom(t *testing.T) { total := 10 // 假设副本数是10 numParts := 2 // 假设要分成5个集群 parts, err := splitIntoParts(total, numParts) if err != nil { fmt.Println("Error:", err) return } fmt.Println("分配结果:", parts) } // splitIntoParts 将总数total随机分成numParts个部分,并返回这些部分的切片 func splitIntoParts(total int, numParts int) ([]int, error) { if total < 1 || numParts < 1 { // 总数或部分数量不能小于1 return nil, fmt.Errorf("total and numParts must be greater than 0") } if numParts > total { // 部分数量不能大于总数 return nil, fmt.Errorf("numParts cannot be greater than total") } // 创建一个切片来保存每个部分的数量 parts := make([]int, numParts) // 首先将每个部分都分配至少一个副本 for i := range parts { parts[i] = 1 total-- } // 剩余要分配的副本数 remaining := total // 随机分配剩余的副本 for remaining > 0 { // 随机选择一个部分(索引从0到numParts-1) partIndex := rand.Intn(numParts) // 如果该部分加上一个副本后不会超过总数,则分配一个副本 if parts[partIndex]+1 <= total { parts[partIndex]++ remaining-- } } return parts, nil }