Skip to content

Commit c4421fb

Browse files
committed
matched fields
1 parent 85f7bae commit c4421fb

File tree

6 files changed

+37
-27
lines changed

6 files changed

+37
-27
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* text eol=lf

config.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package k8seventwatcher
22

33
import (
44
"errors"
5-
"gopkg.in/yaml.v2"
65
"log"
6+
7+
"gopkg.in/yaml.v2"
78
)
89

910
type Config struct {
@@ -27,18 +28,18 @@ func (c *Config) Validate() error {
2728
return nil
2829
}
2930

30-
func (c *Config) MatchingEventFilter(event map[string]interface{}) (*EventFilter, error) {
31+
func (c *Config) MatchingEventFilter(event map[string]interface{}) (*EventFilter, map[string]interface{}, error) {
3132
for _, filter := range c.Filters {
32-
matches, err := filter.Matches(event)
33+
matchedFields, err := filter.Matches(event)
3334
if err != nil {
34-
return nil, errorf("error matching filter: %s", err)
35+
return nil, nil, errorf("error matching filter: %s", err)
3536
}
36-
if matches {
37-
return filter, nil
37+
if matchedFields != nil {
38+
return filter, matchedFields, nil
3839
}
3940
}
4041

41-
return nil, nil
42+
return nil, nil, nil
4243
}
4344

4445
func (c *Config) Dump() string {

example/main.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import (
44
"bufio"
55
"flag"
66
"fmt"
7+
"log"
8+
"os"
9+
710
"github.com/cmaster11/k8s-event-watcher"
811
"k8s.io/api/core/v1"
912
_ "k8s.io/client-go/plugin/pkg/client/auth"
10-
"log"
11-
"os"
1213
)
1314

1415
func main() {
@@ -26,8 +27,8 @@ func main() {
2627
log.Fatal(err)
2728
}
2829

29-
if err := watcher.Start(func(event *v1.Event, eventFilter *k8seventwatcher.EventFilter) {
30-
log.Printf("got event (%s): %+v\n", eventFilter.String(), event)
30+
if err := watcher.Start(func(event *v1.Event, eventFilter *k8seventwatcher.EventFilter, matchedFields map[string]interface{}) {
31+
log.Printf("got event (%s):\nmatchedFields: %+v\nevent: %+v\n", eventFilter.String(), matchedFields, event)
3132
}); err != nil {
3233
log.Fatal(err)
3334
}

filter.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,23 @@ func (f *EventFilter) Validate() error {
2020
return errors.New("no rules provided")
2121
}
2222

23-
func (f *EventFilter) Matches(event map[string]interface{}) (bool, error) {
23+
func (f *EventFilter) Matches(event map[string]interface{}) (map[string]interface{}, error) {
24+
matchedFields := make(map[string]interface{})
2425
for path, regex := range f.Rules {
2526
value, err := lookup.LookupString(event, path)
2627
if err != nil {
27-
return false, errorf("lookup error: %s", err)
28+
return nil, errorf("lookup error: %s", err)
2829
}
2930

3031
valueStr := fmt.Sprintf("%v", value.Interface())
3132
if !regex.MatchString(valueStr) {
32-
return false, nil
33+
return nil, nil
3334
}
35+
36+
matchedFields[path] = valueStr
3437
}
3538

36-
return true, nil
39+
return matchedFields, nil
3740
}
3841

3942
func (f *EventFilter) String() string {

filter_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,16 @@ rules:
4141
t.Fatalf("failed to cast event to map: %s", err)
4242
}
4343

44-
match, err := filter.Matches(obj)
44+
matchedFields, err := filter.Matches(obj)
4545
if err != nil {
4646
t.Fatalf("match error: %s", err)
4747
}
48-
if !match {
48+
if matchedFields == nil {
4949
t.Fatalf("no match")
5050
}
51+
if matchedFields["involvedObject.name"] != evt.InvolvedObject.Name {
52+
t.Fatalf("bad matched field")
53+
}
5154

5255
output := filter.ToYAML()
5356

main.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package k8seventwatcher
22

33
import (
4-
"gopkg.in/yaml.v2"
54
"io"
65
"io/ioutil"
6+
"log"
7+
"sync"
8+
"time"
9+
10+
"gopkg.in/yaml.v2"
711
"k8s.io/api/core/v1"
812
v12 "k8s.io/apimachinery/pkg/apis/meta/v1"
913
"k8s.io/client-go/informers"
@@ -12,9 +16,6 @@ import (
1216
"k8s.io/client-go/rest"
1317
"k8s.io/client-go/tools/cache"
1418
"k8s.io/client-go/tools/clientcmd"
15-
"log"
16-
"sync"
17-
"time"
1819
)
1920

2021
type K8sEventWatcher struct {
@@ -26,15 +27,15 @@ type K8sEventWatcher struct {
2627

2728
chStop chan struct{}
2829
lock sync.Mutex
29-
callback func(event *v1.Event, eventFilter *EventFilter)
30+
callback func(event *v1.Event, eventFilter *EventFilter, matchedFields map[string]interface{})
3031

3132
Debug bool
3233
}
3334

3435
func NewK8sEventWatcher(
35-
// Config path of event watcher
36+
// Config path of event watcher
3637
configPath string,
37-
// Config path for k8s cluster, can be empty
38+
// Config path for k8s cluster, can be empty
3839
kubeConfigPath *string,
3940
logWriter io.Writer,
4041
) (*K8sEventWatcher, error) {
@@ -114,21 +115,21 @@ func (w *K8sEventWatcher) onAddEvent(obj interface{}) {
114115
return
115116
}
116117

117-
filter, err := w.config.MatchingEventFilter(outMap)
118+
filter, matchedFields, err := w.config.MatchingEventFilter(outMap)
118119
if err != nil {
119120
w.logEntryError("failed to find matching event filter: %+v", err)
120121
return
121122
}
122123
if filter != nil {
123124
w.logEntryDebug("matched event: %+v", evt)
124-
w.callback(evt, filter)
125+
w.callback(evt, filter, matchedFields)
125126
return
126127
}
127128

128129
w.logEntryDebug("discarded event: %+v", evt)
129130
}
130131

131-
func (w *K8sEventWatcher) Start(callback func(event *v1.Event, eventFilter *EventFilter)) error {
132+
func (w *K8sEventWatcher) Start(callback func(event *v1.Event, eventFilter *EventFilter, matchedFields map[string]interface{})) error {
132133
if callback == nil {
133134
return errorf("callback cannot be null")
134135
}

0 commit comments

Comments
 (0)