From f381b471f95cc615d9aa56545f22ae0f27c9d984 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Wed, 15 Jul 2026 05:38:18 -0400 Subject: [PATCH] =?UTF-8?q?docs(sweep):=20AbLegacy=20verified=20green=20?= =?UTF-8?q?=E2=80=94=20fixture-deployment=20gap,=20not=20a=20code=20defect?= =?UTF-8?q?=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sweep's AbLegacy 4F was a fixture-deployment gap, not a driver/test defect. The suite needs ab_server in PCCC mode (--plc=SLC500|Micrologix|PLC/5), which reuses the AbCip image (already on the host) and binds :44818. No PCCC container was deployed, and the 4F-not-skip means :44818 was answering CIP (a leftover AbCip container) so the PCCC reads returned Bad — same shared-port contamination class as the Modbus false alarm. Deployed the PCCC compose to ~/otopcua-ablegacy and ran each family with AB_LEGACY_COMPOSE_PROFILE set to match the running container (required — without it the [Theory] parametrises over all 3 families and 2 fail against a single- family container): slc500 2/2, micrologix 1/1 (+1 skip), plc5 1/1 (+1 skip). Skips are family-inapplicable file types. No code change. Corrected the sweep record + added the AbLegacy bring-up + run recipe. Integration-sweep follow-up #4. --- archreview/plans/INTEGRATION-SWEEP-STATUS.md | 33 ++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/archreview/plans/INTEGRATION-SWEEP-STATUS.md b/archreview/plans/INTEGRATION-SWEEP-STATUS.md index 6e3b3607..97c32694 100644 --- a/archreview/plans/INTEGRATION-SWEEP-STATUS.md +++ b/archreview/plans/INTEGRATION-SWEEP-STATUS.md @@ -26,7 +26,7 @@ need sudo to create new ones — I deployed FOCAS to `~/otopcua-focas` on the ho | **Modbus** (dl205 / mitsubishi / s7_1500 / exception_injection) | ✅ 16/13/10/17 (was 8F/5F/3F/8F) | **NOT drift** — fixture-cycling artifact, re-verified GREEN 2026-07-15 — see below | | **AbCip** | ✅ 10P/3skip (was 6F/1P/3skip) | static-init-order bug FIXED 2026-07-15 (`326b22a7`) — see below | | **FOCAS** | ❌ 9F/1P | tests assume a localhost-colocated mock — see below | -| **AbLegacy** | ❌ 4F | no AbLegacy sim fixture deployed to the host | +| **AbLegacy** | ✅ slc500 2/2, micrologix 1/1, plc5 1/1 (was 4F) | fixture-deployment gap FIXED 2026-07-15 — see below | | **OpcUaServer** | ✅ 4/4 (was 4F) | cert-store gap + SDK read-throws drift FIXED 2026-07-15 — see below | ### Headline conclusion @@ -37,8 +37,10 @@ correctly bound — the sweep's non-standard "failures" were the stale-container and all driver **unit** suites + the live `/run` gates pass. These integration suites were DEFERRED in round 2 and never run, so they'd bit-rotted in several distinct ways. -**Follow-up progress (2026-07-15):** #1 AbCip (PR #446), #5 OpcUaServer (PR #447), and #2 Modbus (PR #448 — false -alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each needs a design/infra decision. +**Follow-up progress (2026-07-15):** #1 AbCip (PR #446), #5 OpcUaServer (PR #447), #2 Modbus (PR #448 — false +alarm, no code), and #4 AbLegacy (PR #449 — fixture-deployment gap, no code) all closed. **4 of 7 done; all +driver suites now verified GREEN.** Remaining: #3 FOCAS + #6 Host (each needs a design/infra decision) and #7 +(FOCAS fixture deploy). --- @@ -78,8 +80,16 @@ alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each n a remote sim. **Fix:** reconcile the mock topology — either run the FOCAS mock on localhost, or make the test node-keys honor `OTOPCUA_FOCAS_SIM_ENDPOINT`/`FOCAS_MOCK_HOST`. -- **AbLegacy** — 4F on `StatusCode` because **no AbLegacy sim exists on the host** (no `/opt/otopcua-ablegacy`, - none deployed). Reads return Bad. **Fix:** deploy an AbLegacy fixture (check `tests/.../AbLegacy.IntegrationTests/Docker/`). +- **AbLegacy** — ✅ **FIXED 2026-07-15 (PR #449). Fixture-deployment gap, not a code defect.** The AbLegacy suite + needs `ab_server` in **PCCC mode** (`--plc=SLC500|Micrologix|PLC/5`), which reuses the **AbCip image** + (`otopcua-ab-server:libplctag-release`, already on the host) and binds `:44818`. Two issues: (a) no PCCC + container was deployed (`~/otopcua-ablegacy` didn't exist); (b) the sweep's *4F-not-skip* means `:44818` was + reachable but answering **CIP** (a leftover AbCip container) — the PCCC reads returned Bad. Same shared-port + contamination class as the Modbus false alarm. Deployed the compose to `~/otopcua-ablegacy` on the host (image + already present, no build needed) and ran each family with `AB_LEGACY_COMPOSE_PROFILE` set to match the running + container (**required** — without it the `[Theory]` parametrises over all 3 families and 2 fail against a + single-family container): **slc500 2/2, micrologix 1/1 (+1 skip), plc5 1/1 (+1 skip)** — the skips are + family-inapplicable file types (e.g. no `F8` float file seeded on micrologix/plc5). **No code change.** - **OpcUaServer** — ✅ **FIXED 2026-07-15** (PR #447). Was 4F on `Opc.Ua.ServiceResultException : TrustedIssuerCertificates StorePath must be specified` — the in-test *client* `SecurityConfiguration` @@ -114,7 +124,10 @@ alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each n Re-verified all four profiles GREEN (16/13/10/17). Added a profile-cycling gotcha + reliable-cycle recipe to `Docker/README.md`. 3. **FOCAS** — reconcile the 127.0.0.1-mock topology with the remote-fixture model. -4. **AbLegacy** — deploy an AbLegacy sim fixture (none on host). +4. ~~**AbLegacy** — deploy an AbLegacy sim fixture (none on host).~~ + ✅ **DONE 2026-07-15 (PR #449) — fixture-deployment gap, no code defect.** Deployed the PCCC compose to + `~/otopcua-ablegacy` (reuses the AbCip image, already on host). All 3 families GREEN (slc500 2/2, micrologix + 1/1, plc5 1/1). Recipe added below; `AB_LEGACY_COMPOSE_PROFILE` MUST match the running container. 5. ~~**OpcUaServer** — supply cert-store StorePath in the harness config.~~ ✅ **DONE 2026-07-15** (PR #447). Added `TestClientSecurity` helper building a validated client `SecurityConfiguration` with Directory own/issuer/trusted/rejected stores under a throwaway PKI dir @@ -123,8 +136,8 @@ alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each n *throws* `ServiceResultException(BadNodeIdUnknown)` for a removed node instead of returning a bad `DataValue` — updated the two subscription-survival assertions to `Should.ThrowAsync`. Suite **4F → 4/4**. 6. **Host** — replace `bitnami/openldap:2.6` (image gone); run E2E on real SQL or raise deadlines. -7. **Fixture deployment gap** — FOCAS + AbLegacy fixtures aren't on the host at `/opt/otopcua-*`; the sweep - requires deploying them (and `/opt` needs sudo — used `~/otopcua-` for FOCAS). +7. **Fixture deployment gap** — FOCAS fixture isn't on the host at `/opt/otopcua-*` (and `/opt` needs sudo — + use `~/otopcua-`). **AbLegacy is now deployed** at `~/otopcua-ablegacy` (2026-07-15, PR #449). --- @@ -137,7 +150,8 @@ ssh dohertj2@10.100.0.35 'cd /opt/otopcua-modbus && docker compose --profile ssh dohertj2@10.100.0.35 'cd /opt/otopcua-abcip && docker compose --profile controllogix up -d' # :44818 ssh dohertj2@10.100.0.35 'cd /opt/otopcua-s7 && docker compose --profile s7_1500 up -d' # :1102 ssh dohertj2@10.100.0.35 'cd /opt/otopcua-opcuaclient && docker compose up -d' # :50000 -# FOCAS/AbLegacy not on host — rsync tests/.../Docker/ to ~/otopcua- then `docker compose up -d --build` +ssh dohertj2@10.100.0.35 'cd ~/otopcua-ablegacy && docker compose --profile slc500 up -d' # :44818 (PCCC; reuses AbCip image) +# FOCAS not on host — rsync tests/.../Docker/ to ~/otopcua-focas then `docker compose up -d --build` ``` Run per suite (env → project): @@ -148,6 +162,7 @@ Run per suite (env → project): | S7 | `S7_SIM_ENDPOINT=10.100.0.35:1102` | `tests/Drivers/…S7.IntegrationTests` | | Modbus | `MODBUS_SIM_ENDPOINT=10.100.0.35:5020` `MODBUS_SIM_PROFILE=` (swap the host sim to match) | `tests/Drivers/…Modbus.IntegrationTests` | | AbCip | `AB_SERVER_ENDPOINT=10.100.0.35:44818` `AB_SERVER_PROFILE=controllogix` | `tests/Drivers/…AbCip.IntegrationTests` | +| AbLegacy | `AB_LEGACY_ENDPOINT=10.100.0.35:44818` `AB_LEGACY_COMPOSE_PROFILE=` (**must** match the running PCCC container — else the `[Theory]` runs all 3 families and 2 fail) | `tests/Drivers/…AbLegacy.IntegrationTests` | | FOCAS | `OTOPCUA_FOCAS_SIM_ENDPOINT=10.100.0.35:8193` (but tests assume 127.0.0.1 — see above) | `tests/Drivers/…FOCAS.IntegrationTests` | | Host | `OTOPCUA_HARNESS_USE_SQL=1` (+ SQL `:14331` via `tests/Server/…Host.IntegrationTests/docker-compose.yml up sql`) `OTOPCUA_HARNESS_USE_LDAP=0` | `tests/Server/…Host.IntegrationTests` |