mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
114 lines
2.8 KiB
Go
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 ""
|
|
}
|