- Add JoeAppEngine folder to OPC UA nodes.json (BTCS, AlarmCntsBySeverity, Scheduler/ScanTime) - Fix DataConnectionActor: capture Self in PreStart for use from non-actor threads, preventing Self.Tell failure in Disconnected event handler - Implement InstanceActor.HandleConnectionQualityChanged to mark attributes Bad on disconnect - Fix LmxFakeProxy TagMapper to serialize arrays as JSON instead of "System.Int32[]" - Allow DataType and DataSourceReference updates in TemplateService.UpdateAttributeAsync - Update test_infra_opcua.md with JoeAppEngine documentation
ScadaLink Test Infrastructure
Local Docker-based test services for ScadaLink development.
Quick Start
docker compose up -d
This starts five services:
| Service | Port | Purpose |
|---|---|---|
| OPC UA (Azure IoT OPC PLC) | 50000 (OPC UA), 8080 (web) | Simulated OPC UA server with ScadaLink-style tags |
| LDAP (GLAuth) | 3893 | Lightweight LDAP with test users/groups matching ScadaLink roles |
| MS SQL 2022 | 1433 | Configuration and machine data databases |
| SMTP (Mailpit) | 1025 (SMTP), 8025 (web) | Email capture for notification testing |
| REST API (Flask) | 5200 | External REST API for Gateway and Inbound API testing |
| LmxFakeProxy (.NET gRPC) | 50051 (gRPC) | LmxProxy-compatible server bridging to OPC UA test server |
First-Time SQL Setup
The MS SQL container does not auto-run init scripts. After the first docker compose up -d, run:
docker exec -i scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U sa -P 'ScadaLink_Dev1#' -C \
-i /docker-entrypoint-initdb.d/setup.sql
This creates the ScadaLinkConfig and ScadaLinkMachineData databases and the scadalink_app login. Then seed the Machine Data database:
docker exec -i scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U sa -P 'ScadaLink_Dev1#' -C \
-i /docker-entrypoint-initdb.d/machinedata_seed.sql
Stopping & Teardown
Stop containers (data persists in SQL volume):
docker compose down
Stop a single service (leave the others running):
docker compose stop opcua # or: ldap, mssql, smtp, restapi
docker compose start opcua # bring it back without recreating
Full teardown (stop containers, delete SQL data volume, remove pulled images):
./teardown.sh
Or manually:
docker compose down -v # stop containers + delete SQL data volume
docker compose down -v --rmi all # also remove downloaded images
After a full teardown, the next docker compose up -d starts fresh — you'll need to re-run the SQL setup script.
CLI Tools
Python CLI tools for interacting with the test services are in tools/.
Set up a Python virtual environment (one-time):
python3 -m venv tools/.venv && source tools/.venv/bin/activate
Install dependencies (one-time, with venv active):
pip install -r tools/requirements.txt
The
.venvdirectory is gitignored.
Quick readiness check (all five services, with venv active):
python tools/opcua_tool.py check
python tools/ldap_tool.py check
python tools/mssql_tool.py check
python tools/smtp_tool.py check
python tools/restapi_tool.py check
| Tool | Service | Key Commands |
|---|---|---|
tools/opcua_tool.py |
OPC UA | check, browse, read, write, monitor |
tools/ldap_tool.py |
LDAP | check, bind, search, users, groups |
tools/mssql_tool.py |
MS SQL | check, setup, query, tables |
tools/smtp_tool.py |
SMTP (Mailpit) | check, send, list, read, clear |
tools/restapi_tool.py |
REST API (Flask) | check, call, methods |
Each tool supports --help for full usage. See the per-service docs below for detailed examples.
Detailed Documentation
See the project root for per-service setup guides:
- test_infra.md — Master test infrastructure overview
- test_infra_opcua.md — OPC UA server details
- test_infra_ldap.md — LDAP server details
- test_infra_db.md — MS SQL database details
- test_infra_smtp.md — SMTP server details (Mailpit)
- test_infra_restapi.md — REST API server details (Flask)