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.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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package cloudbrainTask
  2. import (
  3. "net/http"
  4. "strconv"
  5. "code.gitea.io/gitea/models"
  6. "code.gitea.io/gitea/modules/cloudbrain"
  7. "code.gitea.io/gitea/modules/httplib"
  8. "code.gitea.io/gitea/modules/log"
  9. "code.gitea.io/gitea/modules/notification"
  10. "code.gitea.io/gitea/modules/setting"
  11. )
  12. var noteBookOKMap = make(map[int64]int, 20)
  13. var noteBookFailMap = make(map[int64]int, 20)
  14. //if a task notebook url can get successfulCount times, the notebook can browser.
  15. const successfulCount = 3
  16. const maxSuccessfulCount=12
  17. func SyncCloudBrainOneStatus(task *models.Cloudbrain) (*models.Cloudbrain, error) {
  18. jobResult, err := cloudbrain.GetJob(task.JobID)
  19. if err != nil {
  20. log.Error("GetJob failed:", err)
  21. return task, err
  22. }
  23. result, err := models.ConvertToJobResultPayload(jobResult.Payload)
  24. if err != nil {
  25. log.Error("ConvertToJobResultPayload failed:", err)
  26. return task, err
  27. }
  28. oldStatus := task.Status
  29. if result.JobStatus.State != string(models.JobWaiting) && result.JobStatus.State != string(models.JobFailed) {
  30. taskRoles := result.TaskRoles
  31. taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{}))
  32. task.ContainerIp = taskRes.TaskStatuses[0].ContainerIP
  33. task.ContainerID = taskRes.TaskStatuses[0].ContainerID
  34. }
  35. if (result.JobStatus.State != string(models.JobWaiting) && result.JobStatus.State != string(models.JobRunning)) ||
  36. task.Status == string(models.JobRunning) || (result.JobStatus.State == string(models.JobRunning) && isNoteBookReady(task)) {
  37. models.ParseAndSetDurationFromCloudBrainOne(result, task)
  38. task.Status = result.JobStatus.State
  39. if oldStatus != task.Status {
  40. notification.NotifyChangeCloudbrainStatus(task, oldStatus)
  41. }
  42. err = models.UpdateJob(task)
  43. if err != nil {
  44. log.Error("UpdateJob failed:", err)
  45. return task, err
  46. }
  47. }
  48. return task, nil
  49. }
  50. func isNoteBookReady(task *models.Cloudbrain) bool {
  51. if task.JobType != string(models.JobTypeDebug) {
  52. return true
  53. }
  54. noteBookUrl := setting.DebugServerHost + "jpylab_" + task.JobID + "_" + task.SubTaskName
  55. r := httplib.Get(noteBookUrl)
  56. res, err := r.Response()
  57. if err != nil {
  58. return false
  59. }
  60. if res.StatusCode == http.StatusOK {
  61. count := noteBookOKMap[task.ID]
  62. if count < successfulCount-1 || (noteBookFailMap[task.ID]==0 && count < maxSuccessfulCount-1){
  63. noteBookOKMap[task.ID] = count + 1
  64. return false
  65. } else {
  66. log.Info("notebook success count:"+strconv.Itoa(count)+",fail count:"+strconv.Itoa(count))
  67. delete(noteBookOKMap, task.ID)
  68. delete(noteBookFailMap, task.ID)
  69. return true
  70. }
  71. }else{
  72. noteBookFailMap[task.ID]+=1
  73. if noteBookOKMap[task.ID]>0{
  74. noteBookOKMap[task.ID]=0
  75. }
  76. }
  77. return false
  78. }