feat(scripts): realign Test Run with runtime API, add anonymous-object calls and instance binding
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.
This commit is contained in:
124
infra/reseed.sh
Executable file
124
infra/reseed.sh
Executable file
@@ -0,0 +1,124 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user