a25593a9c6
Group all 69 projects into category subfolders under src/ and tests/ so the Rider Solution Explorer mirrors the module structure. Folders: Core, Server, Drivers (with a nested Driver CLIs subfolder), Client, Tooling. - Move every project folder on disk with git mv (history preserved as renames). - Recompute relative paths in 57 .csproj files: cross-category ProjectReferences, the lib/ HintPath+None refs in Driver.Historian.Wonderware, and the external mxaccessgw refs in Driver.Galaxy and its test project. - Rebuild ZB.MOM.WW.OtOpcUa.slnx with nested solution folders. - Re-prefix project paths in functional scripts (e2e, compliance, smoke SQL, integration, install). Build green (0 errors); unit tests pass. Docs left for a separate pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
62 lines
2.8 KiB
C#
62 lines
2.8 KiB
C#
using ZB.MOM.WW.OtOpcUa.Configuration.Enums;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Configuration.Entities;
|
|
|
|
/// <summary>
|
|
/// Per-host connectivity snapshot the Server publishes for each driver's
|
|
/// <c>IHostConnectivityProbe.GetHostStatuses</c> entry. One row per
|
|
/// (<see cref="NodeId"/>, <see cref="DriverInstanceId"/>, <see cref="HostName"/>) triple —
|
|
/// a redundant 2-node cluster with one Galaxy driver reporting 3 platforms produces 6
|
|
/// rows, not 3, because each server node owns its own runtime view.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// <para>
|
|
/// Closes the data-layer piece of LMX follow-up #7 (per-AppEngine Admin dashboard
|
|
/// drill-down). The publisher hosted service on the Server side subscribes to every
|
|
/// registered driver's <c>OnHostStatusChanged</c> and upserts rows on transitions +
|
|
/// periodic liveness heartbeats. <see cref="LastSeenUtc"/> advances on every
|
|
/// heartbeat so the Admin UI can flag stale rows from a crashed Server.
|
|
/// </para>
|
|
/// <para>
|
|
/// No foreign-key to <see cref="ClusterNode"/> — a Server may start reporting host
|
|
/// status before its ClusterNode row exists (e.g. first-boot bootstrap), and we'd
|
|
/// rather keep the status row than drop it. The Admin-side service left-joins on
|
|
/// NodeId when presenting rows.
|
|
/// </para>
|
|
/// </remarks>
|
|
public sealed class DriverHostStatus
|
|
{
|
|
/// <summary>Server node that's running the driver.</summary>
|
|
public required string NodeId { get; set; }
|
|
|
|
/// <summary>Driver instance's stable id (matches <c>IDriver.DriverInstanceId</c>).</summary>
|
|
public required string DriverInstanceId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Driver-side host identifier — Galaxy Platform / AppEngine name, Modbus
|
|
/// <c>host:port</c>, whatever the probe returns. Opaque to the Admin UI except as
|
|
/// a display string.
|
|
/// </summary>
|
|
public required string HostName { get; set; }
|
|
|
|
public DriverHostState State { get; set; } = DriverHostState.Unknown;
|
|
|
|
/// <summary>Timestamp of the last state transition (not of the most recent heartbeat).</summary>
|
|
public DateTime StateChangedUtc { get; set; }
|
|
|
|
/// <summary>
|
|
/// Advances on every publisher heartbeat — the Admin UI uses
|
|
/// <c>now - LastSeenUtc > threshold</c> to flag rows whose owning Server has
|
|
/// stopped reporting (crashed, network-partitioned, etc.), independent of
|
|
/// <see cref="State"/>.
|
|
/// </summary>
|
|
public DateTime LastSeenUtc { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optional human-readable detail populated when <see cref="State"/> is
|
|
/// <see cref="DriverHostState.Faulted"/> — e.g. the exception message from the
|
|
/// driver's probe. Null for Running / Stopped / Unknown transitions.
|
|
/// </summary>
|
|
public string? Detail { get; set; }
|
|
}
|