20260330 完成live bundle录制,远程录制,以及与routinator/rpki-client replay对比
This commit is contained in:
@@ -43,3 +43,25 @@
|
||||
- 同次执行总汇总:
|
||||
- `multi_rir_ccr_replay_verify_<timestamp>_summary.md`
|
||||
- `multi_rir_ccr_replay_verify_<timestamp>_summary.json`
|
||||
|
||||
## `run_peer_bundle_matrix.sh`
|
||||
|
||||
用途:
|
||||
- 对一组 `ours live bundle` 做本地 peer replay 矩阵验证
|
||||
- Routinator 与 `rpki-client` 分别消费相同 bundle root
|
||||
- 汇总 `VRP + VAP` 的 base / delta 结果
|
||||
|
||||
用法:
|
||||
- `./scripts/replay_verify/run_peer_bundle_matrix.sh --bundle-root target/replay/live_bundle_matrix_<timestamp>`
|
||||
- `./scripts/replay_verify/run_peer_bundle_matrix.sh --bundle-root target/replay/live_bundle_matrix_<timestamp> --rir apnic,ripe`
|
||||
|
||||
主要产物:
|
||||
- 输出根目录:
|
||||
- `target/replay/peer_bundle_matrix_<timestamp>/`
|
||||
- Routinator:
|
||||
- `target/replay/peer_bundle_matrix_<timestamp>/routinator/<rir>/`
|
||||
- `rpki-client`:
|
||||
- `target/replay/peer_bundle_matrix_<timestamp>/rpki-client/`
|
||||
- 汇总:
|
||||
- `summary.json`
|
||||
- `summary.md`
|
||||
|
||||
175
scripts/replay_verify/run_peer_bundle_matrix.sh
Executable file
175
scripts/replay_verify/run_peer_bundle_matrix.sh
Executable file
@@ -0,0 +1,175 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
BUNDLE_ROOT=""
|
||||
RIRS=""
|
||||
OUT_ROOT=""
|
||||
ROUTINATOR_ROOT="/home/yuyr/dev/rust_playground/routinator"
|
||||
RPKI_CLIENT_ROOT="/home/yuyr/dev/rpki-client-9.7"
|
||||
RPKI_CLIENT_BUILD_DIR="/home/yuyr/dev/rpki-client-9.7/build-m5"
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
Usage:
|
||||
./scripts/replay_verify/run_peer_bundle_matrix.sh \
|
||||
--bundle-root <dir> \
|
||||
[--rir <afrinic,apnic,...>] \
|
||||
[--out-root <dir>] \
|
||||
[--routinator-root <dir>] \
|
||||
[--rpki-client-root <dir>] \
|
||||
[--rpki-client-build-dir <dir>]
|
||||
EOF
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--bundle-root) BUNDLE_ROOT="${2:?}"; shift 2 ;;
|
||||
--rir) RIRS="${2:?}"; shift 2 ;;
|
||||
--out-root) OUT_ROOT="${2:?}"; shift 2 ;;
|
||||
--routinator-root) ROUTINATOR_ROOT="${2:?}"; shift 2 ;;
|
||||
--rpki-client-root) RPKI_CLIENT_ROOT="${2:?}"; shift 2 ;;
|
||||
--rpki-client-build-dir) RPKI_CLIENT_BUILD_DIR="${2:?}"; shift 2 ;;
|
||||
--help|-h) usage; exit 0 ;;
|
||||
*) echo "unknown argument: $1" >&2; usage >&2; exit 2 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ -z "$BUNDLE_ROOT" ]]; then
|
||||
usage >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
RUN_TAG="$(date -u +%Y%m%dT%H%M%SZ)"
|
||||
if [[ -z "$OUT_ROOT" ]]; then
|
||||
OUT_ROOT="target/replay/peer_bundle_matrix_${RUN_TAG}"
|
||||
fi
|
||||
mkdir -p "$OUT_ROOT"
|
||||
|
||||
discover_rirs() {
|
||||
python3 - "$BUNDLE_ROOT" <<'PY'
|
||||
from pathlib import Path
|
||||
import sys
|
||||
root = Path(sys.argv[1])
|
||||
if (root / "base-locks.json").exists():
|
||||
print(root.name)
|
||||
raise SystemExit
|
||||
rirs = []
|
||||
for entry in sorted(root.iterdir()):
|
||||
if not entry.is_dir():
|
||||
continue
|
||||
if (entry / "base-locks.json").exists():
|
||||
rirs.append(entry.name)
|
||||
continue
|
||||
nested = sorted(
|
||||
child.name for child in entry.iterdir()
|
||||
if child.is_dir() and (child / "base-locks.json").exists()
|
||||
)
|
||||
if len(nested) == 1:
|
||||
rirs.append(nested[0])
|
||||
print(",".join(rirs))
|
||||
PY
|
||||
}
|
||||
|
||||
if [[ -z "$RIRS" ]]; then
|
||||
RIRS="$(discover_rirs)"
|
||||
fi
|
||||
|
||||
ROUTI_OUT="$OUT_ROOT/routinator"
|
||||
CLIENT_OUT="$OUT_ROOT/rpki-client"
|
||||
NORMALIZED_BUNDLE_ROOT="$OUT_ROOT/.normalized-bundle-root"
|
||||
mkdir -p "$ROUTI_OUT" "$CLIENT_OUT"
|
||||
rm -rf "$NORMALIZED_BUNDLE_ROOT"
|
||||
mkdir -p "$NORMALIZED_BUNDLE_ROOT"
|
||||
|
||||
IFS=',' read -r -a RIR_LIST <<< "$RIRS"
|
||||
for raw_rir in "${RIR_LIST[@]}"; do
|
||||
rir="$(printf '%s' "$raw_rir" | tr '[:upper:]' '[:lower:]' | xargs)"
|
||||
[[ -n "$rir" ]] || continue
|
||||
source_bundle_dir=""
|
||||
if [[ -d "$BUNDLE_ROOT/$rir" && -f "$BUNDLE_ROOT/$rir/base-locks.json" ]]; then
|
||||
source_bundle_dir="$BUNDLE_ROOT/$rir"
|
||||
else
|
||||
match="$(find "$BUNDLE_ROOT" -maxdepth 2 -type d -path "*/${rir}" -exec test -f '{}/base-locks.json' ';' -print | head -n 1)"
|
||||
if [[ -z "$match" ]]; then
|
||||
echo "unable to resolve bundle directory for RIR: $rir" >&2
|
||||
exit 1
|
||||
fi
|
||||
source_bundle_dir="$match"
|
||||
fi
|
||||
ln -sfn "$source_bundle_dir" "$NORMALIZED_BUNDLE_ROOT/$rir"
|
||||
"$ROUTINATOR_ROOT/bench/multi_rir_demo_ours/run_single_rir_ours_bundle.sh" \
|
||||
"$source_bundle_dir" \
|
||||
"$ROUTI_OUT/$rir"
|
||||
done
|
||||
|
||||
CLIENT_ARGS=(
|
||||
python3 "$RPKI_CLIENT_ROOT/tools/run_bundle_matrix.py"
|
||||
--bundle-dir "$NORMALIZED_BUNDLE_ROOT"
|
||||
--build-dir "$RPKI_CLIENT_BUILD_DIR"
|
||||
--work-dir "$CLIENT_OUT"
|
||||
)
|
||||
for raw_rir in "${RIR_LIST[@]}"; do
|
||||
rir="$(printf '%s' "$raw_rir" | tr '[:upper:]' '[:lower:]' | xargs)"
|
||||
[[ -n "$rir" ]] || continue
|
||||
CLIENT_ARGS+=(--rir "$rir")
|
||||
done
|
||||
"${CLIENT_ARGS[@]}"
|
||||
|
||||
SUMMARY_JSON="$OUT_ROOT/summary.json"
|
||||
SUMMARY_MD="$OUT_ROOT/summary.md"
|
||||
|
||||
python3 - "$ROUTI_OUT" "$CLIENT_OUT/matrix-summary.json" "$SUMMARY_JSON" <<'PY'
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
routi_root = Path(sys.argv[1])
|
||||
client_summary = json.loads(Path(sys.argv[2]).read_text())
|
||||
summary_path = Path(sys.argv[3])
|
||||
summary = {"routinator": {}, "rpki_client": client_summary}
|
||||
for verification in sorted(routi_root.glob("*/verification.json")):
|
||||
rir = verification.parent.name
|
||||
summary["routinator"][rir] = json.loads(verification.read_text())
|
||||
summary_path.write_text(json.dumps(summary, indent=2))
|
||||
PY
|
||||
|
||||
python3 - "$SUMMARY_JSON" "$SUMMARY_MD" <<'PY'
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
summary = json.loads(Path(sys.argv[1]).read_text())
|
||||
out = Path(sys.argv[2])
|
||||
lines = [
|
||||
"# Peer Bundle Matrix Summary",
|
||||
"",
|
||||
"## Routinator",
|
||||
"",
|
||||
"| rir | base_vrp | delta_vrp | base_vap | delta_vap |",
|
||||
"|---|---|---|---|---|",
|
||||
]
|
||||
for rir, data in sorted(summary["routinator"].items()):
|
||||
lines.append(
|
||||
f"| {rir} | {str(data.get('baseMatch')).lower()} | {str(data.get('deltaMatch')).lower()} | "
|
||||
f"{str(data.get('baseVapsMatch')).lower()} | {str(data.get('deltaVapsMatch')).lower()} |"
|
||||
)
|
||||
lines += [
|
||||
"",
|
||||
"## rpki-client",
|
||||
"",
|
||||
"| rir | base_vrp | delta_vrp | base_vap | delta_vap |",
|
||||
"|---|---|---|---|---|",
|
||||
]
|
||||
for rir, phases in sorted(summary["rpki_client"].items()):
|
||||
base = phases.get("base", {})
|
||||
delta = phases.get("delta", {})
|
||||
lines.append(
|
||||
f"| {rir} | {str(base.get('match')).lower()} | {str(delta.get('match')).lower()} | "
|
||||
f"{str(base.get('vaps_match')).lower()} | {str(delta.get('vaps_match')).lower()} |"
|
||||
)
|
||||
out.write_text("\n".join(lines) + "\n")
|
||||
PY
|
||||
|
||||
echo "$OUT_ROOT"
|
||||
Reference in New Issue
Block a user