forked from JointCloud/pcm-coordinator
76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package strategy
|
|
|
|
import (
|
|
"errors"
|
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/common"
|
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/schedulers/option"
|
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service/collector"
|
|
)
|
|
|
|
type DynamicResourcesStrategy struct {
|
|
replicas int32
|
|
resources []*collector.ResourceStats
|
|
opt option.Option
|
|
}
|
|
|
|
func NewDynamicResourcesStrategy(resources []*collector.ResourceStats, opt option.Option, replica int32) *DynamicResourcesStrategy {
|
|
return &DynamicResourcesStrategy{resources: resources, opt: opt, replicas: replica}
|
|
}
|
|
|
|
func (ps *DynamicResourcesStrategy) Schedule() ([]*AssignedCluster, error) {
|
|
if ps.replicas < 1 {
|
|
return nil, errors.New("replicas must be greater than 0")
|
|
}
|
|
|
|
switch ps.opt.GetOptionType() {
|
|
case option.AI:
|
|
opt := (interface{})(ps.opt).(*option.AiOption)
|
|
|
|
var maxCardHoursAvailable float64
|
|
var maxCpuCoreHoursAvailable float64
|
|
var assignedCluster AssignedCluster
|
|
var results []*AssignedCluster
|
|
for _, res := range ps.resources {
|
|
|
|
if res == nil {
|
|
continue
|
|
}
|
|
|
|
if opt.ResourceType == "cpu" {
|
|
if res.CpuCoreHours <= 0 {
|
|
cluster := &AssignedCluster{ClusterId: res.ClusterId, Replicas: ps.replicas}
|
|
results = append(results, cluster)
|
|
return results, nil
|
|
}
|
|
|
|
if res.CpuCoreHours > maxCpuCoreHoursAvailable {
|
|
maxCpuCoreHoursAvailable = res.CpuCoreHours
|
|
assignedCluster.ClusterId = res.ClusterId
|
|
assignedCluster.Replicas = ps.replicas
|
|
}
|
|
}
|
|
|
|
if opt.ResourceType == "computeCard" {
|
|
var maxCurrentCardHours float64
|
|
for _, card := range res.CardsAvail {
|
|
cardHours := common.RoundFloat( /*card.TOpsAtFp16**/ card.CardHours, 3)
|
|
if cardHours > maxCurrentCardHours {
|
|
maxCurrentCardHours = cardHours
|
|
}
|
|
}
|
|
if maxCurrentCardHours > maxCardHoursAvailable {
|
|
maxCardHoursAvailable = maxCurrentCardHours
|
|
assignedCluster.ClusterId = res.ClusterId
|
|
assignedCluster.Replicas = ps.replicas
|
|
}
|
|
}
|
|
}
|
|
results = append(results, &assignedCluster)
|
|
return results, nil
|
|
case option.CLOUD:
|
|
|
|
}
|
|
|
|
return nil, errors.New("failed to apply DynamicResourcesStrategy")
|
|
}
|