docs(review): record #761 gate D AdminUI live pass (4/5 PASS; 4 unconfirmed deletes)
v2-ci / unit-tests (push) Has been cancelled
v2-ci / unit-tests (push) Has been cancelled
Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
This commit is contained in:
@@ -274,3 +274,45 @@ Mishap: two aborted SQL Server probe attempts (row-by-row seeding was too slow,
|
||||
## Cleanup
|
||||
|
||||
Container `h1-gate-questdb` removed. The fixture host is unchanged. The worktree `scratchpad/wt/otopc-fix` (branch w18/fixtures) is left in place with uncommitted probe edits. Remove it with `git worktree remove --force` if not wanted.
|
||||
|
||||
## Gate D (#745) — AdminUI live pass, docker-dev (2026-11-09) — FAIL (1 of 5 checks)
|
||||
|
||||
Overall: four checks PASS; the delete-confirmation check FAILS on four pages (filed as a follow-up issue, see #761). Full record below, as written by the Chrome pass.
|
||||
|
||||
Date: 2026-11-09 (container clock 2026-11-10 03:xx UTC). Rig: local docker-dev, otopcua-host:dev image built 2026-11-09 20:35 EST from master 1b9c36f3 (per coordinator; rig built from a scratchpad worktree no longer on disk, so commit not re-verifiable from the container). AdminUI http://localhost:9200 (login disabled, session "multi-role-test"). Wonder boxes untouched. No deploy performed.
|
||||
|
||||
### 1. 100 KB script survives save + reload - PASS
|
||||
Procedure: /scripts/new, set Monaco model to 102,492 chars (1,200+ comment lines + `return 1;`), name gateD-100kb-test, Create. Reloaded /scripts/SC-d82b3a36fd85; editor text === regenerated original (identical, length 102492 both). Then deleted it (own modal).
|
||||
|
||||
### 2. Two-tab /hosts CPU flat with ~50 drivers - PASS
|
||||
Rig has 52 drivers on cluster MAIN (48 int3b-mb-*, blackhole, Calc, opcplc, pymodbus); site-a/b have none. `docker stats --no-stream` on central-1/central-2 (the AdminUI hosts), 8 samples ~12s apart (~100s) per condition:
|
||||
- no /hosts tab (on /): central-1 11.0%, central-2 10.9% avg
|
||||
- 1 /hosts tab (first run): c1 9.7%, c2 11.4%
|
||||
- 2 /hosts tabs: c1 10.9%, c2 12.1% avg
|
||||
Within noise (range 8-17% in every condition). Flat. Raw: scratchpad/cpu-*.txt.
|
||||
|
||||
### 3. 5k-tag device renders < 2 s - PASS
|
||||
No such device existed. Created disabled-in-effect (never deployed) Modbus driver gateD-bulk/device gdev under docker-dev, imported 5000-row CSV via the Raw tree modal (parse+review 206 ms, commit 717 ms). Expanding gdev: first tag rows in DOM 14-20 ms after click, painted (double rAF) 44 ms. Tree paged: 500 rendered ("Show 500 more (4500 not shown)") and DOM ~611 nodes. Far under 2 s.
|
||||
Cleanup: tags cannot be bulk-deleted in UI (device delete: "Delete blocked - contains tags"), so removed gateD-bulk rows (5000 Tag, TagGroup, Device, DriverInstance) by scoped SQL delete in a transaction on the rig OtOpcUa DB (needed `sqlcmd -I`). Verified 0 gateD DriverInstances, Tag total back to 55.
|
||||
Observation (not a defect): no bulk "delete all tags in device" in Raw tree.
|
||||
|
||||
### 4. Every delete asks for confirmation - FAIL (4 defects)
|
||||
window.confirm overridden; no native confirm ever fired. Own modal confirmed + Cancel verified (item survives) for: script delete (ScriptEdit), API key delete (/apikeys), all 10 UNS-tree deletes on /uns (enterprise, clusters, area, line, equipment), Raw-tree driver delete and device delete (modals). Equipment-page virtual-tag/alarm/reference deletes: source uses ConfirmDeleteVirtualTag/ConfirmDeleteAlarm/ConfirmRemoveReference; no live rows on the sampled equipment (NOT exercised live). Certificates delete uses RequestAction -> Confirm panel (source).
|
||||
DEFECTS - delete executes immediately on click, no confirmation:
|
||||
a) /role-grants Delete (RoleGrants.razor:68 -> DeleteAsync(r.Id)). LIVE-VERIFIED: added test grant cn=gated-test..., clicked Delete, row gone instantly, no modal. (Test grant thus already removed.)
|
||||
b) ClusterEdit.razor:102 `@onclick="DeleteAsync"` (cluster delete) - source only
|
||||
c) NodeEdit.razor:119 `@onclick="DeleteAsync"` (cluster node delete) - source only
|
||||
d) AclEdit.razor:151 `@onclick="DeleteAsync"` (node ACL delete) - source only
|
||||
(CollectionEditor.razor:31 per-row Delete in driver forms is a working-copy edit committed on Save - not counted.)
|
||||
Repro for (a): http://localhost:9200/role-grants, add any group, press its Delete.
|
||||
|
||||
### 5. A6 diagnostics panel shows real counts - PASS
|
||||
/fleet/diagnostics?node=central-1:4053 : DRIVERS 52, FAULTED DEVICES 0, CONFIG SOURCE live, REVISION e221b1792cbd..., per-driver rows (48 HEALTHY int3b-mb-* with 1 connected device each, Calc/opcplc/pymodbus HEALTHY, int3b-blackhole INITIALIZING 0 connected). /hosts shows the same 52 driver instances and blackhole INITIALIZING "1 / 1 DOWN". Disabled int3b-bulk correctly absent. Minor: blackhole's down device is not counted in "FAULTED DEVICES 0" (state INITIALIZING, not faulted) - arguably fine, flag for A6 owner.
|
||||
|
||||
### Revert state
|
||||
Test script, test role grant, gateD-bulk driver/device/5000 tags all removed; no deploys; browser tab closed. Rig config as found.
|
||||
|
||||
### Still not run after gate D
|
||||
|
||||
- Gate F (Galaxy) — needs a reachable mxaccessgw.
|
||||
- Hardware userGates (real PLCs), as listed under NOT RUN above.
|
||||
|
||||
Reference in New Issue
Block a user