1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/modules/cds/queue/display.go
Chris Cummer 3521ebf6e8 Rename SigilStr to PaginationMarker
Signed-off-by: Chris Cummer <chriscummer@me.com>
2020-11-26 23:07:30 -08:00

114 lines
2.8 KiB
Go

package cdsqueue
import (
"fmt"
"strings"
"time"
"github.com/ovh/cds/sdk"
)
func (widget *Widget) display() {
widget.TextWidget.Redraw(widget.content)
}
func (widget *Widget) content() (string, string, bool) {
if len(widget.View.GetHighlights()) > 0 {
widget.View.ScrollToHighlight()
} else {
widget.View.ScrollToBeginning()
}
widget.Items = make([]sdk.WorkflowNodeJobRun, 0)
filter := widget.currentFilter()
_, _, width, _ := widget.View.GetRect()
str := widget.settings.common.PaginationMarker(len(widget.filters), widget.Idx, width) + "\n"
str += widget.displayQueue(filter)
title := fmt.Sprintf("%s - %s", widget.CommonSettings().Title, widget.title(filter))
return title, str, false
}
func (widget *Widget) title(filter string) string {
return fmt.Sprintf(
"[%s]%d - %s[white]",
widget.settings.common.Colors.TextTheme.Title,
widget.maxItems,
filter,
)
}
func (widget *Widget) displayQueue(filter string) string {
runs, _ := widget.client.QueueWorkflowNodeJobRun(filter)
widget.SetItemCount(len(runs))
if len(runs) == 0 {
return " [grey]none[white]\n"
}
var content string
for idx, job := range runs {
content += fmt.Sprintf(`[grey]["%d"]%s`,
idx, widget.generateQueueJobLine(job.ID, job.Parameters, job.Job, time.Since(job.Queued), job.BookedBy, job.Status))
widget.Items = append(widget.Items, job)
}
return content
}
func (widget *Widget) generateQueueJobLine(id int64, parameters []sdk.Parameter, executedJob sdk.ExecutedJob,
duration time.Duration, bookedBy sdk.Service, status string) string {
prj := getVarsInPbj("cds.project", parameters)
workflow := getVarsInPbj("cds.workflow", parameters)
node := getVarsInPbj("cds.node", parameters)
run := getVarsInPbj("cds.run", parameters)
triggeredBy := getVarsInPbj("cds.triggered_by.username", parameters)
row := make([]string, 6)
row[0] = pad(sdk.Round(duration, time.Second).String(), 9)
row[2] = pad(run, 7)
row[3] = pad(prj+"/"+workflow+"/"+node, 40)
switch {
case status == sdk.StatusBuilding:
row[1] = pad(fmt.Sprintf(" %s.%s ", executedJob.WorkerName, executedJob.WorkerID), 27)
case bookedBy.ID != 0:
row[1] = pad(fmt.Sprintf(" %s.%d ", bookedBy.Name, bookedBy.ID), 27)
default:
row[1] = pad("", 27)
}
row[4] = fmt.Sprintf("➤ %s", pad(triggeredBy, 17))
c := "grey"
if status == sdk.StatusWaiting {
if duration > 120*time.Second {
c = "red"
} else if duration > 50*time.Second {
c = "yellow"
}
}
return fmt.Sprintf("[%s]%s [grey]%s %s %s %s\n", c, row[0], row[1], row[2], row[3], row[4])
}
func pad(t string, size int) string {
if len(t) > size {
return t[0:size-3] + "..."
}
return t + strings.Repeat(" ", size-len(t))
}
func getVarsInPbj(key string, ps []sdk.Parameter) string {
for _, p := range ps {
if p.Name == key {
return p.Value
}
}
return ""
}