-
Notifications
You must be signed in to change notification settings - Fork 24
/
workflow_workflow_run_list.go
123 lines (102 loc) · 3.01 KB
/
workflow_workflow_run_list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
// Copyright 2023 The Chainloop Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"fmt"
"time"
"github.com/chainloop-dev/chainloop/app/cli/cmd/options"
"github.com/chainloop-dev/chainloop/app/cli/internal/action"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/spf13/cobra"
)
func newWorkflowWorkflowRunListCmd() *cobra.Command {
var paginationOpts = &options.PaginationOpts{
DefaultLimit: 20,
}
var workflowID, status string
cmd := &cobra.Command{
Use: "list",
Aliases: []string{"ls"},
Short: "List workflow runs",
RunE: func(cmd *cobra.Command, args []string) error {
res, err := action.NewWorkflowRunList(actionOpts).Run(
&action.WorkflowRunListOpts{
WorkflowID: workflowID,
Pagination: &action.PaginationOpts{
Limit: paginationOpts.Limit,
NextCursor: paginationOpts.NextCursor,
},
Status: status,
},
)
if err != nil {
return err
}
if err := encodeOutput(res.Result, workflowRunListTableOutput); err != nil {
return err
}
next := res.PaginationMeta.NextCursor
if next == "" {
return nil
}
logger.Info().Msg("Pagination options \n")
if next != "" {
logger.Info().Msgf("--next %s\n", next)
}
return nil
},
}
cmd.Flags().StringVar(&workflowID, "workflow", "", "workflow ID")
cmd.Flags().BoolVar(&full, "full", false, "full report")
cmd.Flags().StringVar(&status, "status", "", fmt.Sprintf("filter by workflow run status: %v", listAvailableWorkflowStatusFlag()))
// Add pagination flags
paginationOpts.AddFlags(cmd)
return cmd
}
func workflowRunListTableOutput(runs []*action.WorkflowRunItem) error {
if len(runs) == 0 {
fmt.Println("there are no workflow runs yet")
return nil
}
header := table.Row{"ID", "Workflow", "State", "Created At", "Runner"}
if full {
header = append(header, "Finished At", "Failure reason")
}
t := newTableWriter()
t.AppendHeader(header)
for _, p := range runs {
wf := p.Workflow
r := table.Row{p.ID, wf.NamespacedName(), p.State, p.CreatedAt.Format(time.RFC822), p.RunnerType}
if full {
var finishedAt string
if p.FinishedAt != nil {
finishedAt = p.FinishedAt.Format(time.RFC822)
}
r = append(r, finishedAt, p.Reason)
}
t.AppendRow(r)
}
t.Render()
return nil
}
// listAvailableWorkflowStatusFlag returns a list of available workflow status flags
func listAvailableWorkflowStatusFlag() []string {
m := action.WorkflowRunStatus()
r := make([]string, 0, len(m))
for k := range m {
r = append(r, k)
}
return r
}