4783f3e32e
实现 Lifecycle 类型及其全部公开方法,覆盖 6 个状态迁移动作: MarkProbing / MarkUp / MarkDraining / MarkDown / MarkDestroyed / MarkBlockedSuspect。每次合法迁移在同一个 SQL 事务中原子执行 UPDATE nodes + INSERT node_events + BumpVersion;MarkDestroyed 事务提交后异步调用 mtls.CRL.Revoke() 并清除 Redis 负载缓存与 命令队列键。配套集成测试覆盖 5 类场景(合法迁移、非法迁移、 并发写、后置钩子、blocked_suspect 幂等),全部通过。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
42 lines
1.1 KiB
Bash
42 lines
1.1 KiB
Bash
#!/bin/bash
|
|
# Start a MySQL 8 container, wait for it to be ready, run lifecycle integration tests, and clean up.
|
|
set -e
|
|
|
|
CONTAINER_NAME="lc-mysql-$(date +%s)"
|
|
PORT=13307
|
|
|
|
echo "Starting MySQL container: $CONTAINER_NAME on port $PORT"
|
|
docker run -d \
|
|
--name "$CONTAINER_NAME" \
|
|
-e MYSQL_ROOT_PASSWORD=secret \
|
|
-e MYSQL_DATABASE=pangolin_test \
|
|
-p "$PORT:3306" \
|
|
mysql:8 >/dev/null
|
|
|
|
cleanup() {
|
|
echo "Stopping container $CONTAINER_NAME"
|
|
docker stop "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
|
docker rm "$CONTAINER_NAME" >/dev/null 2>&1 || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
# Wait for MySQL to be ready (max 60 s)
|
|
echo "Waiting for MySQL to be ready..."
|
|
for i in $(seq 1 30); do
|
|
if docker exec "$CONTAINER_NAME" mysqladmin ping --silent 2>/dev/null; then
|
|
echo "MySQL ready after ${i}*2 seconds"
|
|
break
|
|
fi
|
|
sleep 2
|
|
done
|
|
|
|
DSN="root:secret@tcp(127.0.0.1:${PORT})/pangolin_test"
|
|
echo "Running lifecycle integration tests with DSN=$DSN"
|
|
|
|
PANGOLIN_TEST_DSN="$DSN" go test -tags integration \
|
|
./internal/nodes/... \
|
|
-run "TestLifecycle" \
|
|
-v -count=1 -timeout 120s
|
|
|
|
echo "Tests complete"
|