|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- package schedule
-
- import (
- "context"
- "errors"
- "fmt"
- "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/strategy"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/storeLink"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
- "slices"
- "strings"
-
- "github.com/zeromicro/go-zero/core/logx"
- )
-
- const (
- TRAINNING_TASK_REPLICA = 1
- )
-
- type ScheduleCreateTaskLogic struct {
- logx.Logger
- ctx context.Context
- svcCtx *svc.ServiceContext
- queryResource *QueryResourcesLogic
- }
-
- func NewScheduleCreateTaskLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ScheduleCreateTaskLogic {
- return &ScheduleCreateTaskLogic{
- Logger: logx.WithContext(ctx),
- ctx: ctx,
- svcCtx: svcCtx,
- queryResource: NewQueryResourcesLogic(ctx, svcCtx),
- }
- }
-
- func (l *ScheduleCreateTaskLogic) ScheduleCreateTask(req *types.CreateTaskReq) (resp *types.CreateTaskResp, err error) {
- resp = &types.CreateTaskResp{}
- if req.JobResources.ScheduleStrategy == "" {
- return nil, fmt.Errorf("must specify ScheduleStrategy")
- }
-
- if len(req.JobResources.Clusters) == 0 {
- return nil, fmt.Errorf("must specify at least one cluster")
- }
-
- var clusters []string
- if len(req.JobResources.Clusters) == 1 {
- clusters = append(clusters, req.JobResources.Clusters[0].ClusterID)
- schedatas, err := l.generateScheduleResult(req.DataDistributes, clusters)
- if err != nil {
- return nil, err
- }
- taskId, err := l.createTask("SCHEDULE_TASK_"+utils.RandomString(10), req.JobResources.ScheduleStrategy, req.JobResources.Clusters)
- if err != nil {
- return nil, err
- }
- resp.ScheduleDatas = schedatas
- resp.TaskID = taskId
- return resp, nil
-
- } else {
- clusterInfos, err := getClusterInfosByStrategy(&req.JobResources)
- if err != nil {
- return nil, err
- }
-
- for _, info := range clusterInfos {
- clusters = append(clusters, info.ClusterID)
- }
-
- schedatas, err := l.generateScheduleResult(req.DataDistributes, clusters)
- if err != nil {
- return nil, err
- }
- taskId, err := l.createTask("SCHEDULE_TASK_"+utils.RandomString(10), req.JobResources.ScheduleStrategy, clusterInfos)
- if err != nil {
- return nil, err
- }
- resp.ScheduleDatas = schedatas
- resp.TaskID = taskId
- return resp, nil
- }
- }
-
- func getClusterInfosByStrategy(resources *types.JobResources) ([]*types.JobClusterInfo, error) {
- var clusterInfos []*types.JobClusterInfo
- switch resources.ScheduleStrategy {
- case strategy.LEASTLOADFIRST:
- _ = strategy.NewLeastLoadFirst(TRAINNING_TASK_REPLICA, nil)
- }
-
- return clusterInfos, nil
- }
-
- func (l *ScheduleCreateTaskLogic) createTask(taskName string, strategyName string, jobClusterInfo []*types.JobClusterInfo) (int64, error) {
- var synergyStatus int64
- if len(jobClusterInfo) > 1 {
- synergyStatus = 1
- }
- strategyCode, err := l.svcCtx.Scheduler.AiStorages.GetStrategyCode(strategyName)
- if err != nil {
- return 0, err
- }
-
- taskId, err := l.svcCtx.Scheduler.AiStorages.SaveTask(taskName, strategyCode, synergyStatus, "10")
- if err != nil {
- return 0, err
- }
-
- adapterName, err := l.svcCtx.Scheduler.AiStorages.GetAdapterNameById(ADAPTERID)
- if err != nil {
- return 0, err
- }
-
- for _, i := range jobClusterInfo {
- clusterName, _ := l.svcCtx.Scheduler.AiStorages.GetClusterNameById(i.ClusterID)
-
- opt := &option.AiOption{}
-
- err := l.svcCtx.Scheduler.AiStorages.SaveAiTask(taskId, opt, adapterName, i.ClusterID, clusterName, "", constants.Saved, "")
- if err != nil {
- return 0, errors.New("database add failed: " + err.Error())
- }
- }
-
- return taskId, nil
- }
-
- func (l *ScheduleCreateTaskLogic) generateScheduleResult(distribute types.DataDistribute, clusters []string) ([]*types.ScheduleData, error) {
- var schedatas []*types.ScheduleData
-
- for _, d := range distribute.Dataset {
- data := &types.ScheduleData{
- DataType: "dataset",
- PackageID: d.PackageID,
- ClusterIDs: make([]string, 0),
- }
- for _, cluster := range clusters {
- if !slices.Contains(d.Clusters, cluster) {
- data.ClusterIDs = append(data.ClusterIDs, cluster)
- } else {
- continue
- }
- }
- if len(data.ClusterIDs) != 0 {
- schedatas = append(schedatas, data)
- }
- }
-
- for _, d := range distribute.Code {
- data := &types.ScheduleData{
- DataType: "code",
- PackageID: d.PackageID,
- ClusterIDs: make([]string, 0),
- }
- for _, cluster := range clusters {
- if !slices.Contains(d.Clusters, cluster) {
- data.ClusterIDs = append(data.ClusterIDs, cluster)
- } else {
- continue
- }
- }
- if len(data.ClusterIDs) != 0 {
- schedatas = append(schedatas, data)
- }
- }
-
- for _, d := range distribute.Image {
- data := &types.ScheduleData{
- DataType: "image",
- PackageID: d.PackageID,
- ClusterIDs: make([]string, 0),
- }
- for _, cluster := range clusters {
- if !slices.Contains(d.Clusters, cluster) {
- data.ClusterIDs = append(data.ClusterIDs, cluster)
- } else {
- continue
- }
- }
- if len(data.ClusterIDs) != 0 {
- schedatas = append(schedatas, data)
- }
- }
-
- for _, d := range distribute.Model {
- data := &types.ScheduleData{
- DataType: "model",
- PackageID: d.PackageID,
- ClusterIDs: make([]string, 0),
- }
- for _, cluster := range clusters {
- if !slices.Contains(d.Clusters, cluster) {
- data.ClusterIDs = append(data.ClusterIDs, cluster)
- } else {
- continue
- }
- }
- if len(data.ClusterIDs) != 0 {
- schedatas = append(schedatas, data)
- }
- }
-
- if len(schedatas) != 0 {
- err := l.updateStorageType(&schedatas)
- if err != nil {
- return nil, err
- }
- }
-
- return schedatas, nil
- }
-
- func (l *ScheduleCreateTaskLogic) updateStorageType(schedatas *[]*types.ScheduleData) error {
-
- for _, s := range *schedatas {
- var storageType string
- var sTypes []string
- for _, id := range s.ClusterIDs {
- cluster, err := l.svcCtx.Scheduler.AiStorages.GetClustersById(id)
- if err != nil {
- return err
- }
- stype, ok := storeLink.StorageTypeMap[strings.Title(cluster.Name)]
- if ok {
- sTypes = append(sTypes, stype)
- }
- }
- sTypes = common.Unique(sTypes)
- for _, st := range sTypes {
- storageType += st + storeLink.COMMA
- }
- storageType = strings.TrimSuffix(storageType, storeLink.COMMA)
- s.StorageType = storageType
- }
-
- return nil
- }
|