public ClusterMonitorService( IServiceProvider sp, IClusterRequestHandler _node, IEntitiesRepository entitiesRepository, MetricManagementService metricManagementService, IMetricTicksRepository metricTicksRepository, IDatabaseMetricsCollector databaseMetricsCollector, NodeStateService nodeStateService, IOptions <ClusterOptions> clusterOptions) { _metricManagementService = metricManagementService; // var sp = serviceProvider.CreateScope().ServiceProvider; _mediator = sp.GetService <IMediator>(); _logger = sp.GetService <ILogger <ClusterMonitorService> >(); _state = sp.GetService <IClusterStateService>(); _logger.LogInformation("Starting clean up service..."); node = _node; _entitiesRepository = entitiesRepository; _metricTicksRepository = metricTicksRepository; _databaseMetricsCollector = databaseMetricsCollector; monitoringTimer = new System.Threading.Timer(CollectMetricsEventHandler); node.MetricGenerated += metricGenerated; _nodeStateService = nodeStateService; _clusterOptions = clusterOptions; Start(); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IClusterStateService service, ILogger <Startup> logger, IRaftService raftService, IDataService dataService, ITaskService taskService, IStateMachine <CindiClusterState> stateMachine, NodeStateService node, IDatabaseMetricsCollector collector, ClusterMonitorService monitor, IMediator mediator, IServiceProvider serviceProvider, MetricManagementService metricManagementService, InternalBotManager internalBotManager ) { BootstrapThread = new Task(() => { while (node.Status != ConsensusCore.Domain.Models.NodeStatus.Yellow && node.Status != ConsensusCore.Domain.Models.NodeStatus.Green ) { logger.LogInformation("Waiting for cluster to establish a quorum"); Thread.Sleep(1000); } var med = (IMediator)app.ApplicationServices.CreateScope().ServiceProvider.GetService(typeof(IMediator)); ClusterStateService.Initialized = stateMachine.CurrentState.Initialized; var key = Configuration.GetValue <string>("EncryptionKey"); if (key != null) { if (ClusterStateService.Initialized) { logger.LogWarning("Loading key in configuration file, this is not recommended for production."); try { service.SetEncryptionKey(key); logger.LogInformation("Successfully applied encryption key."); } catch (InvalidPrivateKeyException e) { logger.LogError("Failed to apply stored key. Key does not match registered encryption hash."); } } } if (!ClusterStateService.Initialized) { if (key != null) { logger.LogWarning("Initializing new node with key in configuration file, this is not recommended for production."); service.SetEncryptionKey(key); } else { logger.LogWarning("No default key detected, post key to /api/cluster/encryption-key."); } var setPassword = Configuration.GetValue <string>("DefaultPassword"); if (node.Role == ConsensusCore.Domain.Enums.NodeState.Leader) { // Thread.Sleep(5000); med.Send(new InitializeClusterCommand() { DefaultPassword = setPassword == null ? "PleaseChangeMe" : setPassword, Name = Configuration.GetValue <string>("ClusterName") }).GetAwaiter().GetResult(); } } if (node.Role == ConsensusCore.Domain.Enums.NodeState.Leader) { metricManagementService.InitializeMetricStore(); if (service.GetSettings == null) { logger.LogWarning("No setting detected, resetting settings to default."); med.Send(new UpdateClusterStateCommand() { DefaultIfNull = true }).GetAwaiter().GetResult();; } } foreach (var template in InternalStepLibrary.All) { med.Send(new CreateStepTemplateCommand() { Name = template.Name, InputDefinitions = template.InputDefinitions, OutputDefinitions = template.OutputDefinitions, CreatedBy = SystemUsers.SYSTEM_TEMPLATES_MANAGER, Version = template.Version, Description = template.Description }).GetAwaiter().GetResult(); } //internalBotManager.AddAdditionalBot(); }); BootstrapThread.Start(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); //c.OAuthUseBasicAuthenticationWithAccessCodeGrant(); }); app.UseCindiClusterPipeline(); app.UseAuthentication(); app.UseCors("AllowAll"); app.UseMvc(); if (EnableUI) { OverrideUISettings(); app.UseSpaStaticFiles(); app.UseSpa(spa => { // To learn more about options for serving an Angular SPA from ASP.NET Core, // see https://go.microsoft.com/fwlink/?linkid=864501 spa.Options.SourcePath = "ClientApp"; if (env.IsDevelopment()) { spa.UseAngularCliServer(npmScript: "start"); } }); } }