8dd9da7d4d
0.2.1 makes the shared ActiveNodeHealthCheck return Unhealthy (503), not
Degraded (200), for a node that carries the role but is not the role leader.
That is what the shared health spec always specified, what docs/ServiceHosting.md,
docs/v2/Architecture-v2.md and the 2026-05-26 alignment design all describe
("200 only on the Admin-role leader; 503 elsewhere"), and what
docker-dev/traefik-dynamic.yml + scripts/install/traefik-dynamic.yml assume when
they use /health/active as the load-balancer probe.
The implementation returned Degraded, which MapZbHealth maps to 200, so BOTH
central nodes always passed the probe and Traefik load-balanced the admin UI
across the pair instead of pinning it to the leader. The docs were right; the
code was wrong. Closes the Traefik half of #494.
No OtOpcUa code change — package pin only.
Live-verified on docker-dev, with the MAIN pair genuinely formed (memberCount 2,
both members naming one leader):
central-1 (leader) /health/active -> 200 traefik UP
central-2 (standby) /health/active -> 503 traefik DOWN
Failover drill (README step 2), which had never actually exercised anything:
stopping central-1 flipped Traefik to central-2 within 20 s and
http://localhost:9200/ answered 200 continuously across the swap — no outage.
Restarting central-1 reclaimed the role-leader and Traefik flipped back.
README corrected on two counts: the drill now states that exactly ONE backend is
UP by design, and step 3 no longer claims central-2 keeps leadership — RoleLeader
is the lowest-address member, so central-1 deterministically reclaims it. Added
the cold-boot caveat that starting both nodes at once can leave each self-forming
a 1-member cluster, in which case both are their own leader and both answer 200.
STILL OPEN in #494: driver-only nodes. The check is scoped to the admin role and
returns Healthy for any node that lacks it, so all four site nodes answer 200 and
the real per-Cluster redundancy Primary (oldest Up driver member, IsDriverPrimary)
is still not what this tier reports.
170 lines
12 KiB
XML
170 lines
12 KiB
XML
<Project>
|
|
<PropertyGroup>
|
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<PackageVersion Include="Akka" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Cluster" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Cluster.Hosting" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Cluster.Tools" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Hosting" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Logger.Serilog" Version="1.5.60" />
|
|
<PackageVersion Include="Akka.Remote" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Remote.Hosting" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Streams" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.Streams.TestKit" Version="1.5.62" />
|
|
<PackageVersion Include="Akka.TestKit.Xunit2" Version="1.5.62" />
|
|
<PackageVersion Include="Avalonia" Version="11.2.7" />
|
|
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.2.7" />
|
|
<PackageVersion Include="Avalonia.Desktop" Version="11.2.7" />
|
|
<PackageVersion Include="Avalonia.Diagnostics" Version="11.2.7" />
|
|
<PackageVersion Include="Avalonia.Fonts.Inter" Version="11.2.7" />
|
|
<PackageVersion Include="Avalonia.Headless" Version="11.2.7" />
|
|
<PackageVersion Include="Avalonia.Svg.Skia" Version="11.2.0.2" />
|
|
<PackageVersion Include="Avalonia.Themes.Fluent" Version="11.2.7" />
|
|
<PackageVersion Include="Beckhoff.TwinCAT.Ads" Version="7.0.172" />
|
|
<PackageVersion Include="bunit" Version="2.0.33-preview" />
|
|
<PackageVersion Include="CliFx" Version="2.3.6" />
|
|
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
|
|
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
|
|
<PackageVersion Include="FluentAssertions" Version="8.3.0" />
|
|
<PackageVersion Include="Google.Protobuf" Version="3.34.1" />
|
|
<PackageVersion Include="Grpc.AspNetCore" Version="2.76.0" />
|
|
<PackageVersion Include="Grpc.Core.Api" Version="2.76.0" />
|
|
<PackageVersion Include="Grpc.Net.Client" Version="2.76.0" />
|
|
<PackageVersion Include="Grpc.Tools" Version="2.76.0" />
|
|
<PackageVersion Include="libplctag" Version="1.5.2" />
|
|
<PackageVersion Include="MessagePack" Version="2.5.301" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.DataProtection" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="10.0.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Core" Version="1.2.0" />
|
|
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="10.0.7" />
|
|
<!--
|
|
Roslyn analyzer packages pin to the same major version as the SDK's compiler.
|
|
.NET SDK 10.0.105 ships compiler 5.0.0.0. Microsoft.CodeAnalysis.CSharp 5.3.x emits
|
|
analyzer DLLs that reference compiler 5.3.0.0 and fail with CS9057 on the local SDK.
|
|
Pin to 5.0.0 (matches the compiler the SDK ships) until the SDK rolls to 10.0.110+.
|
|
-->
|
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.0.0" />
|
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.12.0" />
|
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="5.0.0" />
|
|
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.1" />
|
|
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.FASTER.Core" Version="2.6.5" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.7" />
|
|
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.11.0" />
|
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
|
|
<PackageVersion Include="Microsoft.Playwright" Version="1.51.0" />
|
|
<PackageVersion Include="Moq" Version="4.20.72" />
|
|
<PackageVersion Include="Novell.Directory.Ldap.NETStandard" Version="3.6.0" />
|
|
<PackageVersion Include="OPCFoundation.NetStandard.Opc.Ua.Client" Version="1.5.378.106" />
|
|
<PackageVersion Include="OPCFoundation.NetStandard.Opc.Ua.Configuration" Version="1.5.378.106" />
|
|
<PackageVersion Include="OPCFoundation.NetStandard.Opc.Ua.Server" Version="1.5.378.106" />
|
|
<!-- OpenTelemetry.Api < 1.15.3 has GHSA-g94r-2vxg-569j (header-parsing memory DoS). The trio
|
|
is pulled transitively at 1.9.0; pin to 1.15.3 (matches the Extensions.Hosting pin below),
|
|
applied via a direct PackageReference in the Cluster project so the server stack inherits it. -->
|
|
<PackageVersion Include="OpenTelemetry" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Api" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="1.15.3" />
|
|
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.15.3-beta.1" />
|
|
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.3" />
|
|
<PackageVersion Include="Polly.Core" Version="8.6.6" />
|
|
<PackageVersion Include="S7netplus" Version="0.20.0" />
|
|
<PackageVersion Include="Serilog" Version="4.3.1" />
|
|
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
|
|
<PackageVersion Include="Serilog.Extensions.Hosting" Version="10.0.0" />
|
|
<PackageVersion Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
|
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
|
|
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
|
|
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
|
<PackageVersion Include="Shouldly" Version="4.3.0" />
|
|
<!--
|
|
Surgical transitive pin: Microsoft.Data.Sqlite pulls SQLitePCLRaw.bundle_e_sqlite3 2.1.11
|
|
(native lib.e_sqlite3 2.1.11 — the top of the CVE-2025-6965 / GHSA-2m69-gcr7-jv3q vulnerable
|
|
range, <= 2.1.11). 2.1.12 is the first fixed native bundle (embeds the SQLite 3.50.2+ patch).
|
|
A direct PackageReference in Core.AlarmHistorian promotes this to the resolved version,
|
|
clearing the advisory without CentralPackageTransitivePinningEnabled (which breaks the Roslyn split).
|
|
-->
|
|
<PackageVersion Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.12" />
|
|
<!--
|
|
Surgical transitive pin #2. Four NU1903 high-severity advisories (GHSA-23rf-6693-g89p,
|
|
GHSA-8q5v-6pqq-x66h, GHSA-cvvh-rhrc-wg4q, GHSA-g8r8-53c2-pm3f) landed in the NuGet audit
|
|
data against System.Security.Cryptography.Xml 10.0.7, which Microsoft.AspNetCore.DataProtection
|
|
10.0.7 pulls in transitively for its key storage. Under TreatWarningsAsErrors every FRESH
|
|
restore goes red — 204 NU1903 errors across the solution — while machines with cached audit
|
|
data keep building, so this surfaces first on a clean clone or a docker image build, not
|
|
locally. Verified 2026-07-21 by restoring a detached worktree.
|
|
|
|
10.0.10 is the patched version, pinned by direct PackageReference in Core.Configuration (the
|
|
one project where the DataProtection chain enters). Bumping the DataProtection parent to
|
|
10.0.10 instead was rejected in the sister repo for a reason that applies here too: it floors
|
|
Microsoft.Extensions.* and, through the EFCore adapter, Microsoft.EntityFrameworkCore at
|
|
10.0.10, forcing a family-wide servicing bump (NU1605 downgrade cascade) that deserves its own
|
|
reviewed change.
|
|
-->
|
|
<PackageVersion Include="System.Security.Cryptography.Xml" Version="10.0.10" />
|
|
<PackageVersion Include="System.CommandLine" Version="2.0.5" />
|
|
<PackageVersion Include="System.Data.SqlClient" Version="4.9.0" />
|
|
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.11.0" />
|
|
<PackageVersion Include="System.IO.Pipes.AccessControl" Version="5.0.0" />
|
|
<PackageVersion Include="System.Memory" Version="4.5.5" />
|
|
<PackageVersion Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
|
<!-- Tmds.DBus.Protocol < 0.21.3 has GHSA-xrw6-gwf8-vvr9 (High); pulled transitively by
|
|
Avalonia.X11 (Linux desktop). Pin to the patched 0.21.3 in the same 0.x line.
|
|
Applied via a direct PackageReference in the consuming desktop project(s). -->
|
|
<PackageVersion Include="Tmds.DBus.Protocol" Version="0.21.3" />
|
|
<!-- xunit v2 pin: AdminUI.Tests / ControlPlane.Tests / Runtime.Tests are held on v2 by
|
|
Akka.TestKit.Xunit2 (no xunit.v3 TestKit ships as of Akka 1.5.62 — both candidate ids
|
|
Akka.TestKit.Xunit3 / Akka.TestKit.Xunit.v3 return BlobNotFound on nuget.org, verified
|
|
2026-07-13). All 44 other test projects are on xunit.v3 1.1.0. Remove this pin and migrate
|
|
the 3 holdouts when Akka ships an xunit.v3 TestKit. (R2-12 / 07/C-4.) -->
|
|
<PackageVersion Include="xunit" Version="2.9.3" />
|
|
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
|
|
<PackageVersion Include="xunit.v3" Version="1.1.0" />
|
|
<PackageVersion Include="ZB.MOM.WW.Health" Version="0.2.1" />
|
|
<!--
|
|
LocalDb: embedded SQLite node-local cache + optional 2-node gRPC replication. The core
|
|
package floors the native SQLitePCLRaw.lib.e_sqlite3 at 2.1.12, so consumers inherit the
|
|
CVE-2025-6965-fixed native binary without needing the surgical pin below.
|
|
-->
|
|
<PackageVersion Include="ZB.MOM.WW.LocalDb" Version="0.1.3" />
|
|
<PackageVersion Include="ZB.MOM.WW.LocalDb.Replication" Version="0.1.3" />
|
|
<PackageVersion Include="ZB.MOM.WW.Health.Akka" Version="0.2.1" />
|
|
<PackageVersion Include="ZB.MOM.WW.Health.EntityFrameworkCore" Version="0.2.1" />
|
|
<PackageVersion Include="ZB.MOM.WW.Telemetry" Version="0.1.0" />
|
|
<PackageVersion Include="ZB.MOM.WW.Telemetry.Serilog" Version="0.1.0" />
|
|
<PackageVersion Include="ZB.MOM.WW.MxGateway.Client" Version="0.1.1" />
|
|
<PackageVersion Include="ZB.MOM.WW.MxGateway.Contracts" Version="0.1.1" />
|
|
<PackageVersion Include="ZB.MOM.WW.Configuration" Version="0.1.0" />
|
|
<PackageVersion Include="ZB.MOM.WW.Auth.Abstractions" Version="0.1.5" />
|
|
<PackageVersion Include="ZB.MOM.WW.Auth.Ldap" Version="0.1.5" />
|
|
<PackageVersion Include="ZB.MOM.WW.Auth.AspNetCore" Version="0.1.5" />
|
|
<PackageVersion Include="ZB.MOM.WW.Secrets" Version="0.2.3" />
|
|
<PackageVersion Include="ZB.MOM.WW.Secrets.Abstractions" Version="0.2.3" />
|
|
<PackageVersion Include="ZB.MOM.WW.Secrets.Ui" Version="0.2.3" />
|
|
<PackageVersion Include="ZB.MOM.WW.Secrets.Replicator.AkkaDotNet" Version="0.2.3" />
|
|
<PackageVersion Include="ZB.MOM.WW.Audit" Version="0.1.0" />
|
|
<PackageVersion Include="ZB.MOM.WW.Theme" Version="0.3.1" />
|
|
<PackageVersion Include="ZB.MOM.WW.HistorianGateway.Client" Version="0.3.0" />
|
|
<PackageVersion Include="ZB.MOM.WW.HistorianGateway.Contracts" Version="0.3.0" />
|
|
</ItemGroup>
|
|
</Project> |