Tasks #211 #212 #213 — AbCip / S7 / AbLegacy server-side factories + seed SQL #217

Merged
dohertj2 merged 1 commits from task-211-212-213-factories into v2 2026-04-21 11:17:49 -04:00
Owner

Parent: #209. Follow-up to #210 (Modbus, merged as #216).

Registers the remaining three non-Galaxy driver factories so a Config DB DriverType in {AbCip, S7, AbLegacy} actually boots a live driver instead of being silently skipped by DriverInstanceBootstrapper.

What's in the box

  • AbCipDriverFactoryExtensions + seed-abcip-smoke.sqlcloses #211. ControlLogix device at ab://127.0.0.1:44818/1,0 + TestDINT:DInt tag.
  • S7DriverFactoryExtensions + seed-s7-smoke.sqlcloses #212. S71500 CPU at python-snap7's non-priv port 1102 + DB1.DBW0:Int16 tag.
  • AbLegacyDriverFactoryExtensions + seed-ablegacy-smoke.sqlcloses #213. SLC 500 + N7:5:Int tag. Hardware-gated per #222 (ab_server PCCC is upstream-broken); seed ships with a placeholder gateway to be replaced before running.

Each factory mirrors the Modbus pattern from #216: static Register, internal CreateInstance(driverInstanceId, driverConfigJson), strict enum parsing with fail-fast "expected one of" errors, full-surface DTO.

Build plumbing

Each driver project now also ProjectReferences Core (was Core.Abstractions-only) — DriverFactoryRegistry lives in Core.Hosting. Matches the Galaxy.Proxy + FOCAS reference shape. Server.csproj adds the three new ProjectReferences so Program.cs resolves + ships the assemblies at runtime.

Test plan

  • Full-solution build: 0 errors, 334 pre-existing xUnit1051 warnings only
  • Live boot verification deferred to the #209 exit-gate PR (all four drivers bootable + e2e scripts pass)
Parent: #209. Follow-up to #210 (Modbus, merged as #216). Registers the remaining three non-Galaxy driver factories so a Config DB `DriverType` in {`AbCip`, `S7`, `AbLegacy`} actually boots a live driver instead of being silently skipped by `DriverInstanceBootstrapper`. ## What's in the box - `AbCipDriverFactoryExtensions` + `seed-abcip-smoke.sql` — closes #211. ControlLogix device at `ab://127.0.0.1:44818/1,0` + `TestDINT:DInt` tag. - `S7DriverFactoryExtensions` + `seed-s7-smoke.sql` — closes #212. S71500 CPU at python-snap7's non-priv port `1102` + `DB1.DBW0:Int16` tag. - `AbLegacyDriverFactoryExtensions` + `seed-ablegacy-smoke.sql` — closes #213. SLC 500 + `N7:5:Int` tag. **Hardware-gated** per #222 (ab_server PCCC is upstream-broken); seed ships with a placeholder gateway to be replaced before running. Each factory mirrors the Modbus pattern from #216: static `Register`, internal `CreateInstance(driverInstanceId, driverConfigJson)`, strict enum parsing with fail-fast "expected one of" errors, full-surface DTO. ## Build plumbing Each driver project now also ProjectReferences `Core` (was `Core.Abstractions`-only) — `DriverFactoryRegistry` lives in `Core.Hosting`. Matches the Galaxy.Proxy + FOCAS reference shape. `Server.csproj` adds the three new ProjectReferences so Program.cs resolves + ships the assemblies at runtime. ## Test plan - [x] Full-solution build: 0 errors, 334 pre-existing xUnit1051 warnings only - [ ] Live boot verification deferred to the #209 exit-gate PR (all four drivers bootable + e2e scripts pass)
dohertj2 added 1 commit 2026-04-21 11:17:45 -04:00
Parent: #209. Follow-up to #210 (Modbus). Registers the remaining three
non-Galaxy driver factories so a Config DB `DriverType` in
{`AbCip`, `S7`, `AbLegacy`} actually boots a live driver instead of
being silently skipped by DriverInstanceBootstrapper.

Each factory follows the same shape as ModbusDriverFactoryExtensions +
the existing Galaxy + FOCAS patterns:
 - Static `Register(DriverFactoryRegistry)` entry point.
 - Internal `CreateInstance(driverInstanceId, driverConfigJson)` —
   deserialises a DTO, strict-parses enum fields (fail-fast with an
   explicit "expected one of" list), composes the driver's options object,
   returns a new driver.
 - DriverType keys: `"AbCip"`, `"S7"`, `"AbLegacy"` (case-insensitive at
   the registry layer).

DTO surfaces cover every option the respective driver's Options class
exposes — devices, tags, probe, timeouts, per-driver quirks
(AbCip `EnableControllerBrowse` / `EnableAlarmProjection`, S7 Rack/Slot/
CpuType, AbLegacy PlcFamily).

Seed SQL (mirrors `seed-modbus-smoke.sql` shape):
 - `seed-abcip-smoke.sql` — `abcip-smoke` cluster + ControlLogix device +
   `TestDINT:DInt` tag, pointing at the ab_server compose fixture
   (`ab://127.0.0.1:44818/1,0`).
 - `seed-s7-smoke.sql` — `s7-smoke` cluster + S71500 CPU + `DB1.DBW0:Int16`
   tag at the python-snap7 fixture (`127.0.0.1:1102`, non-priv port).
 - `seed-ablegacy-smoke.sql` — `ablegacy-smoke` cluster + SLC 500 + `N7:5`
   tag. Hardware-gated per #222; placeholder gateway to be replaced with
   real SLC/MicroLogix/PLC-5/RSEmulate before running.

Build plumbing:
 - Each driver project now ProjectReferences `Core` (was
   `Core.Abstractions`-only). `DriverFactoryRegistry` lives in `Core.Hosting`
   so the factory extensions can't compile without it. Matches the FOCAS +
   Galaxy.Proxy reference shape.
 - `Server.csproj` adds the three new driver ProjectReferences so Program.cs
   resolves the symbols at compile-time + ships the assemblies at runtime.

Full-solution build: 0 errors, 334 pre-existing xUnit1051 warnings only.

Live boot verification of all four (Modbus + these three) happens in the
exit-gate PR — factories + seeds are pre-conditions and are being
shipped first so the exit-gate PR can scope to "does the server publish
the expected NodeIds + does the e2e script pass."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dohertj2 merged commit 3af746c4b6 into v2 2026-04-21 11:17:49 -04:00
dohertj2 deleted branch task-211-212-213-factories 2026-04-21 11:17:49 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#217