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 2.8 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package cloudbrainTask
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/cloudbrain"
  5. "code.gitea.io/gitea/modules/log"
  6. "code.gitea.io/gitea/modules/notification"
  7. "code.gitea.io/gitea/modules/setting"
  8. "net/http"
  9. "strconv"
  10. )
  11. var noteBookOKMap = make(map[int64]int, 20)
  12. var noteBookFailMap = make(map[int64]int, 20)
  13. //if a task notebook url can get successfulCount times, the notebook can browser.
  14. const successfulCount = 3
  15. const maxSuccessfulCount=10
  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 isNoteBookReady(task *models.Cloudbrain) bool {
  50. if task.JobType != string(models.JobTypeDebug) {
  51. return true
  52. }
  53. noteBookUrl := setting.DebugServerHost + "jpylab_" + task.JobID + "_" + task.SubTaskName
  54. res,err := http.Get(noteBookUrl)
  55. if err != nil {
  56. return false
  57. }
  58. log.Info("notebook success count:"+strconv.Itoa(noteBookOKMap[task.ID])+",fail count:"+strconv.Itoa(noteBookFailMap[task.ID]))
  59. if res.StatusCode == http.StatusOK {
  60. count := noteBookOKMap[task.ID]
  61. if count==0{ //如果是第一次成功,把失败数重置为0
  62. noteBookFailMap[task.ID]=0
  63. }
  64. if count < successfulCount-1 || (noteBookFailMap[task.ID]==0 && count < maxSuccessfulCount-1) {
  65. noteBookOKMap[task.ID] = count + 1
  66. return false
  67. } else {
  68. log.Info("notebook success count:"+strconv.Itoa(count)+",fail count:"+strconv.Itoa(noteBookFailMap[task.ID]))
  69. delete(noteBookOKMap, task.ID)
  70. delete(noteBookFailMap, task.ID)
  71. return true
  72. }
  73. }else{
  74. noteBookFailMap[task.ID]+=1
  75. }
  76. return false
  77. }