forked from admin/PlantAI-rag-new
- git mv 保留历史:ui/(Vue3+Vite)、sdk/(BFF 中间层)
- 路径语义修正:db_path/figures_cache 改相对 sdk/(BFF cwd),
历史库 sdk/backend/data 迁移至 sdk/data/(会话/图片缓存无损)
- 引用修复 ~15 处:config.py、deploy/*.sh、vitest/playwright 配置、
单测导入路径、docs、README、gitignore、.env.example
- 骨架:agent/{qa,methodology,legacy-rag,vendor}、knowledge/manifest.yaml、
tooling/{compile,kb,crypto,assemble,audit,tools,scripts} + README
- 门禁验证:sdk pytest 125 通过、ui vitest 158 通过、
生产 BFF 脚本重启四上游全绿 + 静态托管 + 会话库无损
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
128 lines
5.0 KiB
Bash
Executable File
128 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
||
# smoke_upstreams.sh —— L2s 上游连通性冒烟(T 归属,TEST_PLAN §1/§7)。
|
||
# 只读探测远端机上四个服务的健康契约,输出 PASS/FAIL 表。不改任何状态。
|
||
# 运行处:远端 plantai-bff 机(上游只绑 127.0.0.1,须在本机执行);Mac 本地经 SSH 隧道
|
||
# 运行时用环境变量改 URL(见文末「远程探测」注释)。
|
||
# 非 CI 常驻:仅集成点(M2)与验收前手动执行一次。
|
||
#
|
||
# 环境变量覆盖:
|
||
# QA_URL QA 服务根,默认 http://127.0.0.1:7920
|
||
# EXTRACT_URL 抽取服务根,默认 http://127.0.0.1:8000
|
||
# ALT_URL 回落抽取服务根,默认 http://127.0.0.1:7900
|
||
# MOCK_URL mock server 根,默认 http://127.0.0.1:8099
|
||
# NEO4J_HTTP Neo4j HTTP 根,默认 http://127.0.0.1:18575(direct-v1-full 实例,DISCOVERY.md §1)
|
||
# NEO4J_USER / NEO4J_PASSWORD Neo4j 认证,默认 neo4j / <NEO4J_PASSWORD from sdk/.env>(DISCOVERY.md §2.1)
|
||
# TIMEOUT curl 超时秒,默认 4
|
||
#
|
||
# 注意:不探测 QA /search 与 /chat/stream —— 实测单次 37~92s(DISCOVERY.md §4),
|
||
# 冒烟只验证 /health 与 /info 可达。
|
||
|
||
set -u
|
||
QA_URL="${QA_URL:-http://127.0.0.1:7920}"
|
||
EXTRACT_URL="${EXTRACT_URL:-http://127.0.0.1:8000}"
|
||
ALT_URL="${ALT_URL:-http://127.0.0.1:7900}"
|
||
MOCK_URL="${MOCK_URL:-http://127.0.0.1:8099}"
|
||
NEO4J_HTTP="${NEO4J_HTTP:-http://127.0.0.1:18575}"
|
||
TIMEOUT="${TIMEOUT:-4}"
|
||
|
||
PASS=0
|
||
FAIL=0
|
||
FAILED_LINES=()
|
||
TMP="$(mktemp)"
|
||
trap 'rm -f "$TMP"' EXIT
|
||
|
||
# check_http <名称> <URL> [预期子串]
|
||
check_http() {
|
||
local name="$1" url="$2" expect="${3:-}"
|
||
local out code
|
||
out=$(curl -s -m "$TIMEOUT" -o "$TMP" -w '%{http_code}' "$url" 2>/dev/null)
|
||
code=$?
|
||
if [ "$code" -ne 0 ]; then
|
||
printf '%-16s FAIL 连接失败(curl exit %s)\n' "$name" "$code"
|
||
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
|
||
return
|
||
fi
|
||
if [ "$out" != "200" ]; then
|
||
printf '%-16s FAIL HTTP %s\n' "$name" "$out"
|
||
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
|
||
return
|
||
fi
|
||
if [ -n "$expect" ] && ! grep -q "$expect" "$TMP"; then
|
||
printf '%-16s FAIL HTTP 200 但响应不含「%s」\n' "$name" "$expect"
|
||
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
|
||
return
|
||
fi
|
||
printf '%-16s PASS HTTP 200\n' "$name"
|
||
PASS=$((PASS+1))
|
||
}
|
||
|
||
# check_neo4j <名称> <HTTP 根>:POST db/neo4j/tx/commit 一条最小只读 Cypher。
|
||
# 契约(DISCOVERY.md §2.1):direct-v1-full 需要 Basic auth(neo4j/<NEO4J_PASSWORD from sdk/.env>);
|
||
# 凭据经环境变量 NEO4J_USER/NEO4J_PASSWORD 覆盖(默认指向当选实例)。
|
||
check_neo4j() {
|
||
local name="$1" base="$2"
|
||
local user="${NEO4J_USER:-neo4j}"
|
||
local pass="${NEO4J_PASSWORD:-<NEO4J_PASSWORD from sdk/.env>}"
|
||
local out code
|
||
out=$(curl -s -m "$TIMEOUT" -o "$TMP" -w '%{http_code}' \
|
||
-u "$user:$pass" \
|
||
-X POST -H 'Content-Type: application/json' \
|
||
-d '{"statements":[{"statement":"MATCH (e:SRT2CanonicalEntity) RETURN e.name LIMIT 1"}]}' \
|
||
"$base/db/neo4j/tx/commit" 2>/dev/null)
|
||
code=$?
|
||
if [ "$code" -ne 0 ]; then
|
||
printf '%-16s FAIL 连接失败(curl exit %s)\n' "$name" "$code"
|
||
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
|
||
return
|
||
fi
|
||
if [ "$out" != "200" ]; then
|
||
printf '%-16s FAIL HTTP %s(认证或实例异常,检查 NEO4J_USER/NEO4J_PASSWORD)\n' "$name" "$out"
|
||
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
|
||
return
|
||
fi
|
||
if grep -q '"errors":\[\]' "$TMP" && grep -q '"results"' "$TMP"; then
|
||
printf '%-16s PASS HTTP 200(Cypher 查询有结果)\n' "$name"
|
||
PASS=$((PASS+1))
|
||
else
|
||
printf '%-16s FAIL HTTP 200 但 Cypher 查询返回错误/空 results\n' "$name"
|
||
FAIL=$((FAIL+1)); FAILED_LINES+=("$name")
|
||
fi
|
||
}
|
||
|
||
echo "== 上游连通性冒烟(timeout ${TIMEOUT}s,$(date '+%F %T'))=="
|
||
echo
|
||
|
||
echo "-- QA (7920),契约:DISCOVERY.md §4 --"
|
||
check_http "QA health" "$QA_URL/api/v1/qa-v1-1-73/health" '"status":"ok"'
|
||
check_http "QA info" "$QA_URL/api/v1/qa-v1-1-73/info" 'version'
|
||
|
||
echo "-- 抽取 (8000),契约:DISCOVERY.md §3 --"
|
||
check_http "抽取 health" "$EXTRACT_URL/health" '"status":"healthy"'
|
||
check_http "抽取 jobs" "$EXTRACT_URL/api/v1/methodology/extract-jobs?limit=1" '"jobs"'
|
||
|
||
echo "-- 抽取回落 (7900),契约:DISCOVERY.md §3.7 --"
|
||
check_http "7900 health" "$ALT_URL/health"
|
||
|
||
echo "-- Neo4j (bolt 18788 ↔ HTTP 18575),契约:DISCOVERY.md §2 --"
|
||
check_neo4j "Neo4j 查询" "$NEO4J_HTTP"
|
||
|
||
echo "-- mock (8099),契约:ARCHITECTURE.md §6 / API.md --"
|
||
check_http "mock health" "$MOCK_URL/api/health" '"upstreams"'
|
||
|
||
echo
|
||
echo "== 汇总 =="
|
||
echo "PASS: $PASS | FAIL: $FAIL"
|
||
if [ "$FAIL" -gt 0 ]; then
|
||
echo "失败项: ${FAILED_LINES[*]}"
|
||
exit 1
|
||
fi
|
||
exit 0
|
||
|
||
# ---- 远程探测(Mac 本地运行,经 SSH 隧道)----
|
||
# 远端上游只绑 127.0.0.1,本地需先起隧道(以 QA 7920 与 Neo4j 18575 为例):
|
||
# ssh -N -L 7920:127.0.0.1:7920 -L 18575:127.0.0.1:18575 xzq@100.109.52.26
|
||
# 然后:
|
||
# QA_URL=http://127.0.0.1:7920 NEO4J_HTTP=http://127.0.0.1:18575 \
|
||
# bash tests/smoke_upstreams.sh
|
||
# 注意:隧道只解决了连通,Neo4j 数据源真实内容仍以远端为准。
|