using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Options;
using ZB.MOM.WW.ScadaBridge.Transport;
using ZB.MOM.WW.ScadaBridge.Transport.Signing;
namespace ZB.MOM.WW.ScadaBridge.Host.Health;
///
/// /health/ready entry (ScadaBridge#110): Degraded while a cluster marked
/// Transport:Signing:ProductionBoundary still accepts unsigned bundles. Degraded maps
/// to HTTP 200 in the shared health tier, so it is visible on the Overview dashboard without
/// taking the node out of rotation. Exposes only booleans — never key material.
///
public sealed class BundleSigningPolicyHealthCheck : IHealthCheck
{
private readonly IOptionsMonitor _options;
/// Initializes the check.
/// Transport options.
public BundleSigningPolicyHealthCheck(IOptionsMonitor options)
{
_options = options ?? throw new ArgumentNullException(nameof(options));
}
///
public Task CheckHealthAsync(
HealthCheckContext context, CancellationToken cancellationToken = default)
{
var signing = _options.CurrentValue.Signing;
var data = new Dictionary(StringComparer.Ordinal)
{
["productionBoundary"] = signing.ProductionBoundary,
["requireSignedBundles"] = signing.RequireSignedBundles,
["signingEnabled"] = signing.Enabled,
["trustedKeys"] = signing.TrustedKeys.Count,
};
var advisory = BundleSigningPolicyAdvisory.Evaluate(signing);
return Task.FromResult(advisory is null
? HealthCheckResult.Healthy("Bundle signing policy OK.", data)
: HealthCheckResult.Degraded(advisory, data: data));
}
}