|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- // Copyright 2016 The Gogs Authors. All rights reserved.
- // Copyright 2018 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- package repo
-
- import (
- "net/http"
- "sort"
- "time"
-
- "code.gitea.io/gitea/modules/log"
-
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/cloudbrain"
- "code.gitea.io/gitea/modules/context"
- )
-
- // cloudbrain get job task by jobid
- func GetCloudbrainTask(ctx *context.APIContext) {
- // swagger:operation GET /repos/{owner}/{repo}/cloudbrain/{jobid} cloudbrain jobTask
- // ---
- // summary: Get a single task
- // produces:
- // - application/json
- // parameters:
- // - name: owner
- // in: path
- // description: owner of the repo
- // type: string
- // required: true
- // - name: repo
- // in: path
- // description: name of the repo
- // type: string
- // required: true
- // - name: jobid
- // in: path
- // description: id of cloudbrain jobid
- // type: string
- // required: true
- // responses:
- // "200":
-
- // "$ref": "#/responses/Label"
-
- var (
- err error
- )
-
- // jobName := ctx.Params(":jobname")
- // job, err := models.GetCloudbrainByName(jobName)
- jobID := ctx.Params(":jobid")
- repoID := ctx.Repo.Repository.ID
- job, err := models.GetRepoCloudBrainByJobID(repoID, jobID)
- if err != nil {
- ctx.Data["error"] = err.Error()
- }
- jobResult, err := cloudbrain.GetJob(job.JobID)
- if err != nil {
- ctx.NotFound(err)
- return
- }
- result, err := models.ConvertToJobResultPayload(jobResult.Payload)
- if err != nil {
- ctx.NotFound(err)
- return
- }
-
- job.Status = result.JobStatus.State
- if result.JobStatus.State != string(models.JobWaiting) && result.JobStatus.State != string(models.JobFailed) {
- taskRoles := result.TaskRoles
- taskRes, _ := models.ConvertToTaskPod(taskRoles[cloudbrain.SubTaskName].(map[string]interface{}))
-
- job.ContainerIp = taskRes.TaskStatuses[0].ContainerIP
- job.ContainerID = taskRes.TaskStatuses[0].ContainerID
- job.Status = taskRes.TaskStatuses[0].State
- }
-
- if result.JobStatus.State != string(models.JobWaiting) {
- err = models.UpdateJob(job)
- if err != nil {
- log.Error("UpdateJob failed:", err)
- }
- }
-
- ctx.JSON(http.StatusOK, map[string]interface{}{
- "JobID": result.Config.JobID,
- "JobName": result.Config.JobName,
- "JobStatus": result.JobStatus.State,
- "SubState": result.JobStatus.SubState,
- "CreatedTime": time.Unix(result.JobStatus.CreatedTime/1000, 0).Format("2006-01-02 15:04:05"),
- "CompletedTime": time.Unix(result.JobStatus.CompletedTime/1000, 0).Format("2006-01-02 15:04:05"),
- })
-
- }
-
- func CloudbrainGetLog(ctx *context.Context) {
- jobName := ctx.Params(":jobname")
- job, err := models.GetCloudbrainByName(jobName)
- if err != nil {
- log.Error("GetCloudbrainByJobName failed: %v", err, ctx.Data["MsgID"])
- ctx.ServerError(err.Error(), err)
- return
- }
-
- var hits []models.Hits
- result, err := cloudbrain.GetJobLog(job.JobID)
- if err != nil {
- log.Error("GetJobLog failed: %v", err, ctx.Data["MsgID"])
- ctx.ServerError(err.Error(), err)
- return
- }
- hits = result.Hits.Hits
-
- //if the size equal page_size, then take the scroll_id to get all log and delete the scroll_id(the num of scroll_id is limited)
- if len(result.Hits.Hits) >= cloudbrain.LogPageSize {
- for {
- resultNext, err := cloudbrain.GetJobAllLog(result.ScrollID)
- if err != nil {
- log.Error("GetJobAllLog failed: %v", err, ctx.Data["MsgID"])
- } else {
- for _, hit := range resultNext.Hits.Hits {
- hits = append(hits, hit)
- }
- }
-
- if len(resultNext.Hits.Hits) < cloudbrain.LogPageSize {
- log.Info("get all log already")
- break
- }
- }
- }
-
- cloudbrain.DeleteJobLogToken(result.ScrollID)
-
- sort.Slice(hits, func(i, j int) bool {
- return hits[i].Sort[0] < hits[j].Sort[0]
- })
-
- var content string
- for _, log := range hits {
- content += log.Source.Message + "\n"
- }
-
- ctx.JSON(http.StatusOK, map[string]interface{}{
- "JobName": jobName,
- "Content": content,
- })
-
- return
- }
|