feat(mtconnect): host registration + DriverTypeNames const + guard parity (Task 16)
Register the MTConnect factory + probe with the Host, add the DriverTypeNames.MTConnect constant, and keep DriverTypeNamesGuardTests green. - DriverTypeNames: new MTConnect const + appended to All. - DriverFactoryBootstrap: MTConnectDriverFactoryExtensions.Register in Register(...) at the default Tier A (managed HttpClient/XML, in-process; Tier C is the only tier arming process-recycle, wrong here), and TryAddEnumerable(IDriverProbe -> MTConnectDriverProbe) in AddOtOpcUaDriverProbes so the probe reaches admin-only nodes (the admin-pinned Test-Connect singleton) without double-registering on a fused admin,driver node. - Host.csproj: ProjectReference to Driver.MTConnect (required to compile the Register call). - Core.Abstractions.Tests.csproj: ProjectReference to Driver.MTConnect so the guard's bin scan discovers the factory. This and the constant MUST land together -- verified RED (2/4 facts) with the constant alone. - DriverProbeRegistrationTests: MTConnect added to AdminUiDriverTypeKeys; its idempotency fact asserts distinct-probe-count and goes RED without this (and RED if TryAddEnumerable is downgraded to AddSingleton). Reconciles all four "MTConnect" literals onto the one constant: the factory's DriverTypeName, MTConnectDriver.DriverType, and MTConnectDriverProbe.DriverType now all alias DriverTypeNames.MTConnect (no circular reference -- Core.Abstractions is a leaf both driver projects already reference). This is the repo's TwinCat/Focas anti-drift convention.
This commit is contained in:
@@ -58,6 +58,9 @@ public static class DriverTypeNames
|
|||||||
/// <summary>MQTT / Sparkplug B broker-subscription driver.</summary>
|
/// <summary>MQTT / Sparkplug B broker-subscription driver.</summary>
|
||||||
public const string Mqtt = "Mqtt";
|
public const string Mqtt = "Mqtt";
|
||||||
|
|
||||||
|
/// <summary>MTConnect Agent driver — read-only HTTP/XML over an Agent's probe/current/sample surface.</summary>
|
||||||
|
public const string MTConnect = "MTConnect";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Every driver-type string declared above, for callers that need to enumerate
|
/// Every driver-type string declared above, for callers that need to enumerate
|
||||||
/// the full set (e.g. validation of an authored <c>DriverType</c>).
|
/// the full set (e.g. validation of an authored <c>DriverType</c>).
|
||||||
@@ -75,5 +78,6 @@ public static class DriverTypeNames
|
|||||||
Calculation,
|
Calculation,
|
||||||
Sql,
|
Sql,
|
||||||
Mqtt,
|
Mqtt,
|
||||||
|
MTConnect,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -386,7 +386,12 @@ public sealed class MTConnectDriver : IDriver, IReadable, ISubscribable, ITagDis
|
|||||||
public string DriverInstanceId => _driverInstanceId;
|
public string DriverInstanceId => _driverInstanceId;
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public string DriverType => "MTConnect";
|
/// <remarks>
|
||||||
|
/// Sourced from the <see cref="DriverTypeNames"/> constant rather than a literal — the
|
||||||
|
/// repo-wide fix for the historical <c>TwinCat</c>/<c>Focas</c> drift, where a driver's own
|
||||||
|
/// spelling diverged from the constant every dispatch map keys off.
|
||||||
|
/// </remarks>
|
||||||
|
public string DriverType => DriverTypeNames.MTConnect;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The live <c>dataItemId → snapshot</c> map that backs the <b>subscription</b> surface:
|
/// The live <c>dataItemId → snapshot</c> map that backs the <b>subscription</b> surface:
|
||||||
|
|||||||
@@ -45,13 +45,16 @@ public static class MTConnectDriverFactoryExtensions
|
|||||||
/// The <c>DriverInstance.DriverType</c> value this factory answers to.
|
/// The <c>DriverInstance.DriverType</c> value this factory answers to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Kept identical to <see cref="MTConnectDriver.DriverType"/> — the registry key and the
|
/// <b>Aliased to <see cref="DriverTypeNames.MTConnect"/>, not a literal.</b> The registry key,
|
||||||
/// instance's self-reported type must agree or the runtime would look the driver up under a
|
/// the instance's self-reported <see cref="MTConnectDriver.DriverType"/>, the probe's
|
||||||
/// name it never registered. Task 16 adds the matching <c>DriverTypeNames.MTConnect</c>
|
/// <c>DriverType</c>, and the constant every dispatch map keys off are therefore the same
|
||||||
/// constant (the repo's convention is that dispatch maps key off those constants) and wires
|
/// symbol — the repo-wide fix for the historical <c>TwinCat</c>/<c>Focas</c> drift, where a
|
||||||
/// the Host registration + guard test; this literal is what that constant must equal.
|
/// driver's own spelling silently diverged from the constant and dispatch maps missed it.
|
||||||
|
/// Retained as a named const (rather than deleted in favour of the constant) so the existing
|
||||||
|
/// factory callers and the sibling <c>*DriverFactoryExtensions.DriverTypeName</c> convention
|
||||||
|
/// keep working; it is now an alias with no independent value.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public const string DriverTypeName = "MTConnect";
|
public const string DriverTypeName = DriverTypeNames.MTConnect;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Register the MTConnect factory with the driver registry. The optional
|
/// Register the MTConnect factory with the driver registry. The optional
|
||||||
|
|||||||
@@ -86,7 +86,12 @@ public sealed class MTConnectDriverProbe : IDriverProbe
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string DriverType => "MTConnect";
|
/// <remarks>
|
||||||
|
/// Sourced from the <see cref="DriverTypeNames"/> constant, not a literal — the probe is
|
||||||
|
/// looked up by <c>AdminOperationsActor</c> under this key, so a drift from the constant
|
||||||
|
/// silently disables the Test Connect button rather than failing anything at build time.
|
||||||
|
/// </remarks>
|
||||||
|
public string DriverType => DriverTypeNames.MTConnect;
|
||||||
|
|
||||||
/// <summary>Minimal probe-only config shape. Deliberately independent of the factory DTO — see the type remarks.</summary>
|
/// <summary>Minimal probe-only config shape. Deliberately independent of the factory DTO — see the type remarks.</summary>
|
||||||
private sealed class MTConnectProbeConfigDto
|
private sealed class MTConnectProbeConfigDto
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ using GalaxyProbe = Driver.Galaxy.GalaxyDriverProbe;
|
|||||||
using CalculationProbe = Driver.Calculation.CalculationDriverProbe;
|
using CalculationProbe = Driver.Calculation.CalculationDriverProbe;
|
||||||
using SqlProbe = Driver.Sql.SqlDriverProbe;
|
using SqlProbe = Driver.Sql.SqlDriverProbe;
|
||||||
using MqttProbe = Driver.Mqtt.MqttDriverProbe;
|
using MqttProbe = Driver.Mqtt.MqttDriverProbe;
|
||||||
|
using MTConnectProbe = Driver.MTConnect.MTConnectDriverProbe;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Wires every cross-platform driver assembly's <c>Register(registry, loggerFactory)</c>
|
/// Wires every cross-platform driver assembly's <c>Register(registry, loggerFactory)</c>
|
||||||
@@ -126,6 +127,7 @@ public static class DriverFactoryBootstrap
|
|||||||
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, CalculationProbe>());
|
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, CalculationProbe>());
|
||||||
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, SqlProbe>());
|
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, SqlProbe>());
|
||||||
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, MqttProbe>());
|
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, MqttProbe>());
|
||||||
|
services.TryAddEnumerable(ServiceDescriptor.Singleton<IDriverProbe, MTConnectProbe>());
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
@@ -149,6 +151,13 @@ public static class DriverFactoryBootstrap
|
|||||||
Driver.Galaxy.GalaxyDriverFactoryExtensions.Register(registry, secretResolver, loggerFactory);
|
Driver.Galaxy.GalaxyDriverFactoryExtensions.Register(registry, secretResolver, loggerFactory);
|
||||||
Driver.Modbus.ModbusDriverFactoryExtensions.Register(registry, loggerFactory);
|
Driver.Modbus.ModbusDriverFactoryExtensions.Register(registry, loggerFactory);
|
||||||
Driver.Mqtt.MqttDriverFactoryExtensions.Register(registry, loggerFactory);
|
Driver.Mqtt.MqttDriverFactoryExtensions.Register(registry, loggerFactory);
|
||||||
|
// Tier A (the Register default): fully managed — HttpClient + System.Xml.Linq, no native SDK,
|
||||||
|
// no COM. Tier C is the only tier that arms process-level recycle (MemoryRecycle hard-breach /
|
||||||
|
// ScheduledRecycleScheduler), which would be wrong here: the driver is in-process and killing
|
||||||
|
// it kills every OPC UA session. The long-lived /sample stream does not argue for a slower
|
||||||
|
// tier either — SubscribeAsync returns synchronously after starting the pump on a background
|
||||||
|
// task, so the Tier A 5s Subscribe budget never covers the stream's lifetime.
|
||||||
|
Driver.MTConnect.MTConnectDriverFactoryExtensions.Register(registry, loggerFactory);
|
||||||
Driver.OpcUaClient.OpcUaClientDriverFactoryExtensions.Register(registry, loggerFactory, secretResolver);
|
Driver.OpcUaClient.OpcUaClientDriverFactoryExtensions.Register(registry, loggerFactory, secretResolver);
|
||||||
Driver.S7.S7DriverFactoryExtensions.Register(registry);
|
Driver.S7.S7DriverFactoryExtensions.Register(registry);
|
||||||
Driver.Sql.SqlDriverFactoryExtensions.Register(registry, loggerFactory);
|
Driver.Sql.SqlDriverFactoryExtensions.Register(registry, loggerFactory);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@
|
|||||||
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Historian.Gateway\ZB.MOM.WW.OtOpcUa.Driver.Historian.Gateway.csproj"/>
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Historian.Gateway\ZB.MOM.WW.OtOpcUa.Driver.Historian.Gateway.csproj"/>
|
||||||
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Modbus\ZB.MOM.WW.OtOpcUa.Driver.Modbus.csproj"/>
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Modbus\ZB.MOM.WW.OtOpcUa.Driver.Modbus.csproj"/>
|
||||||
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Mqtt\ZB.MOM.WW.OtOpcUa.Driver.Mqtt.csproj"/>
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Mqtt\ZB.MOM.WW.OtOpcUa.Driver.Mqtt.csproj"/>
|
||||||
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.MTConnect\ZB.MOM.WW.OtOpcUa.Driver.MTConnect.csproj"/>
|
||||||
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient\ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient.csproj"/>
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient\ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient.csproj"/>
|
||||||
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.S7\ZB.MOM.WW.OtOpcUa.Driver.S7.csproj"/>
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.S7\ZB.MOM.WW.OtOpcUa.Driver.S7.csproj"/>
|
||||||
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Sql\ZB.MOM.WW.OtOpcUa.Driver.Sql.csproj"/>
|
<ProjectReference Include="..\..\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Sql\ZB.MOM.WW.OtOpcUa.Driver.Sql.csproj"/>
|
||||||
|
|||||||
+1
@@ -38,6 +38,7 @@
|
|||||||
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Galaxy\ZB.MOM.WW.OtOpcUa.Driver.Galaxy.csproj"/>
|
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Galaxy\ZB.MOM.WW.OtOpcUa.Driver.Galaxy.csproj"/>
|
||||||
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Calculation\ZB.MOM.WW.OtOpcUa.Driver.Calculation.csproj"/>
|
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Calculation\ZB.MOM.WW.OtOpcUa.Driver.Calculation.csproj"/>
|
||||||
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Sql\ZB.MOM.WW.OtOpcUa.Driver.Sql.csproj"/>
|
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.Sql\ZB.MOM.WW.OtOpcUa.Driver.Sql.csproj"/>
|
||||||
|
<ProjectReference Include="..\..\..\src\Drivers\ZB.MOM.WW.OtOpcUa.Driver.MTConnect\ZB.MOM.WW.OtOpcUa.Driver.MTConnect.csproj"/>
|
||||||
<!-- Ships no driver factory (it is a historian backend, not an Equipment driver), so the
|
<!-- Ships no driver factory (it is a historian backend, not an Equipment driver), so the
|
||||||
DriverTypeNames guard skips it — but it does hard-code OPC UA status constants, which
|
DriverTypeNames guard skips it — but it does hard-code OPC UA status constants, which
|
||||||
puts it in StatusCodeParityTests' scope. -->
|
puts it in StatusCodeParityTests' scope. -->
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ public sealed class DriverProbeRegistrationTests
|
|||||||
"OpcUaClient",
|
"OpcUaClient",
|
||||||
"GalaxyMxGateway",
|
"GalaxyMxGateway",
|
||||||
"Calculation", // v3 Batch 2 pseudo-driver; CalculationProbe registered in DriverFactoryBootstrap
|
"Calculation", // v3 Batch 2 pseudo-driver; CalculationProbe registered in DriverFactoryBootstrap
|
||||||
|
"MTConnect", // MTConnectProbe — read-only Agent driver; probe issues a bare GET /probe
|
||||||
];
|
];
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
Reference in New Issue
Block a user