diff --git a/TransactionProcessor.Tests/General/BootstrapperTests.cs b/TransactionProcessor.Tests/General/BootstrapperTests.cs index 61bae102..34657fe8 100644 --- a/TransactionProcessor.Tests/General/BootstrapperTests.cs +++ b/TransactionProcessor.Tests/General/BootstrapperTests.cs @@ -52,6 +52,7 @@ private IConfigurationRoot SetupMemoryConfiguration() configuration.Add("AppSettings:ClientSecret", "clientSecret"); configuration.Add("AppSettings:EstateManagementApi", "http://localhost"); configuration.Add("AppSettings:SecurityService", "http://localhost"); + configuration.Add("SecurityConfiguration:Authority", "http://localhost"); builder.AddInMemoryCollection(configuration); diff --git a/TransactionProcessor/Startup.cs b/TransactionProcessor/Startup.cs index 196dfb38..75221b5a 100644 --- a/TransactionProcessor/Startup.cs +++ b/TransactionProcessor/Startup.cs @@ -26,11 +26,14 @@ namespace TransactionProcessor using Common; using EstateManagement.Client; using EventStore.Client; + using HealthChecks.UI.Client; using MediatR; using MessagingService.BusinessLogic.EventHandling; using Microsoft.AspNetCore.Authentication.JwtBearer; + using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Versioning; + using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Logging; using Models; @@ -69,6 +72,10 @@ public Startup(IWebHostEnvironment webHostEnvironment) // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { + ConfigurationReader.Initialise(Startup.Configuration); + + Startup.ConfigureEventStoreSettings(); + this.ConfigureMiddlewareServices(services); services.AddTransient(); @@ -107,51 +114,8 @@ public void ConfigureServices(IServiceCollection services) } else { - services.AddEventStoreClient((settings) => - { - settings.CreateHttpMessageHandler = () => new SocketsHttpHandler - { - SslOptions = - { - RemoteCertificateValidationCallback = (sender, - certificate, - chain, - errors) => true, - } - }; - settings.ConnectionName = Startup.Configuration.GetValue("EventStoreSettings:ConnectionName"); - settings.ConnectivitySettings = new EventStoreClientConnectivitySettings - { - Address = - new Uri(Startup.Configuration.GetValue("EventStoreSettings:ConnectionString")), - }; - settings.DefaultCredentials = new UserCredentials(Startup.Configuration.GetValue("EventStoreSettings:UserName"), - Startup.Configuration.GetValue("EventStoreSettings:Password")); - }); - - - - services.AddEventStoreProjectionManagerClient((settings) => - { - settings.CreateHttpMessageHandler = () => new SocketsHttpHandler - { - SslOptions = - { - RemoteCertificateValidationCallback = (sender, - certificate, - chain, - errors) => true, - } - }; - settings.ConnectionName = Startup.Configuration.GetValue("EventStoreSettings:ConnectionName"); - settings.ConnectivitySettings = new EventStoreClientConnectivitySettings - { - Address = - new Uri(Startup.Configuration.GetValue("EventStoreSettings:ConnectionString")) - }; - settings.DefaultCredentials = new UserCredentials(Startup.Configuration.GetValue("EventStoreSettings:UserName"), - Startup.Configuration.GetValue("EventStoreSettings:Password")); - }); + services.AddEventStoreClient(Startup.ConfigureEventStoreSettings); + services.AddEventStoreProjectionManagerClient(Startup.ConfigureEventStoreSettings); } services.AddTransient(); @@ -206,10 +170,55 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); } - + private static EventStoreClientSettings EventStoreClientSettings; + + private static void ConfigureEventStoreSettings(EventStoreClientSettings settings = null) + { + if (settings == null) + { + settings = new EventStoreClientSettings(); + } + + settings.CreateHttpMessageHandler = () => new SocketsHttpHandler + { + SslOptions = + { + RemoteCertificateValidationCallback = (sender, + certificate, + chain, + errors) => true, + } + }; + settings.ConnectionName = Startup.Configuration.GetValue("EventStoreSettings:ConnectionName"); + settings.ConnectivitySettings = new EventStoreClientConnectivitySettings + { + Address = new Uri(Startup.Configuration.GetValue("EventStoreSettings:ConnectionString")), + }; + + settings.DefaultCredentials = new UserCredentials(Startup.Configuration.GetValue("EventStoreSettings:UserName"), + Startup.Configuration.GetValue("EventStoreSettings:Password")); + Startup.EventStoreClientSettings = settings; + } private void ConfigureMiddlewareServices(IServiceCollection services) { + services.AddHealthChecks() + .AddEventStore(Startup.EventStoreClientSettings, + userCredentials: Startup.EventStoreClientSettings.DefaultCredentials, + name: "Eventstore", + failureStatus: HealthStatus.Unhealthy, + tags: new string[] { "db", "eventstore" }) + .AddUrlGroup(new Uri($"{ConfigurationReader.GetValue("SecurityConfiguration", "Authority")}/.well-known/openid-configuration"), + name: "Security Service", + httpMethod: HttpMethod.Get, + failureStatus: HealthStatus.Unhealthy, + tags: new string[] { "security", "authorisation" }) + .AddUrlGroup(new Uri($"{ConfigurationReader.GetValue("AppSettings", "EstateManagementApi")}/.well-known/openid-configuration"), + name: "Estate Management Service", + httpMethod: HttpMethod.Get, + failureStatus: HealthStatus.Unhealthy, + tags: new string[] { "application", "estatemanagement" }); + services.AddApiVersioning( options => { @@ -299,8 +308,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF Logger.Initialise(logger); - ConfigurationReader.Initialise(Startup.Configuration); - app.AddRequestLogging(); app.AddResponseLogging(); app.AddExceptionHandler(); @@ -313,6 +320,11 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF app.UseEndpoints(endpoints => { endpoints.MapControllers(); + endpoints.MapHealthChecks("health", new HealthCheckOptions() + { + Predicate = _ => true, + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse + }); }); app.UseSwagger(); @@ -326,17 +338,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); } }); - - //if (String.Compare(ConfigurationReader.GetValue("EventStoreSettings", "START_PROJECTIONS"), - // Boolean.TrueString, - // StringComparison.InvariantCultureIgnoreCase) == 0) - //{ - // app.PreWarm(true).Wait(); - //} - //else - //{ - // app.PreWarm(); - //} } } } diff --git a/TransactionProcessor/TransactionProcessor.csproj b/TransactionProcessor/TransactionProcessor.csproj index 39c3b75a..cb49b697 100644 --- a/TransactionProcessor/TransactionProcessor.csproj +++ b/TransactionProcessor/TransactionProcessor.csproj @@ -6,7 +6,12 @@ - + + + + + + @@ -19,7 +24,8 @@ - + +