@@ -19,6 +19,7 @@ import (
19
19
"github.com/hashicorp/eventlogger/formatter_filters/cloudevents"
20
20
"github.com/hashicorp/go-bexpr"
21
21
"github.com/hashicorp/go-hclog"
22
+ "github.com/hashicorp/go-secure-stdlib/parseutil"
22
23
"github.com/hashicorp/go-uuid"
23
24
"github.com/hashicorp/vault/helper/namespace"
24
25
"github.com/hashicorp/vault/sdk/logical"
@@ -30,8 +31,9 @@ const (
30
31
// eventTypeAll is purely internal to the event bus. We use it to send all
31
32
// events down one big firehose, and pipelines define their own filtering
32
33
// based on what each subscriber is interested in.
33
- eventTypeAll = "*"
34
- defaultTimeout = 60 * time .Second
34
+ eventTypeAll = "*"
35
+ defaultTimeout = 60 * time .Second
36
+ eventMetadataVaultIndex = "vault_index"
35
37
)
36
38
37
39
var (
@@ -55,6 +57,13 @@ type EventBus struct {
55
57
timeout time.Duration
56
58
filters * Filters
57
59
cloudEventsFormatterFilter * cloudevents.FormatterFilter
60
+ walGetter StorageWALGetter
61
+ }
62
+
63
+ // StorageWALGetter is an interface used to fetch the current storage index
64
+ // from core without importing core
65
+ type StorageWALGetter interface {
66
+ GetCurrentWALHeader () string
58
67
}
59
68
60
69
type pluginEventBus struct {
@@ -111,6 +120,25 @@ func patchMountPath(data *logical.EventData, pluginInfo *logical.EventPluginInfo
111
120
return data
112
121
}
113
122
123
+ // getIndexForEvent returns the storage index (wal header) for events with
124
+ // metadata.modified=true.
125
+ func (bus * EventBus ) getIndexForEvent (event * logical.EventReceived ) (string , error ) {
126
+ if event .Event == nil || event .Event .Metadata == nil || bus .walGetter == nil {
127
+ return "" , nil
128
+ }
129
+ eventMetadataModified := event .Event .Metadata .GetFields ()[logical .EventMetadataModified ]
130
+ if eventMetadataModified != nil {
131
+ isModified , err := parseutil .ParseBool (eventMetadataModified .GetStringValue ())
132
+ if err != nil {
133
+ return "" , fmt .Errorf ("failed to parse event metadata modified: %w" , err )
134
+ }
135
+ if isModified {
136
+ return bus .walGetter .GetCurrentWALHeader (), nil
137
+ }
138
+ }
139
+ return "" , nil
140
+ }
141
+
114
142
// SendEventInternal sends an event to the event bus and routes it to all relevant subscribers.
115
143
// This function does *not* wait for all subscribers to acknowledge before returning.
116
144
// This function is meant to be used by trusted internal code, so it can specify details like the namespace
@@ -136,6 +164,13 @@ func (bus *EventBus) SendEventInternal(_ context.Context, ns *namespace.Namespac
136
164
eventReceived .Event = data
137
165
} else {
138
166
eventReceived .Event = patchMountPath (data , pluginInfo )
167
+ walStr , err := bus .getIndexForEvent (eventReceived )
168
+ if err != nil {
169
+ bus .logger .Warn ("Failed to get index for event" , "error" , err )
170
+ }
171
+ if walStr != "" {
172
+ eventReceived .Event .Metadata .Fields [eventMetadataVaultIndex ] = structpb .NewStringValue (walStr )
173
+ }
139
174
}
140
175
141
176
// We can't easily know when the SendEvent is complete, so we can't call the cancel function.
@@ -170,7 +205,7 @@ func (bus *pluginEventBus) SendEvent(ctx context.Context, eventType logical.Even
170
205
return bus .bus .SendEventInternal (ctx , bus .namespace , bus .pluginInfo , eventType , false , data )
171
206
}
172
207
173
- func NewEventBus (localNodeID string , logger hclog.Logger ) (* EventBus , error ) {
208
+ func NewEventBus (localNodeID string , logger hclog.Logger , c StorageWALGetter ) (* EventBus , error ) {
174
209
broker , err := eventlogger .NewBroker ()
175
210
if err != nil {
176
211
return nil , err
@@ -205,6 +240,7 @@ func NewEventBus(localNodeID string, logger hclog.Logger) (*EventBus, error) {
205
240
timeout : defaultTimeout ,
206
241
cloudEventsFormatterFilter : cloudEventsFormatterFilter ,
207
242
filters : NewFilters (localNodeID ),
243
+ walGetter : c ,
208
244
}, nil
209
245
}
210
246
0 commit comments