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.3 kB

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