Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
948cc90
First revision with commented code in implementation regarding settin…
ramonsmits Aug 30, 2023
019acb2
Validating some settings values at persister creation and setting def…
ramonsmits Aug 30, 2023
e8074fc
PersisterSettings converted into marker interface to that at runtime …
ramonsmits Aug 30, 2023
522e22a
Refactorings on SettingsReader
ramonsmits Aug 30, 2023
4c549c3
⚜️ Code readability
ramonsmits Aug 30, 2023
efe504e
🔨 Settings readers now using `TypeDescriptor.GetConverter` as `Conve…
ramonsmits Aug 30, 2023
9ab432e
⚜️ Improved readability of free/total storage log entries
ramonsmits Aug 30, 2023
c39879a
`PersistenceFactory.Create` now only takes a dependency on `Settings`…
ramonsmits Aug 30, 2023
2e56ab7
small tweaks
tmasternak Aug 31, 2023
7f53ccd
⚜️Code readability
ramonsmits Aug 31, 2023
f35962b
🔨 Removed settings from app config by extending settings constructor…
ramonsmits Aug 31, 2023
986b35e
🩹 Fix test, specify required setting values
ramonsmits Aug 31, 2023
c455f92
fixing maintenance mode startup
tmasternak Aug 31, 2023
f4fb20e
maintenance mode test
tmasternak Aug 31, 2023
668e498
startup mode test
tmasternak Sep 1, 2023
3d0941c
customcheck tests using persister settings directly
tmasternak Sep 1, 2023
643f729
bringing back the done condition in custom check tests
tmasternak Sep 1, 2023
1df8825
removing obsolete todos
tmasternak Sep 1, 2023
5b25df5
no generic persistence settings registration in DI
tmasternak Sep 1, 2023
f56a392
cleanup
tmasternak Sep 1, 2023
937f273
cleanup
tmasternak Sep 1, 2023
a0e2fca
tweaking approval tests for custom checks
tmasternak Sep 1, 2023
c863d94
removing todo
tmasternak Sep 1, 2023
12a51f4
import failed messages command fixing using
tmasternak Sep 1, 2023
f320095
maintenance settings moved to the ravendb specific settings class
tmasternak Sep 1, 2023
d80197a
maintenance settings moved to the ravendb specific settings class
tmasternak Sep 1, 2023
785c03e
Enabled test ServiceControl.UnitTests.API.APIApprovals::PlatformSampl…
ramonsmits Sep 1, 2023
52ed580
⚜️ Appsettings cleanup, applied formatting. XML files seem to be usin…
ramonsmits Sep 1, 2023
c1c31b7
⚜️ Strange editor config references
ramonsmits Sep 1, 2023
971aba2
🐛 Envvar settings reader behavior aligned to all support underscore r…
ramonsmits Sep 4, 2023
6ffc71b
🩹 Validate if connection string value exists
ramonsmits Sep 4, 2023
4d53a3b
Removed C:\ usage
ramonsmits Sep 1, 2023
6768d69
Fix commit b4944bbd2114cd0f14d6543141742f919cfe8656.
ramonsmits Sep 5, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
namespace ServiceControl.AcceptanceTests
{
using System.Collections.Generic;
using System;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Threading.Tasks;
using Persistence.RavenDb;
using ServiceBus.Management.Infrastructure.Settings;

class AcceptanceTestStorageConfiguration
{
public string PersistenceType { get; protected set; }

public Task<IDictionary<string, string>> CustomizeSettings()
public void CustomizeSettings(Settings settings)
{
return Task.FromResult<IDictionary<string, string>>(new Dictionary<string, string>
settings.PersisterSpecificSettings = new RavenDBPersisterSettings
{
{ "RavenDB35/RunInMemory", bool.TrueString},
{ "DatabaseMaintenancePort", FindAvailablePort(33334).ToString()},
{ "HostName", "localhost" }
});
RunInMemory = true,
DatabaseMaintenancePort = FindAvailablePort(settings.Port + 1),
DatabasePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()),
ErrorRetentionPeriod = TimeSpan.FromDays(10),
};
}

public Task Configure()
Expand Down
3 changes: 0 additions & 3 deletions src/ServiceControl.AcceptanceTests.RavenDB/App.config
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ServiceControl/ForwardErrorMessages" value="false" />
<add key="Raven/Esent/MaxVerPages" value="4096" />
<add key="ServiceControl/ErrorRetentionPeriod" value="10.00:00:00" />
<add key="ServiceControl/AllowMessageEditing" value="true"/>
</appSettings>
<runtime>
<gcServer enabled="true" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
using ServiceBus.Management.Infrastructure.Settings;
using ServiceControl.AcceptanceTests;
using ServiceControl.AcceptanceTests.TestSupport.EndpointTemplates;
using ServiceControl.Persistence;
using ServiceControl.Persistence.RavenDb.SagaAudit;
using ServiceControl.SagaAudit;

Expand All @@ -34,7 +33,7 @@ public async Task

//Override the configuration of the check in the container in order to make it run more frequently for testing purposes.
CustomizeHostBuilder = hostBuilder => hostBuilder.ConfigureServices((ctx, services) =>
services.AddTransient<ICustomCheck, AuditRetentionCustomCheck>(provider => new AuditRetentionCustomCheck(provider.GetRequiredService<IDocumentStore>(), provider.GetRequiredService<PersistenceSettings>(), TimeSpan.FromSeconds(10))));
services.AddTransient<ICustomCheck, AuditRetentionCustomCheck>(provider => new AuditRetentionCustomCheck(provider.GetRequiredService<IDocumentStore>(), provider.GetRequiredService<RavenDBPersisterSettings>(), TimeSpan.FromSeconds(10))));

SingleResult<EventLogItem> customCheckEventEntry = default;
bool sagaAudiDataInMainInstanceIsAvailableForQuery = false;
Expand Down
69 changes: 69 additions & 0 deletions src/ServiceControl.AcceptanceTests.RavenDB/StartupModeTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
namespace ServiceControl.AcceptanceTests.RavenDB
{
using System;
using System.Threading.Tasks;
using Hosting.Commands;
using NServiceBus;
using NUnit.Framework;
using Particular.ServiceControl;
using Particular.ServiceControl.Hosting;
using Persistence.RavenDb;
using ServiceBus.Management.Infrastructure.Settings;
using ServiceControl.AcceptanceTesting.InfrastructureConfig;

class StartupModeTests : AcceptanceTest
{
Settings settings;

[SetUp]
public void InitializeSettings()
{
var transportIntegration = new ConfigureEndpointLearningTransport();
settings = new Settings(
forwardErrorMessages: false,
errorRetentionPeriod: TimeSpan.FromDays(1),
persisterType: typeof(RavenDbPersistenceConfiguration).AssemblyQualifiedName)
{
PersisterSpecificSettings = new RavenDBPersisterSettings
{
ErrorRetentionPeriod = TimeSpan.FromDays(1),
RunInMemory = true
},
TransportType = transportIntegration.TypeName,
TransportConnectionString = transportIntegration.ConnectionString
};
}

[Test]
public async Task CanRunMaintenanceMode()
{
var bootstrapper = new MaintenanceBootstrapper(settings);

var host = bootstrapper.HostBuilder.Build();

await host.StartAsync();
await host.StopAsync();
}

[Test]
public async Task CanRunImportFailedMessagesMode()
{
await new TestableImportFailedErrorsCommand().Execute(new HostArguments(Array.Empty<string>()), settings);
}

class TestableImportFailedErrorsCommand : ImportFailedErrorsCommand
{
protected override EndpointConfiguration CreateEndpointConfiguration(Settings settings)
{
var configuration = base.CreateEndpointConfiguration(settings);

//HINT: we want to exclude this assembly to prevent loading features that are part of the acceptance testing framework
var thisAssembly = new[] { typeof(StartupModeTests).Assembly.GetName().Name };

configuration.AssemblyScanner().ExcludeAssemblies(thisAssembly);

return configuration;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@
{
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AcceptanceTesting;
using MessageFailures.Api;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NServiceBus;
using NServiceBus.AcceptanceTesting;
using NUnit.Framework;
using Persistence;
using ServiceBus.Management.Infrastructure.Settings;
using TestSupport.EndpointTemplates;

Expand All @@ -28,35 +24,19 @@ public void SetupIngestion()
};
}

class PersisterSettingsRetriever : IHostedService
{
static PersistenceSettings _persistenceSettings;

public PersisterSettingsRetriever(PersistenceSettings persistenceSettings, int value)
{
_persistenceSettings = persistenceSettings;
SetMinimumStorageLeftForIngestion(value);
}

public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask;
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;

public static void SetMinimumStorageLeftForIngestion(int value) => _persistenceSettings.PersisterSpecificSettings["MinimumStorageLeftRequiredForIngestion"] = value.ToString();
}
RavenDBPersisterSettings PersisterSettings => (RavenDBPersisterSettings)Settings.PersisterSpecificSettings;

[Test]
public async Task Should_stop_ingestion()
{
CustomizeHostBuilder = hostBuilder => hostBuilder.ConfigureServices(services => services.AddHostedService(b => new PersisterSettingsRetriever(b.GetRequiredService<PersistenceSettings>(), 0)));

await Define<ScenarioContext>()
.WithEndpoint<Sender>(b => b
.When(context =>
{
return context.Logs.ToArray().Any(i => i.Message.StartsWith("Ensure started. Infrastructure started"));
}, (_, __) =>
{
PersisterSettingsRetriever.SetMinimumStorageLeftForIngestion(100);
PersisterSettings.MinimumStorageLeftRequiredForIngestion = 100;
return Task.CompletedTask;
})
.When(context =>
Expand All @@ -67,14 +47,13 @@ await Define<ScenarioContext>()
}, (bus, c) => bus.SendLocal(new MyMessage())
)
.DoNotFailOnErrorMessages())
//.Done(async c => await this.TryGetSingle<FailedMessageView>("/api/errors") == false)
.Done(async c => await this.TryGetSingle<FailedMessageView>("/api/errors") == false)
.Run();
}

[Test]
public async Task Should_stop_ingestion_and_resume_when_more_space_is_available()
{
CustomizeHostBuilder = hostBuilder => hostBuilder.ConfigureServices(services => services.AddHostedService(b => new PersisterSettingsRetriever(b.GetRequiredService<PersistenceSettings>(), 0)));
var ingestionShutdown = false;

await Define<ScenarioContext>()
Expand All @@ -86,7 +65,7 @@ await Define<ScenarioContext>()
"Ensure started. Infrastructure started"));
}, (session, context) =>
{
PersisterSettingsRetriever.SetMinimumStorageLeftForIngestion(100);
PersisterSettings.MinimumStorageLeftRequiredForIngestion = 100;
return Task.CompletedTask;
})
.When(context =>
Expand All @@ -103,7 +82,7 @@ await Define<ScenarioContext>()
})
.When(c => ingestionShutdown, (session, context) =>
{
PersisterSettingsRetriever.SetMinimumStorageLeftForIngestion(0);
PersisterSettings.MinimumStorageLeftRequiredForIngestion = 0;
return Task.CompletedTask;
})
.DoNotFailOnErrorMessages())
Expand Down
2 changes: 1 addition & 1 deletion src/ServiceControl.AcceptanceTests/RootControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task Should_gather_remote_data()
{
hostBuilder.ConfigureServices((hostBuilderContext, services) =>
{
services.AddSingleton(new Settings(serviceName)
services.AddSingleton(new Settings(serviceName, forwardErrorMessages: false, errorRetentionPeriod: TimeSpan.FromDays(10))
{
RemoteInstances = new[]
{
Expand Down
11 changes: 10 additions & 1 deletion src/ServiceControl.AcceptanceTests/TestSupport/AcceptanceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,16 @@ public async Task Setup()

await StorageConfiguration.Configure();

serviceControlRunnerBehavior = new ServiceControlComponentBehavior(TransportIntegration, StorageConfiguration, s => SetSettings(s), s => CustomConfiguration(s), hb => CustomizeHostBuilder(hb));
serviceControlRunnerBehavior = new ServiceControlComponentBehavior(
TransportIntegration,
StorageConfiguration,
s =>
{
SetSettings(s);
},
s => CustomConfiguration(s),
hb => CustomizeHostBuilder(hb)
);
}

[TearDown]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,22 +70,13 @@ static int FindAvailablePort(int startPort)
async Task InitializeServiceControl(ScenarioContext context)
{
var instancePort = FindAvailablePort(33333);
var maintenancePort = FindAvailablePort(instancePort + 1);

ConfigurationManager.AppSettings.Set("ServiceControl/TransportType", transportToUse.TypeName);

// TODO: ⬇️ This is required for the PERSISTER implementation to actually retrieve the DBPath settings are persister isn't using this type-safe settings class
var dbPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
ConfigurationManager.AppSettings.Set("ServiceControl/DBPath", dbPath); // TODO: Tests should not use static ConfigurationManager.AppSettings
ConfigurationManager.AppSettings.Set("ServiceControl/DatabaseMaintenancePort", "33434");
ConfigurationManager.AppSettings.Set("ServiceControl/ExposeRavenDB", "False");
// TODO: ⬆️

var settings = new Settings(instanceName, transportToUse.TypeName, persistenceToUse.PersistenceType)
var settings = new Settings(instanceName, transportToUse.TypeName, persistenceToUse.PersistenceType, forwardErrorMessages: false, errorRetentionPeriod: TimeSpan.FromDays(10))
{
AllowMessageEditing = true,
Port = instancePort,
DatabaseMaintenancePort = maintenancePort,
DbPath = dbPath,
ForwardErrorMessages = false,
TransportConnectionString = transportToUse.ConnectionString,
ProcessRetryBatchesFrequency = TimeSpan.FromSeconds(2),
Expand Down Expand Up @@ -124,19 +115,14 @@ async Task InitializeServiceControl(ScenarioContext context)
}

return false;
}
},
};

persistenceToUse.CustomizeSettings(settings);

setSettings(settings);
Settings = settings;

var persisterSpecificSettings = await persistenceToUse.CustomizeSettings();

foreach (var persisterSpecificSetting in persisterSpecificSettings)
{
ConfigurationManager.AppSettings.Set($"ServiceControl/{persisterSpecificSetting.Key}", persisterSpecificSetting.Value);
}

using (new DiagnosticTimer($"Creating infrastructure for {instanceName}"))
{

Expand Down Expand Up @@ -223,7 +209,7 @@ public override async Task Stop()
await host.StopAsync();
HttpClient.Dispose();
Handler.Dispose();
DirectoryDeleter.Delete(Settings.DbPath);
DirectoryDeleter.Delete(Settings.PersisterSpecificSettings.DatabasePath);
}

bootstrapper = null;
Expand Down
23 changes: 11 additions & 12 deletions src/ServiceControl.Audit/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ These settings are only here so that we can debug ServiceControl while developin
<add key="ServiceControl.Audit/ServiceControlQueueAddress" value="Particular.ServiceControl" />

<add key="ServiceControl.Audit/TransportType" value="LearningTransport" />

<!-- DEVS - Pick a transport to run Auditing instance on
<add key="ServiceControl.Audit/TransportType" value="AmazonSQS" />
<add key="ServiceControl.Audit/TransportType" value="LearningTransport" />
Expand All @@ -19,32 +19,32 @@ These settings are only here so that we can debug ServiceControl while developin
<add key="ServiceControl.Audit/TransportType" value="RabbitMQ.QuorumConventionalRouting" />
<add key="ServiceControl.Audit/TransportType" value="SQLServer" />
-->

<add key="ServiceControl.Audit/PersistenceType" value="InMemory" />

<!-- DEVS - Pick a persistence to run Auditing instance on.
Note that the RavenDB5 persistence requires the DBPath and LogPath settings

<add key="ServiceControl.Audit/PersistenceType" value="InMemory" />

<add key="ServiceControl.Audit/PersistenceType" value="RavenDb35" />
<add key="ServiceControl.Audit/RavenDB35/RunInMemory" value="true" />

<add key="ServiceControl.Audit/PersistenceType" value="RavenDb5" />
<add key="ServiceControl.Audit/DBPath" value="c:\tmp\audit_db" />
<add key="ServiceControl.Audit/LogPath" value="c:\tmp\audit_logs" />
<add key="ServiceControl.Audit/DBPath" value="%TEMP%\audit_db" />
<add key="ServiceControl.Audit/LogPath" value="%TEMP%\audit_logs" />
-->

<add key="ServiceControl.Audit/HostName" value="localhost" />
<!-- The default ServiceControl.Audit http port is 44444, the databaase maintenance port must be different -->
<add key="ServiceControl.Audit/DatabaseMaintenancePort" value="44445" />

</appSettings>
<connectionStrings>
<!-- DEVS - Pick a transport connection string to match chosen transport above -->

<!-- Learning -->
<add name="NServiceBus/Transport" connectionString="C:\tmp\" />
<add name="NServiceBus/Transport" connectionString="%TEMP%\.learningtransport" />

<!--Amazon SQS -->
<!--<add name="NServiceBus/Transport" connectionString="Region=;QueueNamePrefix=;TopicNamePrefix=;AccessKeyId=;SecretAccessKey=;S3BucketForLargeMessages=;S3KeyPrefix=" />-->
Expand All @@ -63,8 +63,7 @@ These settings are only here so that we can debug ServiceControl while developin

<!--SQLServer -->
<!--<add name="NServiceBus/Transport" connectionString="Data Source=<SQLInstance>;Initial Catalog=nservicebus;Integrated Security=True;Queue Schema=myschema;Subscriptions Table=tablename@schema@catalog" />-->



</connectionStrings>
<runtime>
<gcServer enabled="true" />
Expand Down
Loading