From a1e9ed40fba1eed3d1dd8ee7f334cf935ed32eba Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 17 Apr 2026 22:42:15 -0400 Subject: [PATCH] =?UTF-8?q?Doc=20=E2=80=94=20record=20that=20this=20dev=20?= =?UTF-8?q?box=20(DESKTOP-6JL3KKO)=20hosts=20the=20full=20AVEVA=20stack=20?= =?UTF-8?q?required=20for=20the=20LmxOpcUa=20Phase=202=20breakout,=20remov?= =?UTF-8?q?ing=20the=20"needs=20live=20MXAccess=20runtime"=20environmental?= =?UTF-8?q?=20blocker=20that=20the=20partial-exit=20evidence=20cited=20as?= =?UTF-8?q?=20gating=20Streams=20D=20+=20E.=20Inventory=20verified=20via?= =?UTF-8?q?=20Get-Service:=2027=20ArchestrA=20/=20Wonderware=20/=20AVEVA?= =?UTF-8?q?=20services=20running=20including=20aaBootstrap,=20aaGR=20(Gala?= =?UTF-8?q?xy=20Repository),=20aaLogger,=20aaUserValidator,=20aaPim,=20Arc?= =?UTF-8?q?hestrADataStore,=20AsbServiceManager,=20AutoBuild=5FService;=20?= =?UTF-8?q?the=20full=20Historian=20set=20(aahClientAccessPoint,=20aahGate?= =?UTF-8?q?way,=20aahInSight,=20aahSearchIndexer,=20aahSupervisor,=20InSQL?= =?UTF-8?q?Storage,=20InSQLConfiguration,=20InSQLEventSystem,=20InSQLIndex?= =?UTF-8?q?ing,=20InSQLIOServer,=20InSQLManualStorage,=20InSQLSystemDriver?= =?UTF-8?q?,=20HistorianSearch-x64);=20slssvc=20(Wonderware=20SuiteLink);?= =?UTF-8?q?=20MXAccess=20COM=20DLL=20at=20C:\Program=20Files=20(x86)\Arche?= =?UTF-8?q?strA\Framework\bin\ArchestrA.MXAccess.dll=20plus=20the=20matchi?= =?UTF-8?q?ng=20.tlb=20files;=20OI-Gateway=20install=20at=20C:\Program=20F?= =?UTF-8?q?iles=20(x86)\Wonderware\OI-Server\OI-Gateway\=20=E2=80=94=20whi?= =?UTF-8?q?ch=20means=20the=20Phase=201=20Task=20E.10=20AppServer-via-OI-G?= =?UTF-8?q?ateway=20smoke=20test=20(decision=20#142)=20is=20*also*=20runna?= =?UTF-8?q?ble=20on=20the=20same=20box,=20not=20blocked=20on=20a=20separat?= =?UTF-8?q?e=20AVEVA=20test=20machine=20as=20the=20original=20deferral=20a?= =?UTF-8?q?ssumed.=20dev-environment.md=20inventory=20row=20for=20"Dev=20G?= =?UTF-8?q?alaxy"=20now=20lists=20every=20service=20and=20file=20path;=20s?= =?UTF-8?q?tatus=20flips=20to=20"Fully=20available=20=E2=80=94=20Phase=202?= =?UTF-8?q?=20lift=20unblocked";=20the=20GLAuth=20row=20also=20fills=20out?= =?UTF-8?q?=20v2.4.0=20actual=20install=20details=20(direct-bind=20cn=3D{u?= =?UTF-8?q?ser},dc=3Dlmxopcua,dc=3Dlocal;=20users=20readonly/writeop/write?= =?UTF-8?q?tune/writeconfig/alarmack/admin/serviceaccount;=20running=20und?= =?UTF-8?q?er=20NSSM=20service=20GLAuth;=20current=20GroupToRole=20mapping?= =?UTF-8?q?=20ReadOnly=E2=86=92ConfigViewer=20/=20WriteOperate=E2=86=92Con?= =?UTF-8?q?figEditor=20/=20AlarmAck=E2=86=92FleetAdmin)=20and=20notes=20th?= =?UTF-8?q?e=20v2-rebrand=20to=20dc=3Dotopcua,dc=3Dlocal=20is=20a=20future?= =?UTF-8?q?=20cosmetic=20change.=20phase-2-partial-exit-evidence.md=20stat?= =?UTF-8?q?us=20header=20gains=20"runtime=20now=20in=20place";=20an=20Upda?= =?UTF-8?q?te=202026-04-17=20callout=20enumerates=20the=20same=20service?= =?UTF-8?q?=20inventory=20and=20concludes=20"no=20environmental=20blocker?= =?UTF-8?q?=20remains";=20the=20next-session=20checklist's=20first=20step?= =?UTF-8?q?=20changes=20from=20"stand=20up=20dev=20Galaxy"=20to=20"verify?= =?UTF-8?q?=20the=20local=20AVEVA=20stack=20is=20still=20green=20(Get-Serv?= =?UTF-8?q?ice=20aaGR,=20aaBootstrap,=20slssvc=20=E2=86=92=20Running)=20an?= =?UTF-8?q?d=20the=20Galaxy=20ZB=20repository=20is=20reachable"=20with=20a?= =?UTF-8?q?=20new=20step=209=20calling=20out=20that=20the=20AppServer-via-?= =?UTF-8?q?OI-Gateway=20smoke=20test=20should=20now=20be=20folded=20in=20o?= =?UTF-8?q?pportunistically.=20plan.md=20=C2=A7"4.=20Galaxy/MXAccess=20as?= =?UTF-8?q?=20Out-of-Process=20Driver"=20gains=20a=20"Dev=20environment=20?= =?UTF-8?q?for=20the=20LmxOpcUa=20breakout"=20paragraph=20documenting=20wh?= =?UTF-8?q?ich=20physical=20machine=20has=20the=20runtime=20so=20the=20pla?= =?UTF-8?q?nning=20doc=20no=20longer=20reads=20as=20if=20AVEVA=20capabilit?= =?UTF-8?q?y=20were=20a=20future=20logistical=20concern.=20No=20source=20/?= =?UTF-8?q?=20test=20changes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/v2/dev-environment.md | 4 +- .../phase-2-partial-exit-evidence.md | 46 ++++++++++++++----- docs/v2/plan.md | 2 + 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/docs/v2/dev-environment.md b/docs/v2/dev-environment.md index c0bf25c..c38ef39 100644 --- a/docs/v2/dev-environment.md +++ b/docs/v2/dev-environment.md @@ -59,8 +59,8 @@ Running record of every v2 dev service stood up on this developer machine. Updat | Service | Container / Process | Version | Host:Port | Credentials (dev-only) | Data location | Status | |---------|---------------------|---------|-----------|------------------------|---------------|--------| | **Central config DB** | Docker container `otopcua-mssql` (image `mcr.microsoft.com/mssql/server:2022-latest`) | 16.0.4250.1 (RTM-CU24-GDR, KB5083252) | `localhost:14330` (host) → `1433` (container) — remapped from 1433 to avoid collision with the native MSSQL14 instance that hosts the Galaxy `ZB` DB (both bind 0.0.0.0:1433; whichever wins the race gets connections) | User `sa` / Password `OtOpcUaDev_2026!` | Docker named volume `otopcua-mssql-data` (mounted at `/var/opt/mssql` inside container) | ✅ Running — `InitialSchema` migration applied, 16 entity tables live | -| Dev Galaxy (AVEVA System Platform) | Local install on this dev box | v1 baseline | Local COM via MXAccess | Windows Auth | Galaxy repository DB `ZB` on local SQL Server (separate instance from `otopcua-mssql` — legacy v1 Galaxy DB, not related to v2 config DB) | ✅ Available (per CLAUDE.md) | -| GLAuth (LDAP) | Local install at `C:\publish\glauth\` | v1 baseline | `localhost:3893` (LDAP) / `3894` (LDAPS) | Bind DN `cn=admin,dc=otopcua,dc=local` / password in `glauth-otopcua.cfg` | `C:\publish\glauth\` | Pending — v2 test users + groups config not yet seeded (Phase 1 Stream E task) | +| Dev Galaxy (AVEVA System Platform) | Local install on this dev box — full ArchestrA + Historian + OI-Server stack | v1 baseline | Local COM via MXAccess (`C:\Program Files (x86)\ArchestrA\Framework\bin\ArchestrA.MXAccess.dll`); Historian via `aaH*` services; SuiteLink via `slssvc` | Windows Auth | Galaxy repository DB `ZB` on local SQL Server (separate instance from `otopcua-mssql` — legacy v1 Galaxy DB, not related to v2 config DB) | ✅ **Fully available — Phase 2 lift unblocked.** 27 ArchestrA / AVEVA / Wonderware services running incl. `aaBootstrap`, `aaGR` (Galaxy Repository), `aaLogger`, `aaUserValidator`, `aaPim`, `ArchestrADataStore`, `AsbServiceManager`, `AutoBuild_Service`; full Historian set (`aahClientAccessPoint`, `aahGateway`, `aahInSight`, `aahSearchIndexer`, `aahSupervisor`, `InSQLStorage`, `InSQLConfiguration`, `InSQLEventSystem`, `InSQLIndexing`, `InSQLIOServer`, `InSQLManualStorage`, `InSQLSystemDriver`, `HistorianSearch-x64`); `slssvc` (Wonderware SuiteLink); `OI-Gateway` install present at `C:\Program Files (x86)\Wonderware\OI-Server\OI-Gateway\` (decision #142 AppServer-via-OI-Gateway smoke test now also unblocked) | +| GLAuth (LDAP) | Local install at `C:\publish\glauth\` | v2.4.0 | `localhost:3893` (LDAP) / `3894` (LDAPS, disabled) | Direct-bind `cn={user},dc=lmxopcua,dc=local` per `auth.md`; users `readonly`/`writeop`/`writetune`/`writeconfig`/`alarmack`/`admin`/`serviceaccount` (passwords in `glauth.cfg` as SHA-256) | `C:\publish\glauth\` | ✅ Running (NSSM service `GLAuth`). Phase 1 Admin uses GroupToRole map `ReadOnly→ConfigViewer`, `WriteOperate→ConfigEditor`, `AlarmAck→FleetAdmin`. v2-rebrand to `dc=otopcua,dc=local` is a future cosmetic change | | OPC Foundation reference server | Not yet built | — | `localhost:62541` (target) | `user1` / `password1` (reference-server defaults) | — | Pending (needed for Phase 5 OPC UA Client driver testing) | | FOCAS TCP stub | Not yet built | — | `localhost:8193` (target) | n/a | — | Pending (built in Phase 5) | | Modbus simulator (`oitc/modbus-server`) | — | — | `localhost:502` (target) | n/a | — | Pending (needed for Phase 3 Modbus driver; moves to integration host per two-tier model) | diff --git a/docs/v2/implementation/phase-2-partial-exit-evidence.md b/docs/v2/implementation/phase-2-partial-exit-evidence.md index efa7599..11c11f5 100644 --- a/docs/v2/implementation/phase-2-partial-exit-evidence.md +++ b/docs/v2/implementation/phase-2-partial-exit-evidence.md @@ -4,14 +4,29 @@ > deferred. See `phase-2-galaxy-out-of-process.md` for the full task plan; this is the as-built > delta. -## Status: **Streams A + B + C scaffolded and test-green. Streams D + E deferred.** +## Status: **Streams A + B + C scaffolded and test-green. Streams D + E deferred — runtime now in place.** The goal per the plan is "parity, not regression" — the phase exit gate requires v1 IntegrationTests to pass against the v2 Galaxy.Proxy + Galaxy.Host topology byte-for-byte. Achieving that requires live MXAccess runtime plus the Galaxy code lift out of the legacy -`OtOpcUa.Host`. Both are operations that need a dev Galaxy up and a parity test cycle to verify. -Without that cycle, deleting the legacy Host would break the 494 passing v1 tests that are the -parity baseline. +`OtOpcUa.Host`. Without that cycle, deleting the legacy Host would break the 494 passing v1 +tests that are the parity baseline. + +> **Update 2026-04-17 — runtime confirmed local.** The dev box has the full AVEVA stack required +> for the LmxOpcUa breakout: 27 ArchestrA / Wonderware / AVEVA services running including +> `aaBootstrap`, `aaGR` (Galaxy Repository), `aaLogger`, `aaUserValidator`, `aaPim`, +> `ArchestrADataStore`, `AsbServiceManager`; the full Historian set +> (`aahClientAccessPoint`, `aahGateway`, `aahInSight`, `aahSearchIndexer`, `InSQLStorage`, +> `InSQLConfiguration`, `InSQLEventSystem`, `InSQLIndexing`, `InSQLIOServer`, +> `HistorianSearch-x64`); SuiteLink (`slssvc`); MXAccess COM at +> `C:\Program Files (x86)\ArchestrA\Framework\bin\ArchestrA.MXAccess.dll`; and the OI-Gateway +> install at `C:\Program Files (x86)\Wonderware\OI-Server\OI-Gateway\` (so the +> AppServer-via-OI-Gateway smoke test from decision #142 is *also* runnable here, not blocked +> on a dedicated AVEVA test box). +> +> The "needs a dev Galaxy" prerequisite is therefore satisfied. Stream D + E can start whenever +> the team is ready to take the parity-cycle hit on the 494 v1 tests; no environmental blocker +> remains. What *is* done: all scaffolding, IPC contracts, supervisor logic, and stability protections needed to hang the real MXAccess code onto. Every piece has unit-level or IPC-level test @@ -151,13 +166,20 @@ Requires live MXAccess + Galaxy runtime and the above lift complete. Work items: ## Next-session checklist for Stream D + E -1. Stand up dev Galaxy; capture Client.CLI walkthrough baseline against v1. -2. Move Galaxy-specific files from `OtOpcUa.Host` into `Driver.Galaxy.Host`, renaming +1. Verify the local AVEVA stack is still green (`Get-Service aaGR, aaBootstrap, slssvc` → + Running) and the Galaxy `ZB` repository is reachable from `sqlcmd -S localhost -d ZB -E`. + The runtime is already on this machine — no install step needed. +2. Capture Client.CLI walkthrough baseline against v1 (the parity reference). +3. Move Galaxy-specific files from `OtOpcUa.Host` into `Driver.Galaxy.Host`, renaming namespaces. Replace `StubFrameHandler` with the real one. -3. Wire up the real Win32 pump inside `StaPump` (lift from scadalink-design's +4. Wire up the real Win32 pump inside `StaPump` (lift from scadalink-design's `LmxProxy.Host` reference per CLAUDE.md). -4. Run v1 IntegrationTests against the v2 topology — iterate on parity defects until green. -5. Run Client.CLI walkthrough and diff. -6. Regression tests for the four stability findings. -7. Delete legacy `OtOpcUa.Host`; update `.slnx`; update installer scripts. -8. Adversarial review; `exit-gate-phase-2.md` recorded; PR merged. +5. Run v1 IntegrationTests against the v2 topology — iterate on parity defects until green. +6. Run Client.CLI walkthrough and diff. +7. Regression tests for the four 2026-04-13 stability findings. +8. Delete legacy `OtOpcUa.Host`; update `.slnx`; update installer scripts. +9. Optional but valuable now that the runtime is local: AppServer-via-OI-Gateway smoke test + (decision #142 / Phase 1 Task E.10) — the OI-Gateway install at + `C:\Program Files (x86)\Wonderware\OI-Server\OI-Gateway\` is in place; the test was deferred + for "needs live AVEVA runtime" reasons that no longer apply on this dev box. +10. Adversarial review; `exit-gate-phase-2.md` recorded; PR merged. diff --git a/docs/v2/plan.md b/docs/v2/plan.md index c7676fc..b6282ce 100644 --- a/docs/v2/plan.md +++ b/docs/v2/plan.md @@ -234,6 +234,8 @@ All of these stay in the Galaxy Host process (.NET 4.8 x86). The `GalaxyProxy` i - Refactor is **incremental**: extract `IDriver` / `ISubscribable` / `ITagDiscovery` etc. against the existing `LmxNodeManager` first (still in-process on v2 branch), validate the system still runs, *then* move the implementation behind the IPC boundary into Galaxy.Host. Keeps the system runnable at each step and de-risks the out-of-process move. - **Parity test**: run the existing v1 IntegrationTests suite against the v2 Galaxy driver (same Galaxy, same expectations) **plus** a scripted Client.CLI walkthrough (connect / browse / read / write / subscribe / history / alarms) on a dev Galaxy. Automated regression + human-observable behavior. +**Dev environment for the LmxOpcUa breakout:** the Phase 0/1 dev box (`DESKTOP-6JL3KKO`) hosts the full AVEVA stack required to execute Phase 2 Streams D + E — 27 ArchestrA / Wonderware / AVEVA services running including `aaBootstrap`, `aaGR` (Galaxy Repository), `aaLogger`, `aaUserValidator`, `aaPim`, `ArchestrADataStore`, `AsbServiceManager`; the full Historian set (`aahClientAccessPoint`, `aahGateway`, `aahInSight`, `aahSearchIndexer`, `InSQLStorage`, `InSQLConfiguration`, `InSQLEventSystem`, `InSQLIndexing`, `InSQLIOServer`, `HistorianSearch-x64`); SuiteLink (`slssvc`); MXAccess COM at `C:\Program Files (x86)\ArchestrA\Framework\bin\ArchestrA.MXAccess.dll`; and OI-Gateway at `C:\Program Files (x86)\Wonderware\OI-Server\OI-Gateway\` — so the Phase 1 Task E.10 AppServer-via-OI-Gateway smoke test (decision #142) is also runnable on the same box, no separate AVEVA test machine required. Inventory captured in `dev-environment.md`. + --- ### 4. Configuration Model — Centralized MSSQL + Local Cache