8000 feat(ui,api,cdsctl): Add filter to queue/workflows on status (#3293) · ovh/cds@569b555 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 569b555

Browse files
bnjjj
authored andcommitted
feat(ui,api,cdsctl): Add filter to queue/workflows on status (#3293)
1 parent 84bc027 commit 569b555

File tree

12 files changed

+290
-105
lines changed

12 files changed

+290
-105
lines changed

cli/cdsctl/monitoring.go

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type Termui struct {
5757
statusHatcheriesWorkers *cli.ScrollableList
5858
status *cli.ScrollableList
5959
currentURL string
60+
queueTabSelected int
6061
}
6162

6263
// Constants for each view of cds ui
@@ -88,6 +89,12 @@ func (ui *Termui) init() {
8889
termui.Handle("/sys/kbd/<up>", func(e termui.Event) {
8990
ui.monitoringCursorUp()
9091
})
92+
termui.Handle("/sys/kbd/<left>", func(e termui.Event) {
93+
ui.monitoringCursorLeft()
94+
})
95+
termui.Handle("/sys/kbd/<right>", func(e termui.Event) {
96+
ui.monitoringCursorRight()
97+
})
9198

9299
termui.Handle("/sys/kbd/<enter>", func(e termui.Event) {
93100
if ui.currentURL != "" {
@@ -240,6 +247,28 @@ func (ui *Termui) monitoringCursorUp() {
240247
}
241248
}
242249

250+
func (ui *Termui) monitoringCursorLeft() {
251+
switch ui.selected {
252+
case QueueSelected:
253+
if 0 < ui.queueTabSelected {
254+
ui.queueTabSelected--
255+
} else {
256+
ui.queueTabSelected = 2
257+
}
258+
}
259+
}
260+
261+
func (ui *Termui) monitoringCursorRight() {
262+
switch ui.selected {
263+
case QueueSelected:
264+
if ui.queueTabSelected < 2 {
265+
ui.queueTabSelected++
266+
} else {
267+
ui.queueTabSelected = 0
268+
}
269+
}
270+
}
271+
243272
func (ui *Termui) monitoringColorSelected() {
244273
ui.queue.BorderFg = termui.ColorDefault
245274
ui.statusHatcheriesWorkers.BorderFg = termui.ColorDefault
@@ -375,8 +404,18 @@ func (ui *Termui) computeStatusWorkerModels(workers []sdk.Worker) string {
375404
}
376405

377406
func (ui *Termui) updateQueue(baseURL string) string {
407+
var status []sdk.Status
408+
switch ui.queueTabSele 9E88 cted {
409+
case 0:
410+
status = []sdk.Status{sdk.StatusWaiting}
411+
case 1:
412+
status = []sdk.Status{sdk.StatusBuilding}
413+
case 2:
414+
status = []sdk.Status{sdk.StatusWaiting, sdk.StatusBuilding}
415+
}
416+
378417
start := time.Now()
379-
wJobs, errw := client.QueueWorkflowNodeJobRun()
418+
wJobs, errw := client.QueueWorkflowNodeJobRun(status...)
380419
if errw != nil {
381420
ui.msg = fmt.Sprintf("[%s](bg-red)", errw.Error())
382421
return ""
@@ -394,13 +433,13 @@ func (ui *Termui) updateQueue(baseURL string) string {
394433
var maxQueued time.Duration
395434

396435
items := []string{
397-
fmt.Sprintf("[ %s %s%s %s ➤ %s ➤ %s ➤ %s](fg-cyan,bg-default)", pad("since", 9), pad("booked", 27), pad("run", 7), pad("project/workflow", 30), pad("node", 20), pad("triggered by", 17), "requirements"),
436+
fmt.Sprintf("[ _ %s %s%s %s ➤ %s ➤ %s ➤ %s](fg-cyan,bg-default)", pad("since", 9), pad("by", 27), pad("run", 7), pad("project/workflow", 30), pad("node", 20), pad("triggered by", 17), "requirements"),
398437
}
399438

400439
var idx int
401440
var item string
402441
for _, job := range pbJobs {
403-
item, maxQueued = ui.updateQueueJob(idx, maxQueued, job.ID, false, job.Parameters, job.Job.Action.Requirements, job.Queued, job.BookedBy, baseURL)
442+
item, maxQueued = ui.updateQueueJob(idx, maxQueued, job.ID, false, job.Parameters, job.Job, job.Queued, job.BookedBy, baseURL, job.Status)
404443
items = append(items, item)
405444
idx++
406445
}
@@ -414,20 +453,20 @@ func (ui *Termui) updateQueue(baseURL string) string {
414453
msg = fmt.Sprintf("[count queue wf %s](fg-cyan,bg-default) | %s", sdk.Round(elapsed, time.Millisecond).String(), msg)
415454

416455
for _, job := range wJobs {
417-
item, maxQueued = ui.updateQueueJob(idx, maxQueued, job.ID, true, job.Parameters, job.Job.Action.Requirements, job.Queued, job.BookedBy, baseURL)
456+
item, maxQueued = ui.updateQueueJob(idx, maxQueued, job.ID, true, job.Parameters, job.Job, job.Queued, job.BookedBy, baseURL, job.Status)
418457
items = append(items, item)
419458
idx++
420459
}
421460
ui.queue.Items = items
422461

423-
t := fmt.Sprintf("Queue:%d - Max Waiting:%s ", nWJobs.Count+int64(len(pbJobs)), sdk.Round(maxQueued, time.Second).String())
462+
t := fmt.Sprintf("Queue(%s):%d - Max Waiting:%s ", fmt.Sprintf("%v", status), nWJobs.Count+int64(len(pbJobs)), sdk.Round(maxQueued, time.Second).String())
424463
ui.queue.BorderLabel = t
425464
return msg
426465
}
427466

428-
func (ui *Termui) updateQueueJob(idx int, maxQueued time.Duration, id int64, isWJob bool, parameters []sdk.Parameter, requirements []sdk.Requirement, queued time.Time, bookedBy sdk.Hatchery, baseURL string) (string, time.Duration) {
467+
func (ui *Termui) updateQueueJob(idx int, maxQueued time.Duration, id int64, isWJob bool, parameters []sdk.Parameter, executedJob sdk.ExecutedJob, queued time.Time, bookedBy sdk.Hatchery, baseURL, status string) (string, time.Duration) {
429468
req := ""
430-
for _, r := range requirements {
469+
for _, r := range executedJob.Job.Action.Requirements {
431470
req += fmt.Sprintf("%s:%s ", r.Type, r.Value)
432471
}
433472
prj := getVarsInPbj("cds.project", parameters)
@@ -470,7 +509,9 @@ func (ui *Termui) updateQueueJob(idx int, maxQueued time.Duration, id int64, isW
470509
fgColor = "fg-magenta"
471510
}
472511

473-
if bookedBy.ID != 0 {
512+
if status == sdk.StatusBuilding.String() {
513+
row[1] = pad(fmt.Sprintf(" %s.%s ", executedJob.WorkerName, executedJob.WorkerID), 27)
514+
} else if bookedBy.ID != 0 {
474515
row[1] = pad(fmt.Sprintf(" %s.%d ", bookedBy.Name, bookedBy.ID), 27)
475516
} else {
476517
row[1] = pad("", 27)
@@ -479,7 +520,9 @@ func (ui *Termui) updateQueueJob(idx int, maxQueued time.Duration, id int64, isW
479520
row[4] = fmt.Sprintf("➤ %s", pad(triggeredBy, 17))
480521
row[5] = fmt.Sprintf("➤ %s", req)
481522

482-
item := fmt.Sprintf(" [%s](%s)[%s %s %s %s %s](%s,bg-default)", row[0], c, row[1], row[2], row[3], row[4], row[5], fgColor)
523+
_, color := statusShort(status)
524+
color = strings.Replace(color, "fg", "bg", 1)
525+
item := fmt.Sprintf(" [ ](%s)[ ](bg-default)[%s](%s)[%s %s %s %s %s](%s,bg-default)", color, row[0], c, row[1], row[2], row[3], row[4], row[5], fgColor)
483526

484527
if idx == ui.queue.Cursor-1 {
485528
ui.currentURL = currentURL

engine/api/router_util.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ func FormString(r *http.Request, s string) string {
106106
return r.FormValue(s)
107107
}
108108

109+
// QueryStrings returns the list of values for given query param key or nil if key no values.
110+
func QueryStrings(r *http.Request, key string) ([]string, error) {
111+
if err := r.ParseForm(); err != nil {
112+
return nil, err
113+
}
114+
if v, ok := r.Form[key]; ok {
115+
return v, nil
116+
}
117+
return nil, nil
118+
}
119+
109120
// FormInt return a int from query params
110121
func FormInt(r *http.Request, s string) (int, error) {
111122
stringValue := FormString(r, s)

engine/api/workflow_queue.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,15 @@ func (api *API) countWorkflowJobQueueHandler() service.Handler {
701701
func (api *API) getWorkflowJobQueueHandler() service.Handler {
702702
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
703703
since, until, limit := getSinceUntilLimitHeader(ctx, w, r)
704+
705+
status, err := QueryStrings(r, "status")
706+
if err != nil {
707+
return sdk.NewError(sdk.ErrWrongRequest, err)
708+
}
709+
if !sdk.StatusValidate(status...) {
710+
return sdk.NewError(sdk.ErrWrongRequest, fmt.Errorf("Invalid given status"))
711+
}
712+
704713
groupsID := make([]int64, len(getUser(ctx).Groups))
705714
usr := getUser(ctx)
706715
for i, g := range usr.Groups {
@@ -714,7 +723,7 @@ func (api *API) getWorkflowJobQueueHandler() service.Handler {
714723
usr = nil
715724
}
716725

717-
jobs, err := workflow.LoadNodeJobRunQueue(api.mustDB(), api.Cache, permissions, groupsID, usr, &since, &until, &limit)
726+
jobs, err := workflow.LoadNodeJobRunQueue(api.mustDB(), api.Cache, permissions, groupsID, usr, &since, &until, &limit, status...)
718727
if err != nil {
719728
return sdk.WrapError(err, "getWorkflowJobQueueHandler> Unable to load queue")
720729
}

sdk/build.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,12 @@ func StatusFromString(in string) Status {
136136
return StatusDisabled
137137
case StatusSkipped.String():
138138
return StatusSkipped
139+
case StatusStopped.String():
140+
return StatusStopped
141+
case StatusWorkerPending.String():
142+
return StatusWorkerPending
143+
case StatusWorkerRegistering.String():
144+
return StatusWorkerRegistering
139145
default:
140146
return StatusUnknown
141147
}
@@ -179,3 +185,13 @@ func StatusIsTerminated(status string) bool {
179185
return true
180186
}
181187
}
188+
189+
// StatusValidate returns if given strings are valid status.
190+
func StatusValidate(status ...string) bool {
191+
for _, s := range status {
192+
if StatusFromString(s) == StatusUnknown {
193+
return false
194+
}
195+
}
196+
return true
197+
}

sdk/cdsclient/client_queue.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"io/ioutil"
1010
"mime/multipart"
1111
"net/http"
12+
"net/url"
1213
"os"
1314
"path/filepath"
1415
"runtime"
@@ -146,9 +147,19 @@ func (c *client) QueuePolling(ctx context.Context, jobs chan<- sdk.WorkflowNodeJ
146147
}
147148
}
148149

149-
func (c *client) QueueWorkflowNodeJobRun() ([]sdk.WorkflowNodeJobRun, error) {
150+
func (c *client) QueueWorkflowNodeJobRun(status ...sdk.Status) ([]sdk.WorkflowNodeJobRun, error) {
150151
wJobs := []sdk.WorkflowNodeJobRun{}
151-
if _, err := c.GetJSON("/queue/workflows", &wJobs); err != nil {
152+
153+
url, _ := url.Parse("/queue/workflows")
154+
if len(status) > 0 {
155+
q := url.Query()
156+
for _, s := range status {
157+
q.Add("status", s.String())
158+
}
159+
url.RawQuery = q.Encode()
160+
}
161+
162+
if _, err := c.GetJSON(url.String(), &wJobs); err != nil {
152163
return nil, err
153164
}
154165
return wJobs, nil

sdk/cdsclient/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ type ProjectVariablesClient interface {
197197

198198
// QueueClient exposes queue related functions
199199
type QueueClient interface {
200-
QueueWorkflowNodeJobRun() ([]sdk.WorkflowNodeJobRun, error)
200+
QueueWorkflowNodeJobRun(status ...sdk.Status) ([]sdk.WorkflowNodeJobRun, error)
201201
QueueCountWorkflowNodeJobRun(since *time.Time, until *time.Time) (sdk.WorkflowNodeJobRunCount, error)
202202
QueuePipelineBuildJob() ([]sdk.PipelineBuildJob, error)
203203
QueuePolling(context.Context, chan<- sdk.WorkflowNodeJobRun, chan<- sdk.PipelineBuildJob, chan<- error, time.Duration, int, *int64) error

ui/src/app/model/job.model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export class Job {
88
last_modified: string;
99
step_status: Array<StepStatus>;
1010
warnings: Array<ActionWarning>;
11+
worker_name: string;
12+
worker_id: string;
1113

1214
// UI parameter
1315
hasChanged: boolean;

0 commit comments

Comments
 (0)
0