Skip to content

Commit 6a87419

Browse files
authored
CE changes for VAULT-33018 (#29470)
1 parent 20795f3 commit 6a87419

File tree

4 files changed

+77
-30
lines changed

4 files changed

+77
-30
lines changed

changelog/29470.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:improvement
2+
events (enterprise): Send events downstream to performance standby nodes in a cluster, removing the need to redirect client event subscriptions to the active node.
3+
```

http/handler.go

-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ func init() {
127127
"!sys/storage/raft/snapshot-auto/config",
128128
})
129129
websocketPaths.AddPaths(websocketRawPaths)
130-
alwaysRedirectPaths.AddPaths(websocketRawPaths)
131130
}
132131

133132
type HandlerAnchor struct{}

vault/eventbus/bus.go

+17-6
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,25 @@ func patchMountPath(data *logical.EventData, pluginInfo *logical.EventPluginInfo
118118
// the namespace and plugin info automatically.
119119
// The context passed in is currently ignored to ensure that the event is sent if the context is short-lived,
120120
// such as with an HTTP request context.
121-
func (bus *EventBus) SendEventInternal(_ context.Context, ns *namespace.Namespace, pluginInfo *logical.EventPluginInfo, eventType logical.EventType, data *logical.EventData) error {
121+
func (bus *EventBus) SendEventInternal(_ context.Context, ns *namespace.Namespace, pluginInfo *logical.EventPluginInfo, eventType logical.EventType, forwarded bool, data *logical.EventData) error {
122122
if ns == nil {
123123
return namespace.ErrNoNamespace
124124
}
125125
if !bus.started.Load() {
126126
return ErrNotStarted
127127
}
128128
eventReceived := &logical.EventReceived{
129-
Event: patchMountPath(data, pluginInfo),
130129
Namespace: ns.Path,
131130
EventType: string(eventType),
132131
PluginInfo: pluginInfo,
133132
}
133+
// If the event has been forwarded downstream, no need to patch the mount
134+
// path again
135+
if forwarded {
136+
eventReceived.Event = data
137+
} else {
138+
eventReceived.Event = patchMountPath(data, pluginInfo)
139+
}
134140

135141
// We can't easily know when the SendEvent is complete, so we can't call the cancel function.
136142
// But, it is called automatically after bus.timeout, so there won't be any leak as long as bus.timeout is not too long.
@@ -161,10 +167,10 @@ func (bus *EventBus) WithPlugin(ns *namespace.Namespace, eventPluginInfo *logica
161167
// This function does *not* wait for all subscribers to acknowledge before returning.
162168
// The context passed in is currently ignored.
163169
func (bus *pluginEventBus) SendEvent(ctx context.Context, eventType logical.EventType, data *logical.EventData) error {
164-
return bus.bus.SendEventInternal(ctx, bus.namespace, bus.pluginInfo, eventType, data)
170+
return bus.bus.SendEventInternal(ctx, bus.namespace, bus.pluginInfo, eventType, false, data)
165171
}
166172

167-
func NewEventBus(localClusterID string, logger hclog.Logger) (*EventBus, error) {
173+
func NewEventBus(localNodeID string, logger hclog.Logger) (*EventBus, error) {
168174
broker, err := eventlogger.NewBroker()
169175
if err != nil {
170176
return nil, err
@@ -180,7 +186,7 @@ func NewEventBus(localClusterID string, logger hclog.Logger) (*EventBus, error)
180186
logger = hclog.Default().Named("events")
181187
}
182188

183-
sourceUrl, err := url.Parse("vault://" + localClusterID)
189+
sourceUrl, err := url.Parse("vault://" + localNodeID)
184190
if err != nil {
185191
return nil, err
186192
}
@@ -198,7 +204,7 @@ func NewEventBus(localClusterID string, logger hclog.Logger) (*EventBus, error)
198204
formatterNodeID: formatterNodeID,
199205
timeout: defaultTimeout,
200206
cloudEventsFormatterFilter: cloudEventsFormatterFilter,
201-
filters: NewFilters(localClusterID),
207+
filters: NewFilters(localNodeID),
202208
}, nil
203209
}
204210

@@ -336,6 +342,11 @@ func (bus *EventBus) NotifyOnClusterFilterChanges(ctx context.Context, cluster s
336342
return bus.filters.watch(ctx, clusterID(cluster))
337343
}
338344

345+
// NewAllEventsSubscription creates a new subscription to all events.
346+
func (bus *EventBus) NewAllEventsSubscription(ctx context.Context) (<-chan *eventlogger.Event, context.CancelFunc, error) {
347+
return bus.subscribeInternal(ctx, nil, "*", "", nil)
348+
}
349+
339350
// NewGlobalSubscription creates a new subscription to all events that match the global filter.
340351
func (bus *EventBus) NewGlobalSubscription(ctx context.Context) (<-chan *eventlogger.Event, context.CancelFunc, error) {
341352
g := globalCluster

vault/eventbus/bus_test.go

+57-23
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ func TestBusBasics(t *testing.T) {
3636
t.Fatal(err)
3737
}
3838

39-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
39+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
4040
if !errors.Is(err, ErrNotStarted) {
4141
t.Errorf("Expected not started error but got: %v", err)
4242
}
4343

4444
bus.Start()
4545

46-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
46+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
4747
if err != nil {
4848
t.Errorf("Expected no error sending: %v", err)
4949
}
@@ -59,7 +59,7 @@ func TestBusBasics(t *testing.T) {
5959
t.Fatal(err)
6060
}
6161

62-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
62+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
6363
if err != nil {
6464
t.Error(err)
6565
}
@@ -100,7 +100,7 @@ func TestBusIgnoresSendContext(t *testing.T) {
100100
ctx, cancel := context.WithCancel(context.Background())
101101
cancel() // cancel immediately
102102

103-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
103+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
104104
if err != nil {
105105
t.Errorf("Expected no error sending: %v", err)
106106
}
@@ -144,7 +144,7 @@ func TestSubscribeNonRootNamespace(t *testing.T) {
144144
t.Fatal(err)
145145
}
146146

147-
err = bus.SendEventInternal(ctx, ns, nil, eventType, event)
147+
err = bus.SendEventInternal(ctx, ns, nil, eventType, false, event)
148148
if err != nil {
149149
t.Error(err)
150150
}
@@ -190,7 +190,7 @@ func TestNamespaceFiltering(t *testing.T) {
190190
err = bus.SendEventInternal(ctx, &namespace.Namespace{
191191
ID: "abc",
192192
Path: "/abc",
193-
}, nil, eventType, event)
193+
}, nil, eventType, false, event)
194194
if err != nil {
195195
t.Error(err)
196196
}
@@ -203,7 +203,7 @@ func TestNamespaceFiltering(t *testing.T) {
203203
// okay
204204
}
205205

206-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
206+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
207207
if err != nil {
208208
t.Error(err)
209209
}
@@ -253,11 +253,11 @@ func TestBus2Subscriptions(t *testing.T) {
253253
t.Fatal(err)
254254
}
255255

256-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType2, event2)
256+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType2, false, event2)
257257
if err != nil {
258258
t.Error(err)
259259
}
260-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType1, event1)
260+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType1, false, event1)
261261
if err != nil {
262262
t.Error(err)
263263
}
@@ -345,7 +345,7 @@ func TestBusSubscriptionsCancel(t *testing.T) {
345345
if err != nil {
346346
t.Fatal(err)
347347
}
348-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
348+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
349349
if err != nil {
350350
t.Error(err)
351351
}
@@ -357,7 +357,7 @@ func TestBusSubscriptionsCancel(t *testing.T) {
357357
if err != nil {
358358
t.Fatal(err)
359359
}
360-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, event)
360+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, eventType, false, event)
361361
if err != nil {
362362
t.Error(err)
363363
}
@@ -427,11 +427,11 @@ func TestBusWildcardSubscriptions(t *testing.T) {
427427
t.Fatal(err)
428428
}
429429

430-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, barEventType, event2)
430+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, barEventType, false, event2)
431431
if err != nil {
432432
t.Error(err)
433433
}
434-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, fooEventType, event1)
434+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, fooEventType, false, event1)
435435
if err != nil {
436436
t.Error(err)
437437
}
@@ -504,7 +504,7 @@ func TestDataPathIsPrependedWithMount(t *testing.T) {
504504
}
505505

506506
// no plugin info means nothing should change
507-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, fooEventType, event)
507+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, nil, fooEventType, false, event)
508508
if err != nil {
509509
t.Error(err)
510510
}
@@ -530,7 +530,7 @@ func TestDataPathIsPrependedWithMount(t *testing.T) {
530530
PluginVersion: "v1.13.1+builtin",
531531
Version: "2",
532532
}
533-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, fooEventType, event)
533+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, fooEventType, false, event)
534534
if err != nil {
535535
t.Error(err)
536536
}
@@ -571,7 +571,7 @@ func TestDataPathIsPrependedWithMount(t *testing.T) {
571571
if err := event.Metadata.UnmarshalJSON(metadataBytes); err != nil {
572572
t.Fatal(err)
573573
}
574-
err = bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, fooEventType, event)
574+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, fooEventType, false, event)
575575
if err != nil {
576576
t.Error(err)
577577
}
@@ -587,6 +587,40 @@ func TestDataPathIsPrependedWithMount(t *testing.T) {
587587
case <-timeout:
588588
t.Error("Timeout waiting for event")
589589
}
590+
591+
// Test that a forwarded event does not have anything prepended
592+
event, err = logical.NewEvent()
593+
if err != nil {
594+
t.Fatal(err)
595+
}
596+
metadata = map[string]string{
597+
logical.EventMetadataDataPath: "your/secret/path",
598+
"not_touched": "xyz",
599+
}
600+
metadataBytes, err = json.Marshal(metadata)
601+
if err != nil {
602+
t.Fatal(err)
603+
}
604+
event.Metadata = &structpb.Struct{}
605+
if err := event.Metadata.UnmarshalJSON(metadataBytes); err != nil {
606+
t.Fatal(err)
607+
}
608+
err = bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, fooEventType, true, event)
609+
if err != nil {
610+
t.Error(err)
611+
}
612+
613+
timeout = time.After(1 * time.Second)
614+
select {
615+
case message := <-ch:
616+
metadata := message.Payload.(*logical.EventReceived).Event.Metadata.AsMap()
617+
assert.Contains(t, metadata, "not_touched")
618+
assert.Equal(t, "xyz", metadata["not_touched"])
619+
assert.Contains(t, metadata, "data_path")
620+
assert.Equal(t, "your/secret/path", metadata["data_path"])
621+
case <-timeout:
622+
t.Error("Timeout waiting for event")
623+
}
590624
}
591625

592626
// TestBexpr tests go-bexpr filters are evaluated on an event.
@@ -625,7 +659,7 @@ func TestBexpr(t *testing.T) {
625659
PluginVersion: "v1.13.1+builtin",
626660
Version: "2",
627661
}
628-
return bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, logical.EventType(eventType), event)
662+
return bus.SendEventInternal(ctx, namespace.RootNamespace, &pluginInfo, logical.EventType(eventType), false, event)
629663
}
630664

631665
testCases := []struct {
@@ -725,7 +759,7 @@ func TestSubscribeGlobal(t *testing.T) {
725759
if err != nil {
726760
t.Fatal(err)
727761
}
728-
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", ev)
762+
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", false, ev)
729763
if err != nil {
730764
t.Fatal(err)
731765
}
@@ -769,7 +803,7 @@ func TestSubscribeGlobal_WithApply(t *testing.T) {
769803
if err != nil {
770804
t.Fatal(err)
771805
}
772-
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", ev)
806+
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", false, ev)
773807
if err != nil {
774808
t.Fatal(err)
775809
}
@@ -805,7 +839,7 @@ func TestSubscribeCluster(t *testing.T) {
805839
if err != nil {
806840
t.Fatal(err)
807841
}
808-
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", ev)
842+
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", false, ev)
809843
if err != nil {
810844
t.Fatal(err)
811845
}
@@ -847,7 +881,7 @@ func TestSubscribeCluster_WithApply(t *testing.T) {
847881
if err != nil {
848882
t.Fatal(err)
849883
}
850-
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", ev)
884+
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", false, ev)
851885
if err != nil {
852886
t.Fatal(err)
853887
}
@@ -890,7 +924,7 @@ func TestClearGlobalFilter(t *testing.T) {
890924
if err != nil {
891925
t.Fatal(err)
892926
}
893-
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", ev)
927+
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", false, ev)
894928
if err != nil {
895929
t.Fatal(err)
896930
}
@@ -931,7 +965,7 @@ func TestClearClusterFilter(t *testing.T) {
931965
if err != nil {
932966
t.Fatal(err)
933967
}
934-
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", ev)
968+
err = bus.SendEventInternal(nil, namespace.RootNamespace, nil, "abcd", false, ev)
935969
if err != nil {
936970
t.Fatal(err)
937971
}

0 commit comments

Comments
 (0)