Skip to content

Commit 02d7692

Browse files
[PM-17562] Use EventBasedOrganizationIntegrations feature flag to turn on/off event queue
1 parent db9b047 commit 02d7692

File tree

4 files changed

+121
-10
lines changed

4 files changed

+121
-10
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Bit.Core.Models.Data;
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
namespace Bit.Core.Services;
5+
6+
public class EventRouteService(
7+
[FromKeyedServices("broadcast")] IEventWriteService broadcastEventWriteService,
8+
[FromKeyedServices("storage")] IEventWriteService storageEventWriteService,
9+
IFeatureService _featureService) : IEventWriteService
10+
{
11+
public async Task CreateAsync(IEvent e)
12+
{
13+
if (_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations))
14+
{
15+
await broadcastEventWriteService.CreateAsync(e);
16+
}
17+
else
18+
{
19+
await storageEventWriteService.CreateAsync(e);
20+
}
21+
}
22+
23+
public async Task CreateManyAsync(IEnumerable<IEvent> e)
24+
{
25+
if (_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations))
26+
{
27+
await broadcastEventWriteService.CreateManyAsync(e);
28+
}
29+
else
30+
{
31+
await storageEventWriteService.CreateManyAsync(e);
32+
}
33+
}
34+
}

src/Events/Startup.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,33 +62,39 @@ public void ConfigureServices(IServiceCollection services)
6262
{
6363
services.AddSingleton<IApplicationCacheService, InMemoryApplicationCacheService>();
6464
}
65-
services.AddScoped<IEventService, EventService>();
65+
6666
if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
6767
{
68+
services.AddKeyedSingleton<IEventWriteService, AzureQueueEventWriteService>("storage");
69+
6870
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.ConnectionString) &&
6971
CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.TopicName))
7072
{
71-
services.AddSingleton<IEventWriteService, AzureServiceBusEventWriteService>();
73+
services.AddKeyedSingleton<IEventWriteService, AzureServiceBusEventWriteService>("broadcast");
7274
}
7375
else
7476
{
75-
services.AddSingleton<IEventWriteService, AzureQueueEventWriteService>();
77+
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
7678
}
7779
}
7880
else
7981
{
82+
services.AddKeyedSingleton<IEventWriteService, RepositoryEventWriteService>("storage");
83+
8084
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.HostName) &&
8185
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Username) &&
8286
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Password) &&
8387
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.ExchangeName))
8488
{
85-
services.AddSingleton<IEventWriteService, RabbitMqEventWriteService>();
89+
services.AddKeyedSingleton<IEventWriteService, RabbitMqEventWriteService>("broadcast");
8690
}
8791
else
8892
{
89-
services.AddSingleton<IEventWriteService, RepositoryEventWriteService>();
93+
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
9094
}
9195
}
96+
services.AddScoped<IEventWriteService, EventRouteService>();
97+
services.AddScoped<IEventService, EventService>();
9298

9399
services.AddOptionality();
94100

src/SharedWeb/Utilities/ServiceCollectionExtensions.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,34 +332,40 @@ public static void AddDefaultServices(this IServiceCollection services, GlobalSe
332332

333333
if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
334334
{
335+
services.AddKeyedSingleton<IEventWriteService, AzureQueueEventWriteService>("storage");
336+
335337
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.ConnectionString) &&
336338
CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.TopicName))
337339
{
338-
services.AddSingleton<IEventWriteService, AzureServiceBusEventWriteService>();
340+
services.AddKeyedSingleton<IEventWriteService, AzureServiceBusEventWriteService>("broadcast");
339341
}
340342
else
341343
{
342-
services.AddSingleton<IEventWriteService, AzureQueueEventWriteService>();
344+
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
343345
}
344346
}
345347
else if (globalSettings.SelfHosted)
346348
{
349+
services.AddKeyedSingleton<IEventWriteService, RepositoryEventWriteService>("storage");
350+
347351
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.HostName) &&
348352
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Username) &&
349353
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Password) &&
350354
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.ExchangeName))
351355
{
352-
services.AddSingleton<IEventWriteService, RabbitMqEventWriteService>();
356+
services.AddKeyedSingleton<IEventWriteService, RabbitMqEventWriteService>("broadcast");
353357
}
354358
else
355359
{
356-
services.AddSingleton<IEventWriteService, RepositoryEventWriteService>();
360+
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
357361
}
358362
}
359363
else
360364
{
361-
services.AddSingleton<IEventWriteService, NoopEventWriteService>();
365+
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("storage");
366+
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
362367
}
368+
services.AddScoped<IEventWriteService, EventRouteService>();
363369

