fix: wire DCL connection state changes into ISiteHealthCollector

DataConnectionActor now calls UpdateConnectionHealth() on state
transitions (Connecting/Connected/Reconnecting) and UpdateTagResolution()
on connection establishment. DataConnectionManagerActor calls
RemoveConnection() on actor removal. Health reports now include
data connection statuses when instances are deployed with bindings.
This commit is contained in:
Joseph Doherty
2026-03-18 00:20:02 -04:00
parent 4f22ca2b1f
commit 75a6636a2c
6 changed files with 28 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ using ScadaLink.Commons.Interfaces.Protocol;
using ScadaLink.Commons.Messages.DataConnection;
using ScadaLink.Commons.Types.Enums;
using ScadaLink.DataConnectionLayer.Actors;
using ScadaLink.HealthMonitoring;
namespace ScadaLink.DataConnectionLayer.Tests;
@@ -21,11 +22,13 @@ public class DataConnectionActorTests : TestKit
{
private readonly IDataConnection _mockAdapter;
private readonly DataConnectionOptions _options;
private readonly ISiteHealthCollector _mockHealthCollector;
public DataConnectionActorTests()
: base(@"akka.loglevel = DEBUG")
{
_mockAdapter = Substitute.For<IDataConnection>();
_mockHealthCollector = Substitute.For<ISiteHealthCollector>();
_options = new DataConnectionOptions
{
ReconnectInterval = TimeSpan.FromMilliseconds(100),
@@ -37,7 +40,7 @@ public class DataConnectionActorTests : TestKit
private IActorRef CreateConnectionActor(string name = "test-conn")
{
return Sys.ActorOf(Props.Create(() =>
new DataConnectionActor(name, _mockAdapter, _options)), name);
new DataConnectionActor(name, _mockAdapter, _options, _mockHealthCollector)), name);
}
[Fact]

View File

@@ -4,6 +4,7 @@ using NSubstitute;
using ScadaLink.Commons.Interfaces.Protocol;
using ScadaLink.Commons.Messages.DataConnection;
using ScadaLink.DataConnectionLayer.Actors;
using ScadaLink.HealthMonitoring;
namespace ScadaLink.DataConnectionLayer.Tests;
@@ -14,11 +15,13 @@ public class DataConnectionManagerActorTests : TestKit
{
private readonly IDataConnectionFactory _mockFactory;
private readonly DataConnectionOptions _options;
private readonly ISiteHealthCollector _mockHealthCollector;
public DataConnectionManagerActorTests()
: base(@"akka.loglevel = DEBUG")
{
_mockFactory = Substitute.For<IDataConnectionFactory>();
_mockHealthCollector = Substitute.For<ISiteHealthCollector>();
_options = new DataConnectionOptions
{
ReconnectInterval = TimeSpan.FromMilliseconds(100),
@@ -30,7 +33,7 @@ public class DataConnectionManagerActorTests : TestKit
public void WriteToUnknownConnection_ReturnsError()
{
var manager = Sys.ActorOf(Props.Create(() =>
new DataConnectionManagerActor(_mockFactory, _options)));
new DataConnectionManagerActor(_mockFactory, _options, _mockHealthCollector)));
manager.Tell(new WriteTagRequest(
"corr1", "nonexistent", "tag1", 42, DateTimeOffset.UtcNow));
@@ -44,7 +47,7 @@ public class DataConnectionManagerActorTests : TestKit
public void SubscribeToUnknownConnection_ReturnsError()
{
var manager = Sys.ActorOf(Props.Create(() =>
new DataConnectionManagerActor(_mockFactory, _options)));
new DataConnectionManagerActor(_mockFactory, _options, _mockHealthCollector)));
manager.Tell(new SubscribeTagsRequest(
"corr1", "inst1", "nonexistent", ["tag1"], DateTimeOffset.UtcNow));
@@ -64,7 +67,7 @@ public class DataConnectionManagerActorTests : TestKit
.Returns(mockAdapter);
var manager = Sys.ActorOf(Props.Create(() =>
new DataConnectionManagerActor(_mockFactory, _options)));
new DataConnectionManagerActor(_mockFactory, _options, _mockHealthCollector)));
manager.Tell(new CreateConnectionCommand(
"conn1", "OpcUa", new Dictionary<string, string>()));