The Test Run sandbox and Monaco analysis modelled a script API that had drifted from the site runtime's ScriptGlobals, so real scripts failed to compile in Test Run. Realign both to the runtime surface (Instance/Scripts/ExternalSystem/Attributes/Children/Parent) and drop the duplicate ScriptHost stub so the two cannot diverge again. - Script calls (Scripts.CallShared, Instance.CallScript, Route.To().Call) accept an anonymous object instead of a hand-built dictionary, via a shared ScriptArgs normalizer; existing dictionary calls still compile. - Test Run can optionally bind to a deployed instance, so Instance/ Attributes/CallScript route to it cross-site; adds site-side RouteToGetAttributes/RouteToSetAttributes handlers. - Adds Test Run panels to the API method and template script editors. - Fixes the TestDatabaseQuery seed script, which queried a table that never existed. Also commits unrelated in-progress work already in the tree: the health monitoring report loop, site streaming changes, and the Admin/Design data-connection and SMTP page reorganization.
125 lines
3.6 KiB
Bash
Executable File
125 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Full reseed of the ScadaLink test cluster.
|
|
#
|
|
# Tears down infra + app containers, drops the MSSQL volume, brings
|
|
# everything back, lets EF Core migrations create the schema, replays
|
|
# infra/mssql/seed-config.sql for templates/scripts/data-connections, and
|
|
# re-seeds sites via docker/seed-sites.sh.
|
|
#
|
|
# Usage:
|
|
# infra/reseed.sh Full reseed (default seed file)
|
|
# infra/reseed.sh --seed PATH Replay a different seed SQL
|
|
# infra/reseed.sh --skip-teardown Replay seed against running stack
|
|
#
|
|
# Prerequisites:
|
|
# - Docker / OrbStack running
|
|
# - Python 3 with pymssql (used by infra/tools/mssql_tool.py + dump_seed.py)
|
|
# - Built scadalink:latest image (docker/build.sh — deploy.sh runs it)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
SEED_FILE="$SCRIPT_DIR/mssql/seed-config.sql"
|
|
SKIP_TEARDOWN=false
|
|
MGMT_URL="http://localhost:9000"
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--seed)
|
|
SEED_FILE="$2"
|
|
shift 2
|
|
;;
|
|
--skip-teardown)
|
|
SKIP_TEARDOWN=true
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
sed -n '2,16p' "$0" | sed 's/^# \{0,1\}//'
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ ! -f "$SEED_FILE" ]; then
|
|
echo "Seed file not found: $SEED_FILE" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== ScadaLink Reseed ==="
|
|
echo "Seed file: $SEED_FILE"
|
|
echo ""
|
|
|
|
if ! $SKIP_TEARDOWN; then
|
|
echo "--- Stage 1/6: tear down application containers ---"
|
|
"$PROJECT_ROOT/docker/teardown.sh"
|
|
|
|
echo ""
|
|
echo "--- Stage 2/6: wipe site SQLite state ---"
|
|
shopt -s nullglob
|
|
for d in "$PROJECT_ROOT"/docker/site-*/data; do
|
|
rm -rf "$d"/*
|
|
echo " cleared $d"
|
|
done
|
|
shopt -u nullglob
|
|
|
|
echo ""
|
|
echo "--- Stage 3/6: tear down infra (drops MSSQL volume) ---"
|
|
(cd "$SCRIPT_DIR" && docker compose down -v)
|
|
|
|
echo ""
|
|
echo "--- Stage 4/6: bring infra back up ---"
|
|
(cd "$SCRIPT_DIR" && docker compose up -d)
|
|
|
|
echo " Waiting for MSSQL to accept connections..."
|
|
until docker exec scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \
|
|
-S localhost -U sa -P 'ScadaLink_Dev1#' -C -Q "SELECT 1" >/dev/null 2>&1; do
|
|
sleep 2
|
|
done
|
|
echo " MSSQL ready."
|
|
|
|
echo " Waiting for setup.sql to create ScadaLinkConfig..."
|
|
until docker exec scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \
|
|
-S localhost -U sa -P 'ScadaLink_Dev1#' -C \
|
|
-Q "IF DB_ID('ScadaLinkConfig') IS NULL THROW 50000, 'not ready', 1;" \
|
|
>/dev/null 2>&1; do
|
|
sleep 2
|
|
done
|
|
echo " ScadaLinkConfig present."
|
|
|
|
echo ""
|
|
echo "--- Stage 5/6: deploy central + site nodes ---"
|
|
"$PROJECT_ROOT/docker/deploy.sh"
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- Stage 6a/6: wait for central cluster /health/ready ---"
|
|
until curl -fs "$MGMT_URL/health/ready" >/dev/null 2>&1; do
|
|
sleep 2
|
|
done
|
|
echo " Central cluster ready (EF Core migrations applied)."
|
|
|
|
echo ""
|
|
echo "--- Stage 6b/6: seed sites (CLI) ---"
|
|
# Sites must exist before the design seed: DataConnections.SiteId FKs to Sites.
|
|
"$PROJECT_ROOT/docker/seed-sites.sh"
|
|
|
|
echo ""
|
|
echo "--- Stage 6c/6: replay seed SQL ---"
|
|
docker exec -i scadalink-mssql /opt/mssql-tools18/bin/sqlcmd \
|
|
-S localhost -U sa -P 'ScadaLink_Dev1#' -C -d ScadaLinkConfig -b < "$SEED_FILE"
|
|
echo " Seed replayed."
|
|
|
|
echo ""
|
|
echo "=== Reseed complete ==="
|
|
echo ""
|
|
echo "Verify:"
|
|
echo " $PROJECT_ROOT/src/ScadaLink.CLI/bin/Debug/net*/ScadaLink.CLI --url $MGMT_URL --username multi-role --password password template list"
|
|
echo ""
|
|
echo "To refresh the seed file from the current DB state:"
|
|
echo " python3 $SCRIPT_DIR/tools/dump_seed.py --output $SEED_FILE"
|