-
Notifications
You must be signed in to change notification settings - Fork 0
/
context.go
130 lines (112 loc) · 2.58 KB
/
context.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
124
125
126
127
128
129
130
package tekton
import (
"github.com/cezarguimaraes/tkn-dash/pkg/cache"
"github.com/go-logr/logr"
"github.com/labstack/echo/v4"
pipelinev1beta1 "github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
)
type Context struct {
echo.Context
Log logr.Logger
pr, tr cache.Store
opts *mwOpts
}
type mwOpts struct {
namespaces []string
log logr.Logger
}
type Option func(*mwOpts)
func WithNamespaces(ns []string) Option {
return func(o *mwOpts) {
o.namespaces = ns
}
}
func WithLogger(log logr.Logger) Option {
return func(o *mwOpts) {
o.log = log
}
}
// TODO: remove namespaces param
func NewMiddleware(pr, tr cache.Store, opts ...Option) echo.MiddlewareFunc {
options := &mwOpts{
log: logr.Logger{},
}
for _, o := range opts {
o(options)
}
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
cc := &Context{
Context: c,
pr: pr,
tr: tr,
opts: options,
Log: options.log.WithValues(
"url", c.Request().URL.RequestURI(),
),
}
return next(cc)
}
}
}
func (c *Context) GetStoreFor(resource string) cache.Store {
switch resource {
case "taskruns":
return c.tr
case "pipelineruns":
return c.pr
}
return nil
}
func (c *Context) GetTaskRun(namespace, name string) *pipelinev1beta1.TaskRun {
tr, err := c.tr.Get(namespace, name)
if err != nil {
return nil
}
return tr.(*pipelinev1beta1.TaskRun)
}
func (c *Context) GetPipelineRun(namespace, name string) *pipelinev1beta1.PipelineRun {
pr, err := c.pr.Get(namespace, name)
if err != nil {
return nil
}
return pr.(*pipelinev1beta1.PipelineRun)
}
func (c *Context) GetPipelineTaskRuns(namespace, name string) []*pipelinev1beta1.TaskRun {
pr := c.GetPipelineRun(namespace, name)
if pr == nil {
return nil
}
var trs []*pipelinev1beta1.TaskRun
for _, cr := range pr.Status.ChildReferences {
trs = append(trs, c.GetTaskRun(namespace, cr.Name))
}
// support for < v0.45
if trMap := pr.Status.TaskRuns; len(trs) == 0 && len(trMap) > 0 {
taskOrder := map[string]int{}
for ord, task := range pr.Status.PipelineSpec.Tasks {
taskOrder[task.Name] = ord
}
c.Log.V(6).Info("resolved taskruns order", "order", taskOrder)
trs = make([]*pipelinev1beta1.TaskRun, len(taskOrder))
for name, tr := range trMap {
ord := taskOrder[tr.PipelineTaskName]
trs[ord] = c.GetTaskRun(namespace, name)
}
// skipped tasks won't have a taskrun
trs = removeNils(trs)
}
return trs
}
func removeNils[T any](vs []*T) []*T {
x := 0
for i, v := range vs {
if v != nil {
if x != i {
vs[x] = v
}
x += 1
}
}
return vs[:x]
}