Skip to content

Commit ecccd81

Browse files
authored
enhance: allow dumping of trigger map for debugging
Signed-off-by: Donnie Adams <[email protected]>
1 parent 4c7b8ce commit ecccd81

File tree

4 files changed

+56
-8
lines changed

4 files changed

+56
-8
lines changed

pkg/router/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func NewHandlerSet(name string, scheme *runtime.Scheme, backend backend.Backend)
5959
handlers: map[schema.GroupVersionKind][]Handler{},
6060
},
6161
triggers: triggers{
62-
matchers: map[schema.GroupVersionKind]map[enqueueTarget]map[string]objectMatcher{},
62+
matchers: map[groupVersionKind]map[enqueueTarget]map[string]objectMatcher{},
6363
trigger: backend,
6464
gvkLookup: backend,
6565
scheme: scheme,

pkg/router/matcher.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package router
22

33
import (
4+
"encoding/json"
5+
46
"k8s.io/apimachinery/pkg/fields"
57
"k8s.io/apimachinery/pkg/labels"
68
kclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -82,3 +84,16 @@ func (o *objectMatcher) Match(ns, name string, obj kclient.Object) bool {
8284
}
8385
return o.Namespace == "" || o.Namespace == ns
8486
}
87+
88+
func (o objectMatcher) MarshalJSON() ([]byte, error) {
89+
m := make(map[string]any, 4)
90+
m["name"] = o.Name
91+
m["namespace"] = o.Namespace
92+
if o.Selector != nil {
93+
m["label selector"] = o.Selector.String()
94+
}
95+
if o.Fields != nil {
96+
m["field selector"] = o.Fields.String()
97+
}
98+
return json.MarshalIndent(m, "", " ")
99+
}

pkg/router/router.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ func (r *Router) Backend() backend.Backend {
5555
return r.handlers.backend
5656
}
5757

58+
func (r *Router) DumpTriggers(indent bool) ([]byte, error) {
59+
b, err := r.handlers.triggers.Dump(indent)
60+
if err != nil {
61+
return nil, fmt.Errorf("failed to dump triggers: %w", err)
62+
}
63+
64+
return b, nil
65+
}
66+
5867
type RouteBuilder struct {
5968
includeRemove bool
6069
includeFinalizing bool

pkg/router/trigger.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package router
22

33
import (
4+
"encoding/json"
45
"strings"
56
"sync"
67

@@ -16,7 +17,7 @@ import (
1617

1718
type triggers struct {
1819
lock sync.RWMutex
19-
matchers map[schema.GroupVersionKind]map[enqueueTarget]map[string]objectMatcher
20+
matchers map[groupVersionKind]map[enqueueTarget]map[string]objectMatcher
2021
trigger backend.Trigger
2122
gvkLookup backend.Backend
2223
scheme *runtime.Scheme
@@ -32,11 +33,15 @@ type enqueueTarget struct {
3233
gvk schema.GroupVersionKind
3334
}
3435

36+
func (et enqueueTarget) MarshalText() ([]byte, error) {
37+
return []byte(et.gvk.String() + ": " + et.key), nil
38+
}
39+
3540
func (m *triggers) invokeTriggers(req Request) {
3641
m.lock.RLock()
3742
defer m.lock.RUnlock()
3843

39-
for et, matchers := range m.matchers[req.GVK] {
44+
for et, matchers := range m.matchers[groupVersionKind{req.GVK}] {
4045
if et.gvk == req.GVK &&
4146
et.key == req.Key {
4247
continue
@@ -59,10 +64,10 @@ func (m *triggers) register(gvk schema.GroupVersionKind, key string, targetGVK s
5964
key: key,
6065
gvk: gvk,
6166
}
62-
matchers, ok := m.matchers[targetGVK]
67+
matchers, ok := m.matchers[groupVersionKind{targetGVK}]
6368
if !ok {
6469
matchers = map[enqueueTarget]map[string]objectMatcher{}
65-
m.matchers[targetGVK] = matchers
70+
m.matchers[groupVersionKind{targetGVK}] = matchers
6671
}
6772

6873
matcherKey := mr.String()
@@ -112,7 +117,7 @@ func (m *triggers) UnregisterAndTrigger(req Request) {
112117
m.lock.Lock()
113118
defer m.lock.Unlock()
114119

115-
remainingMatchers := map[schema.GroupVersionKind]map[enqueueTarget]map[string]objectMatcher{}
120+
remainingMatchers := map[groupVersionKind]map[enqueueTarget]map[string]objectMatcher{}
116121

117122
for targetGVK, matchers := range m.matchers {
118123
for target, mts := range matchers {
@@ -121,7 +126,7 @@ func (m *triggers) UnregisterAndTrigger(req Request) {
121126
continue
122127
}
123128
for _, mt := range mts {
124-
if targetGVK != req.GVK || mt.Namespace != req.Namespace || mt.Name != req.Name {
129+
if targetGVK.GroupVersionKind != req.GVK || mt.Namespace != req.Namespace || mt.Name != req.Name {
125130
// If the matcher matches the deleted object exactly, then skip the matcher.
126131
if remainingMatchers[targetGVK] == nil {
127132
remainingMatchers[targetGVK] = make(map[enqueueTarget]map[string]objectMatcher)
@@ -131,7 +136,7 @@ func (m *triggers) UnregisterAndTrigger(req Request) {
131136
}
132137
remainingMatchers[targetGVK][target][mt.String()] = mt
133138
}
134-
if targetGVK == req.GVK && mt.Match(req.Namespace, req.Name, req.Object) {
139+
if targetGVK.GroupVersionKind == req.GVK && mt.Match(req.Namespace, req.Name, req.Object) {
135140
log.Debugf("Triggering [%s] [%v] from [%s] [%v] on delete", target.key, target.gvk, req.Key, req.GVK)
136141
_ = m.trigger.Trigger(req.Ctx, target.gvk, target.key, 0)
137142
}
@@ -141,3 +146,22 @@ func (m *triggers) UnregisterAndTrigger(req Request) {
141146

142147
m.matchers = remainingMatchers
143148
}
149+
150+
func (m *triggers) Dump(indent bool) ([]byte, error) {
151+
m.lock.RLock()
152+
defer m.lock.RUnlock()
153+
154+
if !indent {
155+
return json.Marshal(m.matchers)
156+
}
157+
158+
return json.MarshalIndent(m.matchers, "", " ")
159+
}
160+
161+
type groupVersionKind struct {
162+
schema.GroupVersionKind
163+
}
164+
165+
func (gvk groupVersionKind) MarshalText() ([]byte, error) {
166+
return []byte(gvk.String()), nil
167+
}

0 commit comments

Comments
 (0)