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  }