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.

sync_status.go 3.7 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package cloudbrainTask
  2. import (
  3. "net/http"
  4. "code.gitea.io/gitea/modules/grampus"
  5. "code.gitea.io/gitea/modules/timeutil"
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/cloudbrain"
  8. "code.gitea.io/gitea/modules/httplib"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/notification"
  11. "code.gitea.io/gitea/modules/setting"
  12. )
  13. var noteBookOKMap = make(map[int64]int, 20)
  14. //if a task notebook url can get two times, the notebook can browser.
  15. const successfulCount = 3
  16. func SyncCloudBrainOneStatus(task *models.Cloudbrain) (*models.Cloudbrain, error) {
  17. jobResult, err := cloudbrain.GetJob(task.JobID)
  18. if err != nil {
  19. log.Error("GetJob failed:", err)
  20. return task, err
  21. }
  22. result, err := models.ConvertToJobResultPayload(jobResult.Payload)
  23. if err != nil {
  24. log.Error("ConvertToJobResultPayload failed:", err)
  25. return task, err
  26. }
  27. oldStatus := task.Status
  28. if result.JobStatus.State != string(models.JobWaiting) && result.JobStatus.State != string(models.JobFailed) {
  29. taskRoles := result.TaskRoles
  30. taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{}))
  31. task.ContainerIp = taskRes.TaskStatuses[0].ContainerIP
  32. task.ContainerID = taskRes.TaskStatuses[0].ContainerID
  33. }
  34. if (result.JobStatus.State != string(models.JobWaiting) && result.JobStatus.State != string(models.JobRunning)) ||
  35. task.Status == string(models.JobRunning) || (result.JobStatus.State == string(models.JobRunning) && isNoteBookReady(task)) {
  36. models.ParseAndSetDurationFromCloudBrainOne(result, task)
  37. task.Status = result.JobStatus.State
  38. if oldStatus != task.Status {
  39. notification.NotifyChangeCloudbrainStatus(task, oldStatus)
  40. }
  41. err = models.UpdateJob(task)
  42. if err != nil {
  43. log.Error("UpdateJob failed:", err)
  44. return task, err
  45. }
  46. }
  47. return task, nil
  48. }
  49. func SyncGrampusNotebookStatus(job *models.Cloudbrain) (*models.Cloudbrain, error) {
  50. result, err := grampus.GetNotebookJob(job.JobID)
  51. if err != nil {
  52. log.Error("GetJob(%s) failed:%v", job.JobName, err)
  53. return job, err
  54. }
  55. if job.StartTime == 0 && result.JobInfo.StartedAt > 0 {
  56. job.StartTime = timeutil.TimeStamp(result.JobInfo.StartedAt)
  57. }
  58. oldStatus := job.Status
  59. job.Status = grampus.TransTrainJobStatus(result.JobInfo.Status)
  60. job.Duration = result.JobInfo.RunSec
  61. job.TrainJobDuration = models.ConvertDurationToStr(job.Duration)
  62. if job.EndTime == 0 && models.IsTrainJobTerminal(job.Status) && job.StartTime > 0 {
  63. job.EndTime = job.StartTime.Add(job.Duration)
  64. }
  65. job.CorrectCreateUnix()
  66. if len(job.AiCenter) == 0 {
  67. if len(result.JobInfo.Tasks) > 0 {
  68. if len(result.JobInfo.Tasks[0].CenterID) > 0 && len(result.JobInfo.Tasks[0].CenterName) > 0 {
  69. job.AiCenter = result.JobInfo.Tasks[0].CenterID[0] + "+" + result.JobInfo.Tasks[0].CenterName[0]
  70. }
  71. }
  72. }
  73. if job.Status != models.GrampusStatusWaiting {
  74. if oldStatus != job.Status {
  75. notification.NotifyChangeCloudbrainStatus(job, oldStatus)
  76. }
  77. job.TrainUrl = result.JobInfo.Tasks[0].CodeUrl
  78. job.DataUrl = result.JobInfo.Tasks[0].DataUrl
  79. err = models.UpdateJob(job)
  80. if err != nil {
  81. log.Error("UpdateJob failed:", err)
  82. return nil, err
  83. }
  84. }
  85. return job, nil
  86. }
  87. func isNoteBookReady(task *models.Cloudbrain) bool {
  88. if task.JobType != string(models.JobTypeDebug) {
  89. return true
  90. }
  91. noteBookUrl := setting.DebugServerHost + "jpylab_" + task.JobID + "_" + task.SubTaskName
  92. r := httplib.Get(noteBookUrl)
  93. res, err := r.Response()
  94. if err != nil {
  95. return false
  96. }
  97. if res.StatusCode == http.StatusOK {
  98. count := noteBookOKMap[task.ID]
  99. if count < successfulCount-1 {
  100. noteBookOKMap[task.ID] = count + 1
  101. return false
  102. } else {
  103. delete(noteBookOKMap, task.ID)
  104. return true
  105. }
  106. }
  107. return false
  108. }