15
15
*
16
16
*/
17
17
18
- package forwarder
18
+ package clients
19
19
20
20
import (
21
+ "sync/atomic"
22
+
23
+ "github.com/skydive-project/skydive/graffiti/filters"
21
24
"github.com/skydive-project/skydive/graffiti/graph"
22
25
"github.com/skydive-project/skydive/graffiti/logging"
23
26
"github.com/skydive-project/skydive/graffiti/messages"
@@ -31,6 +34,8 @@ type Forwarder struct {
31
34
masterElection * ws.MasterElection
32
35
graph * graph.Graph
33
36
logger logging.Logger
37
+ nodeFilter * filters.Filter
38
+ inhibit atomic.Value
34
39
}
35
40
36
41
func (t * Forwarder ) triggerResync () {
@@ -68,6 +73,10 @@ func (t *Forwarder) OnNewMaster(c ws.Speaker) {
68
73
69
74
// OnNodeUpdated graph node updated event. Implements the EventListener interface.
70
75
func (t * Forwarder ) OnNodeUpdated (n * graph.Node , ops []graph.PartiallyUpdatedOp ) {
76
+ if t .inhibit .Load () == true || (t .nodeFilter != nil && ! t .nodeFilter .Eval (n )) {
77
+ return
78
+ }
79
+
71
80
t .masterElection .SendMessageToMaster (
72
81
messages .NewStructMessage (
73
82
messages .NodePartiallyUpdatedMsgType ,
@@ -83,20 +92,34 @@ func (t *Forwarder) OnNodeUpdated(n *graph.Node, ops []graph.PartiallyUpdatedOp)
83
92
84
93
// OnNodeAdded graph node added event. Implements the EventListener interface.
85
94
func (t * Forwarder ) OnNodeAdded (n * graph.Node ) {
95
+ if t .inhibit .Load () == true || (t .nodeFilter != nil && ! t .nodeFilter .Eval (n )) {
96
+ return
97
+ }
98
+
86
99
t .masterElection .SendMessageToMaster (
87
100
messages .NewStructMessage (messages .NodeAddedMsgType , n ),
88
101
)
89
102
}
90
103
91
104
// OnNodeDeleted graph node deleted event. Implements the EventListener interface.
92
105
func (t * Forwarder ) OnNodeDeleted (n * graph.Node ) {
106
+ if t .inhibit .Load () == true || (t .nodeFilter != nil && ! t .nodeFilter .Eval (n )) {
107
+ return
108
+ }
109
+
93
110
t .masterElection .SendMessageToMaster (
94
111
messages .NewStructMessage (messages .NodeDeletedMsgType , n ),
95
112
)
96
113
}
97
114
98
115
// OnEdgeUpdated graph edge updated event. Implements the EventListener interface.
99
116
func (t * Forwarder ) OnEdgeUpdated (e * graph.Edge , ops []graph.PartiallyUpdatedOp ) {
117
+ if t .inhibit .Load () == true || (t .nodeFilter != nil &&
118
+ ! t .nodeFilter .Eval (t .graph .GetEdge (e .Parent )) &&
119
+ ! t .nodeFilter .Eval (t .graph .GetEdge (e .Child ))) {
120
+ return
121
+ }
122
+
100
123
t .masterElection .SendMessageToMaster (
101
124
messages .NewStructMessage (
102
125
messages .EdgePartiallyUpdatedMsgType ,
@@ -112,26 +135,43 @@ func (t *Forwarder) OnEdgeUpdated(e *graph.Edge, ops []graph.PartiallyUpdatedOp)
112
135
113
136
// OnEdgeAdded graph edge added event. Implements the EventListener interface.
114
137
func (t * Forwarder ) OnEdgeAdded (e * graph.Edge ) {
138
+ if t .inhibit .Load () == true || (t .nodeFilter != nil &&
139
+ ! t .nodeFilter .Eval (t .graph .GetEdge (e .Parent )) &&
140
+ ! t .nodeFilter .Eval (t .graph .GetEdge (e .Child ))) {
141
+ return
142
+ }
143
+
115
144
t .masterElection .SendMessageToMaster (
116
145
messages .NewStructMessage (messages .EdgeAddedMsgType , e ),
117
146
)
118
147
}
119
148
120
149
// OnEdgeDeleted graph edge deleted event. Implements the EventListener interface.
121
150
func (t * Forwarder ) OnEdgeDeleted (e * graph.Edge ) {
151
+ if t .inhibit .Load () == true || (t .nodeFilter != nil &&
152
+ ! t .nodeFilter .Eval (t .graph .GetEdge (e .Parent )) &&
153
+ ! t .nodeFilter .Eval (t .graph .GetEdge (e .Child ))) {
154
+ return
155
+ }
156
+
122
157
t .masterElection .SendMessageToMaster (
123
158
messages .NewStructMessage (messages .EdgeDeletedMsgType , e ),
124
159
)
125
160
}
126
161
162
+ // Inhib node and edge forwarding
163
+ func (t * Forwarder ) Inhib (c ws.Speaker ) {
164
+ t .inhibit .Store (c != nil )
165
+ }
166
+
127
167
// GetMaster returns the current analyzer the agent is sending its events to
128
168
func (t * Forwarder ) GetMaster () ws.Speaker {
129
169
return t .masterElection .GetMaster ()
130
170
}
131
171
132
172
// NewForwarder returns a new Graph forwarder which forwards event of the given graph
133
173
// to the given WebSocket JSON speakers.
134
- func NewForwarder (g * graph.Graph , pool ws.StructSpeakerPool , logger logging.Logger ) * Forwarder {
174
+ func NewForwarder (g * graph.Graph , pool ws.SpeakerPool , nodeFilter * filters. Filter , logger logging.Logger ) * Forwarder {
135
175
if logger == nil {
136
176
logger = logging .GetLogger ()
137
177
}
@@ -142,6 +182,7 @@ func NewForwarder(g *graph.Graph, pool ws.StructSpeakerPool, logger logging.Logg
142
182
masterElection : masterElection ,
143
183
graph : g ,
144
184
logger : logger ,
185
+ nodeFilter : nodeFilter ,
145
186
}
146
187
147
188
masterElection .AddEventHandler (t )
0 commit comments