Files
lmxopcua/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Sql.IntegrationTests/Docker/docker-compose.yml
T
Joseph Doherty 10a6a37ca5 test(sql): blackhole/timeout live-gate on a dedicated mssql container
Adds the frozen-peer / BadTimeout gate for the Sql driver — the single
highest-value integration test. Mirrors the S7 R2-01 blackhole gate:
docker pause a DEDICATED mssql mid-poll, assert the next read surfaces
BadTimeout within the client-side operationTimeout (≈3s) and well below
the server-side CommandTimeout backstop (30s), the driver degrades
(Degraded + host Stopped), and docker unpause recovers to Healthy/Running.

- Docker/docker-compose.yml: disposable `otopcua-sql-blackhole` mssql on
  :14333 (never the shared :14330 ConfigDb server) + one-shot seed.
- Docker/seed.sql: the two sample tables.
- SqlBlackholeTimeoutTests.cs: env-gated (SQL_BLACKHOLE_ENDPOINT); pauses
  ONLY the hard-coded container name; skips loudly if the endpoint is the
  shared port 14330; bounds its own wait so a wedged impl fails, not hangs.
  Offline: clean skip (no socket, no docker shell-out).

Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW
2026-07-24 15:20:24 -04:00

69 lines
3.2 KiB
YAML

# Dedicated, DISPOSABLE SQL Server for the Sql driver's blackhole / frozen-peer live gate.
#
# ── SAFETY ─────────────────────────────────────────────────────────────────────
# This stack owns its OWN mssql container, `otopcua-sql-blackhole`, on host port
# 14333. The blackhole gate `docker pause`s THIS container by that hard-coded name.
# It is NOT — and must never be — the rig's shared always-on SQL Server, which is
# `10.100.0.35,14330` and hosts ConfigDb for the whole dev rig. Two independent
# guardrails keep them apart:
# 1. a distinct container_name (`otopcua-sql-blackhole`) — the pause target is a
# compile-time constant in the test, and the shared server is not named this; and
# 2. a distinct host port (14333, not 14330) — the test SKIPS LOUDLY if its
# endpoint resolves to port 14330.
# `restart: "no"` so a paused/killed container stays down rather than respawning.
#
# ── DEPLOY (from this VM; docker runs on the shared Linux host) ──────────────────
# lmxopcua-fix sync sql-blackhole # rsync this Docker/ dir → /opt/otopcua-sql-blackhole/
# lmxopcua-fix up sql-blackhole # single-service stack (+ one-shot seed), no profile arg
# `lmxopcua-fix` applies the host-side `project=lmxopcua` label; the explicit label
# below keeps the stack discoverable even when brought up with plain `docker compose`.
#
# The one-shot `mssql-seed` service applies seed.sql once the server is healthy, so
# the stack is self-seeding. The blackhole test ALSO seeds defensively on connect
# (create-if-missing, same schema), so a stack that never ran the seed still works.
name: otopcua-sql-blackhole
services:
mssql:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: otopcua-sql-blackhole
labels:
project: lmxopcua
restart: "no"
environment:
ACCEPT_EULA: "Y"
# Dev-only sandbox password for a throwaway container. Override via the shell env
# (the same value the test reads from SQL_BLACKHOLE_PASSWORD).
MSSQL_SA_PASSWORD: "${SQL_BLACKHOLE_SA_PASSWORD:-Blackhole_dev_pw1}"
MSSQL_PID: "Developer"
ports:
- "14333:1433"
healthcheck:
# -C trusts the self-signed dev cert; the login succeeding is the readiness signal.
test:
- "CMD-SHELL"
- "/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P \"$${MSSQL_SA_PASSWORD}\" -Q 'SELECT 1' || exit 1"
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
# One-shot seed: waits for the server to pass its healthcheck, applies seed.sql, exits.
mssql-seed:
image: mcr.microsoft.com/mssql/server:2022-latest
labels:
project: lmxopcua
restart: "no"
depends_on:
mssql:
condition: service_healthy
environment:
MSSQL_SA_PASSWORD: "${SQL_BLACKHOLE_SA_PASSWORD:-Blackhole_dev_pw1}"
volumes:
- ./seed.sql:/seed.sql:ro
entrypoint:
- "/bin/bash"
- "-c"
- "/opt/mssql-tools18/bin/sqlcmd -C -S mssql -U sa -P \"$${MSSQL_SA_PASSWORD}\" -i /seed.sql"