- build 06f2df4f (notify-and-fetch deploy rework) + AddPendingDeployment migration
- CentralFetchBaseUrl config; notify-and-fetch verified end-to-end
- live ConfigDb: binding-completeness fixes (Z28061/Z28062) + CvdReactor
DelmiaRecv->DelmiaReceiver template rename (config-as-data, not source)
5.5 KiB
Deployment record — wonder-app-vd03 — 2026-06-27
Point-in-time record of a ScadaBridge upgrade + live configuration changes on the
single-host install at wonder-app-vd03.zmr.zimmer.com (E:\ApiInstall\ScadaBridge,
three Windows services: ScadaBridge-LDAP, ScadaBridge-Central :8085, ScadaBridge-Site).
Runtime config on this box (instance connection bindings, template compositions) is config-as-data held in the
ScadaBridgeSQL ConfigDb and applied via the management API — it is not source-controlled. This file is the durable record of those changes. Secrets (DB password, gateway API key, JWT/pepper) are intentionally omitted.
1. Binary + schema upgrade
| Item | Value |
|---|---|
| Build deployed | main @ 06f2df4f (from 1f261263; 40 commits) |
| Headline change | notify-and-fetch deploy rework — Central stages a PendingDeployment row + sends RefreshDeploymentCommand; the Site fetches config over HTTP from GET {CentralFetchBaseUrl}/api/internal/deployments/{id}/config. Retires the old cross-cluster DeployInstanceCommand config-push path. |
| EF migration applied | 20260626161432_AddPendingDeployment (additive: new PendingDeployments table + FK + 3 indexes). Baseline was 20260619191520_SmsFromNumberOptional. From→to script via sqlcmd -C -b -I. |
| New required config | ScadaBridge:Communication:CentralFetchBaseUrl = http://localhost:8085 in appsettings.Central.json (empty → deploy fail-fast). Site needs nothing new — it receives the URL+token in the notify/reconcile message. |
| Not deployed | the new standalone DelmiaNotifier console tool (external client, not part of the Host service). |
| Preserved across swap | box appsettings.json + appsettings.Site.json + the entire app\data\ (inbound-api-keys.sqlite, 53 KB). |
| DB backup | E:\ApiInstall\ScadaBridge-backups\ScadaBridge_pre-AddPendingDeployment_20260627T001136.bak |
| Binary backup | E:\ApiInstall\ScadaBridge\app.bak.20260627T001254 (old 1f261263 binaries + appsettings + data) |
Verification
/health/ready= 200 Healthy (database + akka-cluster Up + all 5 required singletons).- DisableLogin active (mgmt API no-auth → 200); inbound auth intact (bogus
X-API-Key→ 401). - New
SiteReconciliationActor/SiteReplicationActorstarted; reconcile pass0 fetched, 0 failed, 0 orphan(s). - Notify-and-fetch proven end-to-end: deploying an instance staged a
PendingDeployment→ Site fetched config (200, ~118 KB) overCentralFetchBaseUrl→ applied → re-subscribed.
2. Live ConfigDb changes (config-as-data, not in git)
2a. Instance connection-binding completeness fixes
Several CvdReactor instances failed pre-deployment validation (missing binding rows for
data-sourced attributes — every existing binding correctly pointed at the only site
connection, MxGateway id=1). Fixed by adding the missing bindings via
SetConnectionBindings (full-list replace), then redeploying. Galaxy object names were
read from the gateway snapshot hierarchy (galaxy-snapshot.json).
| Instance (id) | Reactor-level DelmiaReceiver object |
LeakTest side objects | Result |
|---|---|---|---|
| Z28061 (1) | DelmiaReceiver_038 |
(already bound: Left_002/Right_002) |
+10 bindings → deploys, 270 tags, DelmiaReceiver 10/10 Good |
| Z28062 (2) | DelmiaReceiver_039 |
Left_003.LeakTest.* / Right_003.LeakTest.* |
+60 bindings → deploys, 270 tags, DelmiaReceiver 10/10 Good, LeakTest 28/50 Good (22 Bad = genuine idle-2nd-reactor source state) |
| Z28061Sim (8) | DelmiaReceiver_037 |
Left_001/Right_001 |
already complete (reference instance) |
2b. CvdReactor template rename: DelmiaRecv → DelmiaReceiver
The CvdReactor template (id 1) had a typo'd reactor-level composition DelmiaRecv
(built from a duplicate template named DelmiaRecv, byte-identical to the proper
DelmiaReceiver template id 12). Corrected:
DeleteTemplateComposition(theDelmiaRecvcomposition) — this also auto-removed its composition-owned clone template (the oldDelmiaRecvtemplate id 25).AddTemplateComposition→DelmiaReceiverfrom template 12 (engine cloned 12 → new template id 26; composition uses the clone).- Flattened attribute paths changed
DelmiaRecv.*→DelmiaReceiver.*, so all three CvdReactor instances were rebound (binding prefix renamed; sourceDelmiaReceiver_03xobjects unchanged) and redeployed.
Result: CvdReactor components are now LeftMESReceiver, RightMESReceiver, LeftReactorSide, RightReactorSide, LeftDelmiaReceiver, RightDelmiaReceiver, DelmiaReceiver. No DelmiaRecv
template or component remains. Z28061 DelmiaReceiver.* reads 10/10 Good.
3. Instance deployability — final
| Instance | Template | Deploys? |
|---|---|---|
| Z28061 | CvdReactor | ✅ |
| Z28062 | CvdReactor | ✅ |
| Z28061Sim | CvdReactor | ✅ |
| ZIPSEN (id 7) | IpsenSim (18) | ❌ pre-existing MESReceiver (26) binding gap — unfinished/draft instance, not touched |
4. Rollback
- Schema: restore
ScadaBridge_pre-AddPendingDeployment_20260627T001136.bak(the migrationDowndropsPendingDeployments). - Binaries: restore
app.bak.20260627T001254+ restart Central then Site. - Binding/template changes: pre-edit binding sets were captured at deploy time; the template
composition swap is reversible via
DeleteTemplateComposition/AddTemplateComposition.
5. Outstanding
- ZIPSEN is the only non-deployable instance — needs its full
MESReceiverbinding set authored (or to be retired). Deferred pending confirmation it is wanted.