From 8b4675b1a5b367177b312e2e7948720a0828264c Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 16 Jun 2026 19:39:41 -0400 Subject: [PATCH] fix(adminui): canonicalize Modbus driver-type string on "Modbus" (was ModbusTcp) --- .../ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriverProbe.cs | 2 +- .../Pages/Clusters/Drivers/DriverEditRouter.razor | 2 +- .../Pages/Clusters/Drivers/DriverTypePicker.razor | 2 +- .../Pages/Clusters/Drivers/ModbusDriverPage.razor | 2 +- .../Components/Shared/Drivers/DriverIdentitySection.razor | 4 ++-- .../Uns/TagEditors/TagConfigEditorMap.cs | 2 +- .../Uns/TagEditors/TagConfigValidator.cs | 2 +- .../Uns/TagConfigValidatorTests.cs | 7 ++++++- .../Uns/UnsTreeServiceAreaLineTests.cs | 6 +++--- .../Uns/UnsTreeServiceDeleteClusterTests.cs | 2 +- .../Uns/UnsTreeServiceEquipmentTests.cs | 4 ++-- .../Uns/UnsTreeServiceImportTests.cs | 2 +- .../Uns/UnsTreeServiceLoadEditTests.cs | 4 ++-- .../Uns/UnsTreeServiceTagDriversTests.cs | 4 ++-- .../Uns/UnsTreeServiceTagTests.cs | 6 +++--- 15 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriverProbe.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriverProbe.cs index f115dd25..8bb88235 100644 --- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriverProbe.cs +++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusDriverProbe.cs @@ -26,7 +26,7 @@ public sealed class ModbusDriverProbe : IDriverProbe private static readonly byte[] Fc03Pdu = [0x03, 0x00, 0x00, 0x00, 0x01]; /// - public string DriverType => "ModbusTcp"; + public string DriverType => "Modbus"; /// public async Task ProbeAsync(string configJson, TimeSpan timeout, CancellationToken ct) diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverEditRouter.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverEditRouter.razor index dfbf30e0..45224b8a 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverEditRouter.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverEditRouter.razor @@ -52,7 +52,7 @@ else private static readonly IReadOnlyDictionary _componentMap = new Dictionary(StringComparer.OrdinalIgnoreCase) { - ["ModbusTcp"] = typeof(ModbusDriverPage), + ["Modbus"] = typeof(ModbusDriverPage), ["AbCip"] = typeof(AbCipDriverPage), ["AbLegacy"] = typeof(AbLegacyDriverPage), ["S7"] = typeof(S7DriverPage), diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverTypePicker.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverTypePicker.razor index ec513615..9985605d 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverTypePicker.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/DriverTypePicker.razor @@ -37,7 +37,7 @@ private static readonly IReadOnlyList _types = new[] { - new DriverTypeEntry("ModbusTcp", "modbustcp", "[M]", "Modbus/TCP — generic registers/coils via port 502."), + new DriverTypeEntry("Modbus TCP", "modbustcp", "[M]", "Modbus/TCP — generic registers/coils via port 502."), new DriverTypeEntry("AbCip", "abcip", "[CIP]", "Allen-Bradley CompactLogix/ControlLogix via CIP."), new DriverTypeEntry("AbLegacy", "ablegacy", "[AB]", "Allen-Bradley PLC-5/SLC-500/MicroLogix via DF1."), new DriverTypeEntry("S7", "s7", "[S7]", "Siemens S7-300/400/1200/1500 via ISO-on-TCP."), diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/ModbusDriverPage.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/ModbusDriverPage.razor index d16a9112..59089643 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/ModbusDriverPage.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Clusters/Drivers/ModbusDriverPage.razor @@ -321,7 +321,7 @@ else [Parameter] public string ClusterId { get; set; } = ""; [Parameter] public string? DriverInstanceId { get; set; } - private const string DriverTypeKey = "ModbusTcp"; + private const string DriverTypeKey = "Modbus"; private bool IsNew => string.IsNullOrEmpty(DriverInstanceId); diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverIdentitySection.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverIdentitySection.razor index a1354355..f642687a 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverIdentitySection.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/DriverIdentitySection.razor @@ -28,7 +28,7 @@ - + @@ -73,7 +73,7 @@ [Required, RegularExpression("^[A-Za-z0-9_-]+$", ErrorMessage = "Use letters, digits, dash, underscore.")] public string DriverInstanceId { get; set; } = ""; [Required] public string Name { get; set; } = ""; - [Required] public string DriverType { get; set; } = "ModbusTcp"; + [Required] public string DriverType { get; set; } = "Modbus"; [Required] public string NamespaceId { get; set; } = ""; public bool Enabled { get; set; } = true; } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigEditorMap.cs b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigEditorMap.cs index dc929706..7da79860 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigEditorMap.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigEditorMap.cs @@ -10,7 +10,7 @@ public static class TagConfigEditorMap private static readonly IReadOnlyDictionary Map = new Dictionary(StringComparer.OrdinalIgnoreCase) { - ["ModbusTcp"] = typeof(Components.Shared.Uns.TagEditors.ModbusTagConfigEditor), + ["Modbus"] = typeof(Components.Shared.Uns.TagEditors.ModbusTagConfigEditor), ["S7"] = typeof(Components.Shared.Uns.TagEditors.S7TagConfigEditor), ["AbCip"] = typeof(Components.Shared.Uns.TagEditors.AbCipTagConfigEditor), ["AbLegacy"] = typeof(Components.Shared.Uns.TagEditors.AbLegacyTagConfigEditor), diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigValidator.cs b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigValidator.cs index e37b3d44..f126a1cd 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigValidator.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Uns/TagEditors/TagConfigValidator.cs @@ -12,7 +12,7 @@ public static class TagConfigValidator private static readonly IReadOnlyDictionary> Validators = new Dictionary>(StringComparer.OrdinalIgnoreCase) { - ["ModbusTcp"] = j => ModbusTagConfigModel.FromJson(j).Validate(), + ["Modbus"] = j => ModbusTagConfigModel.FromJson(j).Validate(), ["S7"] = j => S7TagConfigModel.FromJson(j).Validate(), ["AbCip"] = j => AbCipTagConfigModel.FromJson(j).Validate(), ["AbLegacy"] = j => AbLegacyTagConfigModel.FromJson(j).Validate(), diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/TagConfigValidatorTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/TagConfigValidatorTests.cs index 160382c3..93917cf4 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/TagConfigValidatorTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/TagConfigValidatorTests.cs @@ -16,7 +16,12 @@ public sealed class TagConfigValidatorTests [Fact] public void Modbus_has_no_required_field_so_empty_config_is_valid() - => TagConfigValidator.Validate("ModbusTcp", "{}").ShouldBeNull(); + => TagConfigValidator.Validate("Modbus", "{}").ShouldBeNull(); + + [Fact] + public void Resolve_Modbus_dispatches_typed_editor() + => TagConfigEditorMap.Resolve("Modbus") + .ShouldBe(typeof(ZB.MOM.WW.OtOpcUa.AdminUI.Components.Shared.Uns.TagEditors.ModbusTagConfigEditor)); // Drivers whose Validate() requires a field: blank config must return an error string. [Theory] diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceAreaLineTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceAreaLineTests.cs index 20f05463..efefed76 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceAreaLineTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceAreaLineTests.cs @@ -114,7 +114,7 @@ public sealed class UnsTreeServiceAreaLineTests ClusterId = "MAIN", NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); db.SaveChanges(); @@ -156,7 +156,7 @@ public sealed class UnsTreeServiceAreaLineTests ClusterId = "SITE-A", NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); db.Equipment.Add(new Equipment @@ -358,7 +358,7 @@ public sealed class UnsTreeServiceAreaLineTests ClusterId = "MAIN", NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); db.Equipment.Add(new Equipment diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceDeleteClusterTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceDeleteClusterTests.cs index 4af90ffd..4ad0aa42 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceDeleteClusterTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceDeleteClusterTests.cs @@ -107,7 +107,7 @@ public sealed class UnsTreeServiceDeleteClusterTests ClusterId = "CL-DRV", NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); db.SaveChanges(); diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceEquipmentTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceEquipmentTests.cs index 2c4ec37d..2a3c54e4 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceEquipmentTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceEquipmentTests.cs @@ -43,7 +43,7 @@ public sealed class UnsTreeServiceEquipmentTests ClusterId = driverCluster, NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); } @@ -174,7 +174,7 @@ public sealed class UnsTreeServiceEquipmentTests ClusterId = "MAIN", NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); db.SaveChanges(); diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceImportTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceImportTests.cs index 45ffd48f..9ae706ed 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceImportTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceImportTests.cs @@ -38,7 +38,7 @@ public sealed class UnsTreeServiceImportTests ClusterId = driverCluster, NamespaceId = "NS-1", Name = "drv", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); } diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceLoadEditTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceLoadEditTests.cs index 798e2e5b..6fb14c66 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceLoadEditTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceLoadEditTests.cs @@ -110,7 +110,7 @@ public sealed class UnsTreeServiceLoadEditTests ClusterId = UnsTreeTestDb.PopulatedClusterId, NamespaceId = "NS-1", Name = "modbus-b", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); db.DriverInstances.Add(new DriverInstance @@ -141,7 +141,7 @@ public sealed class UnsTreeServiceLoadEditTests drivers[0].DriverInstanceId.ShouldBe("DRV-A"); drivers[0].Display.ShouldBe("DRV-A — galaxy-a (Galaxy)"); drivers[1].DriverInstanceId.ShouldBe("DRV-B"); - drivers[1].Display.ShouldBe("DRV-B — modbus-b (ModbusTcp)"); + drivers[1].Display.ShouldBe("DRV-B — modbus-b (Modbus)"); } /// Loading a seeded tag maps its fields, owning equipment, and a non-empty RowVersion. diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagDriversTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagDriversTests.cs index c61ba1f5..fae92934 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagDriversTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagDriversTests.cs @@ -58,7 +58,7 @@ public sealed class UnsTreeServiceTagDriversTests ClusterId = "MAIN", NamespaceId = "NS-EQ", Name = "equipment driver", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = """{"endpoint":"10.0.0.1:502"}""", }); db.SaveChanges(); @@ -70,7 +70,7 @@ public sealed class UnsTreeServiceTagDriversTests drivers.Count.ShouldBe(1); drivers[0].DriverInstanceId.ShouldBe("DRV-EQ"); - drivers[0].DriverType.ShouldBe("ModbusTcp"); + drivers[0].DriverType.ShouldBe("Modbus"); // The picker (Galaxy live-browse) opens its session against the selected driver's config. drivers[0].DriverConfig.ShouldBe("""{"endpoint":"10.0.0.1:502"}"""); } diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs index 99f9e9ee..59a9449c 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/Uns/UnsTreeServiceTagTests.cs @@ -76,7 +76,7 @@ public sealed class UnsTreeServiceTagTests ClusterId = equipmentCluster, NamespaceId = "NS-EQ", Name = "equipment driver", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); } @@ -89,7 +89,7 @@ public sealed class UnsTreeServiceTagTests ClusterId = equipmentCluster, NamespaceId = "NS-SP", Name = "non-equipment driver", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); } @@ -110,7 +110,7 @@ public sealed class UnsTreeServiceTagTests ClusterId = otherCluster, NamespaceId = "NS-OTHER", Name = "other-cluster driver", - DriverType = "ModbusTcp", + DriverType = "Modbus", DriverConfig = "{}", }); }