364370
if (CoreHelpers.SettingHasValue(globalSettings.Attachment.ConnectionString))
365371
{
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Bit.Core.Models.Data;
2+
using Bit.Core.Services;
3+
using Bit.Test.Common.AutoFixture.Attributes;
4+
using NSubstitute;
5+
using Xunit;
6+
7+
namespace Bit.Core.Test.Services;
8+
9+
[SutProviderCustomize]
10+
public class EventRouteServiceTests
11+
{
12+
private readonly IEventWriteService _broadcastEventWriteService = Substitute.For<IEventWriteService>();
13+
private readonly IEventWriteService _storageEventWriteService = Substitute.For<IEventWriteService>();
14+
private readonly IFeatureService _featureService = Substitute.For<IFeatureService>();
15+
private readonly EventRouteService Subject;
16+
17+
public EventRouteServiceTests()
18+
{
19+
Subject = new EventRouteService(_broadcastEventWriteService, _storageEventWriteService, _featureService);
20+
}
21+
22+
[Theory, BitAutoData]
23+
public async Task CreateAsync_FlagDisabled_EventSentToStorageService(EventMessage eventMessage)
24+
{
25+
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(false);
26+
27+
await Subject.CreateAsync(eventMessage);
28+
29+
_broadcastEventWriteService.DidNotReceiveWithAnyArgs().CreateAsync(Arg.Any<EventMessage>());
30+
_storageEventWriteService.Received(1).CreateAsync(eventMessage);
31+
}
32+
33+
[Theory, BitAutoData]
34+
public async Task CreateAsync_FlagEnabled_EventSentToBroadcastService(EventMessage eventMessage)
35+
{
36+
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(true);
37+
38+
await Subject.CreateAsync(eventMessage);
39+
40+
_broadcastEventWriteService.Received(1).CreateAsync(eventMessage);
41+
_storageEventWriteService.DidNotReceiveWithAnyArgs().CreateAsync(Arg.Any<EventMessage>());
42+
}
43+
44+
[Theory, BitAutoData]
45+
public async Task CreateManyAsync_FlagDisabled_EventsSentToStorageService(IEnumerable<EventMessage> eventMessages)
46+
{
47+
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(false);
48+
49+
await Subject.CreateManyAsync(eventMessages);
50+
51+
_broadcastEventWriteService.DidNotReceiveWithAnyArgs().CreateManyAsync(Arg.Any<IEnumerable<EventMessage>>());
52+
_storageEventWriteService.Received(1).CreateManyAsync(eventMessages);
53+
}
54+
55+
[Theory, BitAutoData]
56+
public async Task CreateManyAsync_FlagEnabled_EventsSentToBroadcastService(IEnumerable<EventMessage> eventMessages)
57+
{
58+
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(true);
59+
60+
await Subject.CreateManyAsync(eventMessages);
61+
62+
_broadcastEventWriteService.Received(1).CreateManyAsync(eventMessages);
63+
_storageEventWriteService.DidNotReceiveWithAnyArgs().CreateManyAsync(Arg.Any<IEnumerable<EventMessage>>());
64+
}
65+
}

0 commit comments

Comments
 (0)