You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

commitvmtasklogic.go 5.6 kB

11 months ago
11 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package core
  2. import (
  3. "context"
  4. "fmt"
  5. clientCore "gitlink.org.cn/JointCloud/pcm-coordinator/client"
  6. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler"
  7. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/schedulers"
  8. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/schedulers/option"
  9. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
  10. "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
  11. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
  12. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
  13. "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
  14. "strconv"
  15. "time"
  16. "github.com/zeromicro/go-zero/core/logx"
  17. )
  18. type CommitVmTaskLogic struct {
  19. logx.Logger
  20. ctx context.Context
  21. svcCtx *svc.ServiceContext
  22. }
  23. func NewCommitVmTaskLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommitVmTaskLogic {
  24. return &CommitVmTaskLogic{
  25. Logger: logx.WithContext(ctx),
  26. ctx: ctx,
  27. svcCtx: svcCtx,
  28. }
  29. }
  30. func (l *CommitVmTaskLogic) CommitVmTask(req *types.CommitVmTaskReq) (resp *types.CommitVmTaskResp, err error) {
  31. // todo: add your logic here and delete this line
  32. resp = &types.CommitVmTaskResp{}
  33. tx := l.svcCtx.DbEngin.Begin()
  34. var adaptersName string
  35. var clusterName string
  36. //Building the main task structure
  37. defer func() {
  38. if p := recover(); p != nil {
  39. tx.Rollback()
  40. logx.Error(p)
  41. } else if tx.Error != nil {
  42. logx.Info("rollback, error", tx.Error)
  43. tx.Rollback()
  44. } else {
  45. tx = tx.Commit()
  46. logx.Info("commit success")
  47. }
  48. }()
  49. //TODO adapter
  50. adapterId, _ := strconv.ParseUint(req.AdapterIds[0], 10, 64)
  51. taskVm := models.TaskVm{}
  52. //TODO 执行策略返回集群跟 Replica
  53. opt := &option.VmOption{}
  54. utils.Convert(&req, &opt)
  55. // 2、Initialize scheduler
  56. vmSchdl, _ := schedulers.NewVmScheduler(l.ctx, "", l.svcCtx.Scheduler, opt, l.svcCtx.DbEngin, l.svcCtx.PromClient)
  57. if err != nil {
  58. return nil, err
  59. }
  60. // 3、Return scheduling results
  61. results, err := l.svcCtx.Scheduler.AssignAndSchedule(vmSchdl, scheduler.JOINT_CLOUD_MODE)
  62. if err != nil {
  63. logx.Errorf("AssignAndSchedule() => execution error: %v", err)
  64. return nil, err
  65. }
  66. rs := (results).([]*schedulers.VmResult)
  67. var synergyStatus int64
  68. if len(rs) > 1 {
  69. synergyStatus = 1
  70. }
  71. var strategy int64
  72. sqlStr := `select t_dict_item.item_value
  73. from t_dict
  74. left join t_dict_item on t_dict.id = t_dict_item.dict_id
  75. where item_text = ?
  76. and t_dict.dict_code = 'schedule_Strategy'`
  77. //查询调度策略
  78. err = tx.Raw(sqlStr, req.Strategy).Scan(&strategy).Error
  79. taskModel := models.Task{
  80. Id: utils.GenSnowflakeID(),
  81. Status: constants.Saved,
  82. Name: req.Name,
  83. CommitTime: time.Now(),
  84. Description: "vm task",
  85. AdapterTypeDict: "0",
  86. SynergyStatus: synergyStatus,
  87. Strategy: strategy,
  88. }
  89. //var taskVms models.TaskVm
  90. var VmObject types.TaskVm
  91. for _, r := range rs {
  92. for _, clusterId := range req.ClusterIds {
  93. if r.Replica > 0 && r.ClusterId == clusterId {
  94. fmt.Println("", clusterId)
  95. sql := `SELECT vi.image_id as image,vf.flavor_id as flavor,vn.network_id as uuid,vi.cluster_name as platform FROM
  96. vm_flavor vf
  97. LEFT JOIN vm_image vi ON vf.cluster_id = vi.cluster_id
  98. LEFT JOIN vm_network vn ON vf.cluster_id = vn.cluster_id
  99. WHERE
  100. vi.cluster_id = ?
  101. AND vf.public_flavor_id = ?
  102. AND vi.public_image_id = ?
  103. AND vn.public_network_id = ?`
  104. txVm := l.svcCtx.DbEngin.Raw(sql, clusterId, req.FlavorRef, req.ImageRef, req.Uuid).Scan(&VmObject)
  105. if txVm.Error != nil {
  106. logx.Error(err)
  107. return nil, txVm.Error
  108. }
  109. /* if err2 != nil {
  110. logx.Errorf("CommitGeneralTask() => sql execution error: %v", err)
  111. //return errors.Errorf("the cluster does not match the drive resources. Check the data"), nil
  112. }*/
  113. taskVm.Name = req.Name
  114. taskVm.TaskId = taskModel.Id
  115. taskVm.Status = "Saved"
  116. taskVm.StartTime = time.Now().String()
  117. taskVm.MinCount = req.MinCount
  118. taskVm.ImageRef = VmObject.Image
  119. taskVm.FlavorRef = VmObject.Flavor
  120. taskVm.Uuid = VmObject.Uuid
  121. taskVm.Platform = VmObject.Platform
  122. taskVm.AdapterId = int64(adapterId)
  123. l.svcCtx.DbEngin.Raw("select name from t_adapter where id= ?", int64(adapterId)).Scan(&adaptersName)
  124. taskVm.AdapterName = adaptersName
  125. l.svcCtx.DbEngin.Raw("select name from t_cluster where id= ?", r.ClusterId).Scan(&clusterName)
  126. taskVm.ClusterName = clusterName
  127. taskVm.ClusterId, err = strconv.ParseInt(clusterId, 10, 64)
  128. taskVm.VmName = req.VmName
  129. taskVm.Replicas = req.Replicas
  130. if err != nil {
  131. fmt.Println("Error converting string to int64:", err)
  132. return
  133. }
  134. tx = l.svcCtx.DbEngin.Create(&taskVm)
  135. if tx.Error != nil {
  136. return nil, tx.Error
  137. }
  138. }
  139. }
  140. }
  141. adapterName := ""
  142. tx.Table("t_adapter").Select("name").Where("id=?", adapterId).Find(&adapterName)
  143. noticeInfo := clientCore.NoticeInfo{
  144. AdapterId: int64(adapterId),
  145. AdapterName: adapterName,
  146. NoticeType: "create",
  147. TaskName: req.Name,
  148. Incident: "任务创建中",
  149. CreatedTime: time.Now(),
  150. }
  151. // Save task data to database
  152. tf := l.svcCtx.DbEngin.Create(&taskModel)
  153. if tf.Error != nil {
  154. return nil, tf.Error
  155. }
  156. result := l.svcCtx.DbEngin.Table("task_vm").Create(&taskVm)
  157. result = l.svcCtx.DbEngin.Table("t_notice").Create(&noticeInfo)
  158. if result.Error != nil {
  159. logx.Errorf("Task creation failure, err: %v", result.Error)
  160. }
  161. resp.Code = 200
  162. resp.Msg = "Success"
  163. return resp, nil
  164. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.