# Test Infrastructure This document describes the local Docker-based test infrastructure for ScadaLink development. Five services provide the external dependencies needed to run and test the system locally. ## Services | Service | Image | Port(s) | Config | |---------|-------|---------|--------| | OPC UA Server | `mcr.microsoft.com/iotedge/opc-plc:latest` | 50000 (OPC UA), 8080 (web) | `infra/opcua/nodes.json` | | LDAP Server | `glauth/glauth:latest` | 3893 | `infra/glauth/config.toml` | | MS SQL 2022 | `mcr.microsoft.com/mssql/server:2022-latest` | 1433 | `infra/mssql/setup.sql` | | SMTP (Mailpit) | `axllent/mailpit:latest` | 1025 (SMTP), 8025 (web) | Environment vars | | REST API (Flask) | Custom build (`infra/restapi/Dockerfile`) | 5200 | `infra/restapi/app.py` | ## Quick Start ```bash cd infra docker compose up -d ``` After the first startup, run the SQL setup and seed scripts: ```bash 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 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 ``` ## Per-Service Documentation Each service has a dedicated document with configuration details, verification steps, and troubleshooting: - [test_infra_opcua.md](test_infra_opcua.md) — OPC UA test server (Azure IoT OPC PLC) - [test_infra_ldap.md](test_infra_ldap.md) — LDAP test server (GLAuth) - [test_infra_db.md](test_infra_db.md) — MS SQL 2022 database - [test_infra_smtp.md](test_infra_smtp.md) — SMTP test server (Mailpit) - [test_infra_restapi.md](test_infra_restapi.md) — REST API test server (Flask) ## Connection Strings For use in `appsettings.Development.json`: ```json { "ConnectionStrings": { "ScadaLinkConfig": "Server=localhost,1433;Database=ScadaLinkConfig;User Id=scadalink_app;Password=ScadaLink_Dev1#;TrustServerCertificate=true", "ScadaLinkMachineData": "Server=localhost,1433;Database=ScadaLinkMachineData;User Id=scadalink_app;Password=ScadaLink_Dev1#;TrustServerCertificate=true" }, "Ldap": { "Server": "localhost", "Port": 3893, "BaseDN": "dc=scadalink,dc=local", "UseSsl": false }, "OpcUa": { "EndpointUrl": "opc.tcp://localhost:50000" }, "Smtp": { "Server": "localhost", "Port": 1025, "AuthMode": "None", "FromAddress": "scada-notifications@company.com", "ConnectionTimeout": 30 }, "ExternalSystems": { "TestApi": { "BaseUrl": "http://localhost:5200", "AuthMode": "ApiKey", "ApiKey": "scadalink-test-key-1" } } } ``` ## Stopping & Teardown ```bash cd infra docker compose down # stop containers, preserve SQL data volume docker compose stop opcua # stop a single service (also: ldap, mssql, smtp, restapi) ``` **Full teardown** (removes volumes, optionally images and venv): ```bash cd infra ./teardown.sh # stop containers + delete SQL data volume ./teardown.sh --images # also remove downloaded Docker images ./teardown.sh --all # also remove the Python venv ``` After a full teardown, the next `docker compose up -d` starts fresh — re-run the SQL setup script. ## Files ``` infra/ docker-compose.yml # All five services teardown.sh # Teardown script (volumes, images, venv) glauth/config.toml # LDAP users and groups mssql/setup.sql # Database and user creation mssql/machinedata_seed.sql # Machine Data tables, stored procedures, sample data opcua/nodes.json # Custom OPC UA tag definitions restapi/app.py # Flask REST API server restapi/Dockerfile # REST API container build tools/ # Python CLI tools (opcua, ldap, mssql, smtp, restapi) README.md # Quick-start for the infra folder ```