|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package schedulers
-
- import (
- "context"
- "github.com/pkg/errors"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/algorithm/providerPricing"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/schedulers/option"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/strategy"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/response"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/tracker"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
- "gorm.io/gorm"
- )
-
- type VmScheduler struct {
- yamlString string
- storage database.Storage
- task *response.TaskInfo
- *scheduler.Scheduler
- option *option.VmOption
- ctx context.Context
- promClient tracker.Prometheus
- dbEngin *gorm.DB
- svcCtx *svc.ServiceContext
- }
-
- type VmResult struct {
- TaskId string
- ClusterId string
- ClusterName string
- Strategy string
- Replica int32
- Msg string
- }
-
- func NewVmScheduler(ctx context.Context, val string, scheduler *scheduler.Scheduler, option *option.VmOption, dbEngin *gorm.DB, promClient tracker.Prometheus) (*VmScheduler, error) {
- return &VmScheduler{ctx: ctx, yamlString: val, Scheduler: scheduler, option: option, dbEngin: dbEngin, promClient: promClient}, nil
- }
-
- func (vm *VmScheduler) PickOptimalStrategy() (strategy.Strategy, error) {
- if len(vm.option.ClusterIds) == 1 {
- // TODO database operation Find
- return &strategy.SingleAssignment{Cluster: &strategy.AssignedCluster{ClusterId: vm.option.ClusterIds[0], Replicas: 1}}, nil
- }
- //resources, err := vm.findClustersWithResources()
-
- /* if err != nil {
- return nil, err
- }*/
-
- //if len(resources) == 1 {
- // var cluster strategy.AssignedCluster
- // cluster.ClusterId = resources[0].ClusterId
- // cluster.Replicas = 1
- // return &strategy.SingleAssignment{Cluster: &cluster}, nil
- //}
- //params := ¶m.Params{Resources: resources}
-
- switch vm.option.Strategy {
- /* case strategy.REPLICATION:
- var clusterIds []string
- for _, resource := range resources {
- clusterIds = append(clusterIds, resource.ClusterId)
- }
- strategy := strategy.NewReplicationStrategy(clusterIds, 1)
- return strategy, nil
- case strategy.RESOURCES_PRICING:
- strategy := strategy.NewPricingStrategy(¶m.ResourcePricingParams{Params: params, Replicas: 1})
- return strategy, nil*/
- /* case strategy.DYNAMIC_RESOURCES:
- strategy := strategy.NewDynamicResourcesStrategy(params.Resources, vm.option, 1)
- return strategy, nil*/
- case strategy.STATIC_WEIGHT:
- //todo resources should match cluster StaticWeightMap
- strategy := strategy.NewStaticWeightStrategy(vm.option.StaticWeightMap, 1)
- return strategy, nil
- case strategy.RANDOM:
- strategy := strategy.NewRandomStrategy(vm.option.ClusterIds, vm.option.Replicas)
- return strategy, nil
- }
- return nil, errors.New("no strategy has been chosen")
- }
-
- func (v *VmScheduler) GetNewStructForDb(task *response.TaskInfo, resource string, participantId int64) (interface{}, error) {
- //TODO implement me
- vm := models.Vm{}
- utils.Convert(task.Metadata, &vm)
- vm.Id = utils.GenSnowflakeID()
- vm.TaskId = vm.TaskId
- vm.Status = constants.Saved
- vm.ParticipantId = participantId
- return vm, nil
- }
-
- func (vm *VmScheduler) genTaskAndProviders() (*providerPricing.Task, []*providerPricing.Provider, error) {
- proParams, err := vm.storage.GetProviderParams()
- if err != nil {
- return nil, nil, nil
- }
- var providerList []*providerPricing.Provider
- for _, p := range proParams {
- provider := providerPricing.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0)
- providerList = append(providerList, provider)
- }
-
- //replicas := task.Metadata.(map[string]interface{})["spec"].(map[string]interface{})["replicas"].(float64)
- //t := algorithm.NewTask(0, int(replicas), 2, 75120000, 301214500, 1200, 2, 6, 2000)
-
- return nil, providerList, nil
- }
-
- func (as *VmScheduler) AssignTask(clusters []*strategy.AssignedCluster, mode int) (interface{}, error) {
- //TODO implement me
- if clusters == nil {
- return nil, errors.New("clusters is nil")
- }
-
- for i := len(clusters) - 1; i >= 0; i-- {
- if clusters[i].Replicas == 0 {
- clusters = append(clusters[:i], clusters[i+1:]...)
- }
- }
-
- if len(clusters) == 0 {
- return nil, errors.New("clusters is nil")
- }
-
- var results []*VmResult
-
- for _, cluster := range clusters {
- cName := ""
- as.dbEngin.Table("t_cluster").Select("name").Where("id=?", cluster.ClusterId).Find(&cName)
- cr := VmResult{
- ClusterId: cluster.ClusterId,
- ClusterName: cName,
- Replica: cluster.Replicas,
- }
- cr.ClusterId = cluster.ClusterId
- cr.Replica = cluster.Replicas
-
- cr.ClusterName = cName
- results = append(results, &cr)
- }
-
- return results, nil
- }
|