feat(nodes): 节点生命周期状态机 [tsk_aG4yOS90inF_]
实现 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>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user