| @@ -162,7 +162,9 @@ func (task *Cloudbrain) ComputeAndSetDuration() { | |||
| if task.StartTime == 0 { | |||
| d = 0 | |||
| } else if task.EndTime == 0 { | |||
| d = time.Now().Unix() - task.StartTime.AsTime().Unix() | |||
| if !task.IsTerminal() { | |||
| d = time.Now().Unix() - task.StartTime.AsTime().Unix() | |||
| } | |||
| } else { | |||
| d = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix() | |||
| } | |||
| @@ -174,6 +176,11 @@ func (task *Cloudbrain) ComputeAndSetDuration() { | |||
| task.TrainJobDuration = ConvertDurationToStr(d) | |||
| } | |||
| func (task *Cloudbrain) IsTerminal() bool { | |||
| status := task.Status | |||
| return status == string(ModelArtsTrainJobCompleted) || status == string(ModelArtsTrainJobFailed) || status == string(ModelArtsTrainJobKilled) || status == string(ModelArtsStopped) || status == string(JobStopped) || status == string(JobFailed) || status == string(JobSucceeded) | |||
| } | |||
| func ConvertDurationToStr(duration int64) string { | |||
| if duration == 0 { | |||
| return DURATION_STR_ZERO | |||
| @@ -193,6 +200,19 @@ func IsCloudBrainOneDebugJobTerminal(status string) bool { | |||
| return status == string(JobStopped) || status == string(JobFailed) || status == string(JobSucceeded) | |||
| } | |||
| func ParseAndSetDurationFromCloudBrainOne(result JobResultPayload, task *Cloudbrain) { | |||
| isActivated := result.JobStatus.CreatedTime > 0 | |||
| if task.StartTime == 0 && isActivated { | |||
| task.StartTime = timeutil.TimeStamp(result.JobStatus.CreatedTime / 1000) | |||
| } | |||
| if task.EndTime == 0 && IsCloudBrainOneDebugJobTerminal(task.Status) && isActivated { | |||
| if result.JobStatus.CompletedTime > 0 { | |||
| task.EndTime = timeutil.TimeStamp(result.JobStatus.CompletedTime / 1000) | |||
| } | |||
| } | |||
| task.ComputeAndSetDuration() | |||
| } | |||
| type CloudbrainInfo struct { | |||
| Cloudbrain `xorm:"extends"` | |||
| User `xorm:"extends"` | |||
| @@ -360,7 +380,7 @@ type JobResultPayload struct { | |||
| AppProgress string `json:"appProgress"` | |||
| AppTrackingURL string `json:"appTrackingUrl"` | |||
| AppLaunchedTime int64 `json:"appLaunchedTime"` | |||
| AppCompletedTime interface{} `json:"appCompletedTime"` | |||
| AppCompletedTime int64 `json:"appCompletedTime"` | |||
| AppExitCode int `json:"appExitCode"` | |||
| AppExitDiagnostics string `json:"appExitDiagnostics"` | |||
| AppExitType interface{} `json:"appExitType"` | |||
| @@ -6,7 +6,6 @@ | |||
| package repo | |||
| import ( | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| "net/http" | |||
| "sort" | |||
| "time" | |||
| @@ -77,20 +76,10 @@ func GetCloudbrainTask(ctx *context.APIContext) { | |||
| job.ContainerIp = taskRes.TaskStatuses[0].ContainerIP | |||
| job.ContainerID = taskRes.TaskStatuses[0].ContainerID | |||
| job.Status = taskRes.TaskStatuses[0].State | |||
| if job.StartTime == 0 && !taskRes.TaskStatuses[0].StartAt.IsZero() { | |||
| job.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) | |||
| } | |||
| } | |||
| if result.JobStatus.State != string(models.JobWaiting) { | |||
| if job.EndTime == 0 && models.IsCloudBrainOneDebugJobTerminal(job.Status) { | |||
| if taskRes.TaskStatuses[0].FinishedAt.IsZero() { | |||
| job.EndTime = timeutil.TimeStampNow() | |||
| } else { | |||
| job.EndTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].FinishedAt.Unix()) | |||
| } | |||
| } | |||
| job.ComputeAndSetDuration() | |||
| models.ParseAndSetDurationFromCloudBrainOne(result, job) | |||
| err = models.UpdateJob(job) | |||
| if err != nil { | |||
| log.Error("UpdateJob failed:", err) | |||
| @@ -376,9 +376,7 @@ func cloudBrainShow(ctx *context.Context, tpName base.TplName) { | |||
| task.Status = taskRes.TaskStatuses[0].State | |||
| task.ContainerID = taskRes.TaskStatuses[0].ContainerID | |||
| task.ContainerIp = taskRes.TaskStatuses[0].ContainerIP | |||
| if task.StartTime == 0 && !taskRes.TaskStatuses[0].StartAt.IsZero() { | |||
| task.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) | |||
| } | |||
| models.ParseAndSetDurationFromCloudBrainOne(jobRes, task) | |||
| err = models.UpdateJob(task) | |||
| if err != nil { | |||
| ctx.Data["error"] = err.Error() | |||
| @@ -964,18 +962,7 @@ func SyncCloudbrainStatus() { | |||
| taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{})) | |||
| task.Status = taskRes.TaskStatuses[0].State | |||
| if task.Status != string(models.JobWaiting) { | |||
| task.Duration = time.Now().Unix() - taskRes.TaskStatuses[0].StartAt.Unix() | |||
| if task.StartTime == 0 && !taskRes.TaskStatuses[0].StartAt.IsZero() { | |||
| task.StartTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].StartAt.Unix()) | |||
| } | |||
| if task.EndTime == 0 && models.IsCloudBrainOneDebugJobTerminal(task.Status) { | |||
| if taskRes.TaskStatuses[0].FinishedAt.IsZero() { | |||
| task.EndTime = timeutil.TimeStampNow() | |||
| } else { | |||
| task.EndTime = timeutil.TimeStamp(taskRes.TaskStatuses[0].FinishedAt.Unix()) | |||
| } | |||
| } | |||
| task.ComputeAndSetDuration() | |||
| models.ParseAndSetDurationFromCloudBrainOne(jobRes, task) | |||
| err = models.UpdateJob(task) | |||
| if err != nil { | |||
| log.Error("UpdateJob(%s) failed:%v", task.JobName, err) | |||
| @@ -1121,18 +1108,17 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) { | |||
| continue | |||
| } | |||
| task.Status = taskRes.TaskStatuses[0].State | |||
| startTime := taskRes.TaskStatuses[0].StartAt.Unix() | |||
| endTime := taskRes.TaskStatuses[0].FinishedAt.Unix() | |||
| log.Info("task startTime = %v endTime= %v ,jobId=%d", startTime, endTime, task.ID) | |||
| if startTime > 0 { | |||
| task.StartTime = timeutil.TimeStamp(startTime) | |||
| } else { | |||
| task.StartTime = task.CreatedUnix | |||
| } | |||
| if endTime > 0 { | |||
| task.EndTime = timeutil.TimeStamp(endTime) | |||
| log.Info("task startTime = %v endTime= %v ,jobId=%d", jobRes.JobStatus.StartTime, jobRes.JobStatus.EndTime, task.ID) | |||
| if jobRes.JobStatus.CreatedTime > 0 { | |||
| task.StartTime = timeutil.TimeStamp(jobRes.JobStatus.CreatedTime / 1000) | |||
| if jobRes.JobStatus.CompletedTime > 0 { | |||
| task.EndTime = timeutil.TimeStamp(jobRes.JobStatus.CompletedTime / 1000) | |||
| } else { | |||
| task.EndTime = task.UpdatedUnix | |||
| } | |||
| } else { | |||
| task.EndTime = task.UpdatedUnix | |||
| task.StartTime = 0 | |||
| task.EndTime = 0 | |||
| } | |||
| if task.EndTime < task.StartTime { | |||
| @@ -1141,7 +1127,8 @@ func handleNoDurationTask(cloudBrains []*models.Cloudbrain) { | |||
| task.StartTime = task.EndTime | |||
| task.EndTime = st | |||
| } | |||
| task.ComputeAndSetDuration() | |||
| task.Duration = task.EndTime.AsTime().Unix() - task.StartTime.AsTime().Unix() | |||
| task.TrainJobDuration = models.ConvertDurationToStr(task.Duration) | |||
| err = models.UpdateJob(task) | |||
| if err != nil { | |||
| log.Error("UpdateJob(%s) failed:%v", task.JobName, err) | |||
| @@ -196,7 +196,13 @@ td, th { | |||
| <span class="accordion-panel-title-content"> | |||
| <span> | |||
| <div class="ac-display-inblock title_text acc-margin-bottom"> | |||
| <span class="cti-mgRight-sm">{{TimeSinceUnix1 .CreatedUnix}}</span> | |||
| <span class="cti-mgRight-sm"> | |||
| {{if not (eq .StartTime 0)}} | |||
| <td>{{TimeSinceUnix1 .StartTime}}</td> | |||
| {{else}} | |||
| <td>{{TimeSinceUnix1 .CreatedUnix}}<td> | |||
| {{end}} | |||
| </span> | |||
| <span class="cti-mgRight-sm">{{$.i18n.Tr "repo.modelarts.status"}}: | |||
| <span id="{{.VersionName}}-status-span"><i id="icon" style="vertical-align: middle;" class="{{.Status}}"></i><span id="text" style="margin-left: 0.4em;font-size: 12px;">{{.Status}}</span></span> | |||
| @@ -252,7 +258,13 @@ td, th { | |||
| <td class="ti-text-form-content"> | |||
| <div class="text-span text-span-w"> | |||
| <span style="font-size: 12px;" class="">{{TimeSinceUnix1 .CreatedUnix}}</span> | |||
| <span style="font-size: 12px;" class=""> | |||
| {{if not (eq .StartTime 0)}} | |||
| {{TimeSinceUnix1 .StartTime}} | |||
| {{else}} | |||
| {{TimeSinceUnix1 .CreatedUnix}} | |||
| {{end}} | |||
| </span> | |||
| </div> | |||
| </td> | |||
| </tr> | |||
| @@ -74,11 +74,19 @@ | |||
| </tr> | |||
| <tr> | |||
| <td> 开始时间 </td> | |||
| <td>{{.JobStatus.StartTime}}</td> | |||
| {{if not (eq $.task.StartTime 0)}} | |||
| <td>{{TimeSinceUnix1 $.task.StartTime}}</td> | |||
| {{else}} | |||
| <td>无<td> | |||
| {{end}} | |||
| </tr> | |||
| <tr> | |||
| <td> 结束时间 </td> | |||
| <td>{{.JobStatus.EndTime}}</td> | |||
| {{if not (eq $.task.EndTime 0)}} | |||
| <td>{{TimeSinceUnix1 $.task.EndTime}}</td> | |||
| {{else}} | |||
| <td>无<td> | |||
| {{end}} | |||
| </tr> | |||
| <tr> | |||
| <td> ExitCode </td> | |||