mirror of
https://github.com/bitwarden/server.git
synced 2025-05-03 10:42:21 -05:00
[PM-17562] Use EventBasedOrganizationIntegrations feature flag to turn on/off event queue
This commit is contained in:
parent
db9b047fb0
commit
02d7692ae1
@ -0,0 +1,34 @@
|
|||||||
|
using Bit.Core.Models.Data;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace Bit.Core.Services;
|
||||||
|
|
||||||
|
public class EventRouteService(
|
||||||
|
[FromKeyedServices("broadcast")] IEventWriteService broadcastEventWriteService,
|
||||||
|
[FromKeyedServices("storage")] IEventWriteService storageEventWriteService,
|
||||||
|
IFeatureService _featureService) : IEventWriteService
|
||||||
|
{
|
||||||
|
public async Task CreateAsync(IEvent e)
|
||||||
|
{
|
||||||
|
if (_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations))
|
||||||
|
{
|
||||||
|
await broadcastEventWriteService.CreateAsync(e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await storageEventWriteService.CreateAsync(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task CreateManyAsync(IEnumerable<IEvent> e)
|
||||||
|
{
|
||||||
|
if (_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations))
|
||||||
|
{
|
||||||
|
await broadcastEventWriteService.CreateManyAsync(e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await storageEventWriteService.CreateManyAsync(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -62,33 +62,39 @@ public class Startup
|
|||||||
{
|
{
|
||||||
services.AddSingleton<IApplicationCacheService, InMemoryApplicationCacheService>();
|
services.AddSingleton<IApplicationCacheService, InMemoryApplicationCacheService>();
|
||||||
}
|
}
|
||||||
services.AddScoped<IEventService, EventService>();
|
|
||||||
if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
|
if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
|
||||||
{
|
{
|
||||||
|
services.AddKeyedSingleton<IEventWriteService, AzureQueueEventWriteService>("storage");
|
||||||
|
|
||||||
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.ConnectionString) &&
|
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.ConnectionString) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.TopicName))
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.TopicName))
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, AzureServiceBusEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, AzureServiceBusEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, AzureQueueEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
services.AddKeyedSingleton<IEventWriteService, RepositoryEventWriteService>("storage");
|
||||||
|
|
||||||
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.HostName) &&
|
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.HostName) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Username) &&
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Username) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Password) &&
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Password) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.ExchangeName))
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.ExchangeName))
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, RabbitMqEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, RabbitMqEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, RepositoryEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
services.AddScoped<IEventWriteService, EventRouteService>();
|
||||||
|
services.AddScoped<IEventService, EventService>();
|
||||||
|
|
||||||
services.AddOptionality();
|
services.AddOptionality();
|
||||||
|
|
||||||
|
@ -332,34 +332,40 @@ public static class ServiceCollectionExtensions
|
|||||||
|
|
||||||
if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
|
if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
|
||||||
{
|
{
|
||||||
|
services.AddKeyedSingleton<IEventWriteService, AzureQueueEventWriteService>("storage");
|
||||||
|
|
||||||
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.ConnectionString) &&
|
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.ConnectionString) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.TopicName))
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.AzureServiceBus.TopicName))
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, AzureServiceBusEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, AzureServiceBusEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, AzureQueueEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (globalSettings.SelfHosted)
|
else if (globalSettings.SelfHosted)
|
||||||
{
|
{
|
||||||
|
services.AddKeyedSingleton<IEventWriteService, RepositoryEventWriteService>("storage");
|
||||||
|
|
||||||
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.HostName) &&
|
if (CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.HostName) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Username) &&
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Username) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Password) &&
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.Password) &&
|
||||||
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.ExchangeName))
|
CoreHelpers.SettingHasValue(globalSettings.EventLogging.RabbitMq.ExchangeName))
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, RabbitMqEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, RabbitMqEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, RepositoryEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
services.AddSingleton<IEventWriteService, NoopEventWriteService>();
|
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("storage");
|
||||||
|
services.AddKeyedSingleton<IEventWriteService, NoopEventWriteService>("broadcast");
|
||||||
}
|
}
|
||||||
|
services.AddScoped<IEventWriteService, EventRouteService>();
|
||||||
|
|
||||||
if (CoreHelpers.SettingHasValue(globalSettings.Attachment.ConnectionString))
|
if (CoreHelpers.SettingHasValue(globalSettings.Attachment.ConnectionString))
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
using Bit.Core.Models.Data;
|
||||||
|
using Bit.Core.Services;
|
||||||
|
using Bit.Test.Common.AutoFixture.Attributes;
|
||||||
|
using NSubstitute;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Bit.Core.Test.Services;
|
||||||
|
|
||||||
|
[SutProviderCustomize]
|
||||||
|
public class EventRouteServiceTests
|
||||||
|
{
|
||||||
|
private readonly IEventWriteService _broadcastEventWriteService = Substitute.For<IEventWriteService>();
|
||||||
|
private readonly IEventWriteService _storageEventWriteService = Substitute.For<IEventWriteService>();
|
||||||
|
private readonly IFeatureService _featureService = Substitute.For<IFeatureService>();
|
||||||
|
private readonly EventRouteService Subject;
|
||||||
|
|
||||||
|
public EventRouteServiceTests()
|
||||||
|
{
|
||||||
|
Subject = new EventRouteService(_broadcastEventWriteService, _storageEventWriteService, _featureService);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public async Task CreateAsync_FlagDisabled_EventSentToStorageService(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(false);
|
||||||
|
|
||||||
|
await Subject.CreateAsync(eventMessage);
|
||||||
|
|
||||||
|
_broadcastEventWriteService.DidNotReceiveWithAnyArgs().CreateAsync(Arg.Any<EventMessage>());
|
||||||
|
_storageEventWriteService.Received(1).CreateAsync(eventMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public async Task CreateAsync_FlagEnabled_EventSentToBroadcastService(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(true);
|
||||||
|
|
||||||
|
await Subject.CreateAsync(eventMessage);
|
||||||
|
|
||||||
|
_broadcastEventWriteService.Received(1).CreateAsync(eventMessage);
|
||||||
|
_storageEventWriteService.DidNotReceiveWithAnyArgs().CreateAsync(Arg.Any<EventMessage>());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public async Task CreateManyAsync_FlagDisabled_EventsSentToStorageService(IEnumerable<EventMessage> eventMessages)
|
||||||
|
{
|
||||||
|
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(false);
|
||||||
|
|
||||||
|
await Subject.CreateManyAsync(eventMessages);
|
||||||
|
|
||||||
|
_broadcastEventWriteService.DidNotReceiveWithAnyArgs().CreateManyAsync(Arg.Any<IEnumerable<EventMessage>>());
|
||||||
|
_storageEventWriteService.Received(1).CreateManyAsync(eventMessages);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public async Task CreateManyAsync_FlagEnabled_EventsSentToBroadcastService(IEnumerable<EventMessage> eventMessages)
|
||||||
|
{
|
||||||
|
_featureService.IsEnabled(FeatureFlagKeys.EventBasedOrganizationIntegrations).Returns(true);
|
||||||
|
|
||||||
|
await Subject.CreateManyAsync(eventMessages);
|
||||||
|
|
||||||
|
_broadcastEventWriteService.Received(1).CreateManyAsync(eventMessages);
|
||||||
|
_storageEventWriteService.DidNotReceiveWithAnyArgs().CreateManyAsync(Arg.Any<IEnumerable<EventMessage>>());
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user