github.com/wtfutil/wtf@v0.43.0/modules/cds/queue/display.go (about) 1 package cdsqueue 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 8 "github.com/ovh/cds/sdk" 9 "github.com/ovh/cds/sdk/cdsclient" 10 ) 11 12 func (widget *Widget) display() { 13 widget.TextWidget.Redraw(widget.content) 14 } 15 16 func (widget *Widget) content() (string, string, bool) { 17 if len(widget.View.GetHighlights()) > 0 { 18 widget.View.ScrollToHighlight() 19 } else { 20 widget.View.ScrollToBeginning() 21 } 22 23 widget.Items = make([]sdk.WorkflowNodeJobRun, 0) 24 filter := widget.currentFilter() 25 _, _, width, _ := widget.View.GetRect() 26 27 str := widget.settings.PaginationMarker(len(widget.filters), widget.Idx, width) + "\n" 28 str += widget.displayQueue(filter) 29 30 title := fmt.Sprintf("%s - %s", widget.CommonSettings().Title, widget.title(filter)) 31 32 return title, str, false 33 } 34 35 func (widget *Widget) title(filter string) string { 36 return fmt.Sprintf( 37 "[%s]%d - %s[white]", 38 widget.settings.Colors.TextTheme.Title, 39 widget.maxItems, 40 filter, 41 ) 42 } 43 44 func (widget *Widget) displayQueue(filter string) string { 45 runs, _ := widget.client.QueueWorkflowNodeJobRun(cdsclient.Status(filter)) 46 47 widget.SetItemCount(len(runs)) 48 49 if len(runs) == 0 { 50 return " [grey]none[white]\n" 51 } 52 53 var content string 54 for idx, job := range runs { 55 content += fmt.Sprintf(`[grey]["%d"]%s`, 56 idx, widget.generateQueueJobLine(job.Parameters, job.Job, time.Since(job.Queued), job.BookedBy, job.Status)) 57 58 widget.Items = append(widget.Items, job) 59 } 60 61 return content 62 } 63 64 func (widget *Widget) generateQueueJobLine(parameters []sdk.Parameter, executedJob sdk.ExecutedJob, 65 duration time.Duration, bookedBy sdk.BookedBy, status string) string { 66 prj := getVarsInPbj("cds.project", parameters) 67 workflow := getVarsInPbj("cds.workflow", parameters) 68 node := getVarsInPbj("cds.node", parameters) 69 run := getVarsInPbj("cds.run", parameters) 70 triggeredBy := getVarsInPbj("cds.triggered_by.username", parameters) 71 72 row := make([]string, 6) 73 row[0] = pad(sdk.Round(duration, time.Second).String(), 9) 74 row[2] = pad(run, 7) 75 row[3] = pad(prj+"/"+workflow+"/"+node, 40) 76 77 switch { 78 case status == sdk.StatusBuilding: 79 row[1] = pad(fmt.Sprintf(" %s.%s ", executedJob.WorkerName, executedJob.WorkerID), 27) 80 case bookedBy.ID != 0: 81 row[1] = pad(fmt.Sprintf(" %s.%d ", bookedBy.Name, bookedBy.ID), 27) 82 default: 83 row[1] = pad("", 27) 84 } 85 86 row[4] = fmt.Sprintf("⤠%s", pad(triggeredBy, 17)) 87 88 c := "grey" 89 if status == sdk.StatusWaiting { 90 if duration > 120*time.Second { 91 c = "red" 92 } else if duration > 50*time.Second { 93 c = "yellow" 94 } 95 } 96 97 return fmt.Sprintf("[%s]%s [grey]%s %s %s %s\n", c, row[0], row[1], row[2], row[3], row[4]) 98 } 99 100 func pad(t string, size int) string { 101 if len(t) > size { 102 return t[0:size-3] + "..." 103 } 104 return t + strings.Repeat(" ", size-len(t)) 105 } 106 107 func getVarsInPbj(key string, ps []sdk.Parameter) string { 108 for _, p := range ps { 109 if p.Name == key { 110 return p.Value 111 } 112 } 113 return "" 114 }