7b0b9c7365
Solution + 23 src projects + 26 test projects renamed; folders, csproj, namespaces, and ScadaLinkDbContext/ScadaBridgeDbContext class updated. ActorSystem "scadalink" → "scadabridge", Akka seed-node URLs migrated. SQL roles/logins, LDAP domains, CLI command name, and CLI config dir (~/.scadalink → ~/.scadabridge) also renamed. Build green; 5 Host.Tests fail awaiting SQL login rename in next commit. Pre-existing StaleTagMonitor timing flakes unchanged. Rename script committed at tools/rename-to-scadabridge.sh.
46 lines
1.9 KiB
C#
46 lines
1.9 KiB
C#
using Akka.Cluster;
|
|
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
|
using ZB.MOM.WW.ScadaBridge.Host.Actors;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.Host.Health;
|
|
|
|
/// <summary>
|
|
/// Health check that returns healthy only if this node is the active (leader) node
|
|
/// in the Akka.NET cluster. Used by Traefik to route traffic to the active node.
|
|
/// </summary>
|
|
public class ActiveNodeHealthCheck : IHealthCheck
|
|
{
|
|
private readonly AkkaHostedService _akkaService;
|
|
|
|
/// <summary>Initializes a new <see cref="ActiveNodeHealthCheck"/> with the given Akka hosted service.</summary>
|
|
/// <param name="akkaService">The Akka hosted service providing access to the actor system and cluster state.</param>
|
|
public ActiveNodeHealthCheck(AkkaHostedService akkaService)
|
|
{
|
|
_akkaService = akkaService;
|
|
}
|
|
|
|
/// <summary>Returns healthy if this node is the cluster leader (active node); otherwise returns unhealthy.</summary>
|
|
/// <param name="context">Health check context providing registration details.</param>
|
|
/// <param name="cancellationToken">Cancellation token.</param>
|
|
public Task<HealthCheckResult> CheckHealthAsync(
|
|
HealthCheckContext context,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
var system = _akkaService.ActorSystem;
|
|
if (system == null)
|
|
return Task.FromResult(HealthCheckResult.Unhealthy("ActorSystem not yet available."));
|
|
|
|
var cluster = Cluster.Get(system);
|
|
var self = cluster.SelfMember;
|
|
|
|
if (self.Status != MemberStatus.Up)
|
|
return Task.FromResult(HealthCheckResult.Unhealthy($"Node not Up (status: {self.Status})."));
|
|
|
|
var leader = cluster.State.Leader;
|
|
if (leader != null && leader == self.Address)
|
|
return Task.FromResult(HealthCheckResult.Healthy("Active node (cluster leader)."));
|
|
|
|
return Task.FromResult(HealthCheckResult.Unhealthy("Standby node (not cluster leader)."));
|
|
}
|
|
}
|