iop/scripts/e2e-control-plane-edge-wire.sh
toki 11382a397f feat: control-plane edge wire baseline 및 관련 수정사항 적용
- edge bootstrap runtime 개선
- edge 설정 및 config 업데이트
- hostsetup 테스트 및 템플릿 수정
- Makefile 업데이트
- E2E 테스트 스크립트 추가
- 아키텍처 태스크 아카이브
2026-05-30 21:00:59 +09:00

258 lines
8.3 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
echo "[cp-edge-wire] NOTE: auxiliary smoke only - verifies Control Plane-Edge hello and disconnect via real processes."
if command -v shellcheck >/dev/null 2>&1; then
echo "[cp-edge-wire] running shellcheck..."
shellcheck "$0"
else
echo "[cp-edge-wire] shellcheck not found, skipping"
fi
# -- Timeout configuration ---------------------------------------------------
CP_READY_TIMEOUT="${IOP_CP_READY_TIMEOUT:-20}"
HELLO_TIMEOUT="${IOP_HELLO_TIMEOUT:-30}"
DISCONNECT_TIMEOUT="${IOP_DISCONNECT_TIMEOUT:-20}"
# -- Temp workspace ----------------------------------------------------------
TMP_DIR=$(mktemp -d)
CP_CONFIG="$TMP_DIR/control-plane.yaml"
EDGE_CONFIG="$TMP_DIR/edge.yaml"
CP_BIN="$TMP_DIR/control-plane"
EDGE_BIN="$TMP_DIR/edge"
CP_OUT="$TMP_DIR/cp_out"
EDGE_OUT="$TMP_DIR/edge_out"
EDGE_LOG="$TMP_DIR/edge.log"
CP_PID=""
EDGE_PID=""
dump_logs() {
if [ -f "$CP_OUT" ]; then
echo "=== CONTROL PLANE OUTPUT ==="
cat "$CP_OUT"
fi
if [ -f "$EDGE_OUT" ]; then
echo "=== EDGE PROCESS OUTPUT ==="
cat "$EDGE_OUT"
fi
if [ -f "$EDGE_LOG" ]; then
echo "=== EDGE LOG ==="
cat "$EDGE_LOG"
fi
}
cleanup() {
local rc=$?
if [ -n "$EDGE_PID" ] && kill -0 "$EDGE_PID" 2>/dev/null; then
kill "$EDGE_PID" 2>/dev/null || true
fi
if [ -n "$CP_PID" ] && kill -0 "$CP_PID" 2>/dev/null; then
kill "$CP_PID" 2>/dev/null || true
fi
# Give processes a moment to flush
sleep 0.3 2>/dev/null || true
if [ -n "$EDGE_PID" ]; then wait "$EDGE_PID" 2>/dev/null || true; fi
if [ -n "$CP_PID" ]; then wait "$CP_PID" 2>/dev/null || true; fi
if [ "$rc" -ne 0 ]; then
echo "[cp-edge-wire] FAIL - dumping logs"
dump_logs
fi
rm -rf "$TMP_DIR" 2>/dev/null || true
}
trap cleanup EXIT
# -- Random free port selection ----------------------------------------------
# Pick ports in ranges that do not overlap with the tracked local env ports:
# 13000-13099 (dev preview), 18080, 19080, 19081, 19090, 19092, 19190.
# Use ephemeral-style ranges that are unlikely to conflict.
USED_PORTS=""
pick_free_port() {
local base="$1"
local port
for _ in $(seq 1 50); do
port=$((base + RANDOM % 1000))
if [[ " $USED_PORTS " == *" $port "* ]]; then
continue
fi
if ! (echo "" > /dev/tcp/127.0.0.1/"$port") 2>/dev/null; then
USED_PORTS="${USED_PORTS} ${port}"
echo "$port"
return 0
fi
done
# Fallback: ask the OS
python3 -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()" 2>/dev/null \
|| echo "$((base + RANDOM % 1000))"
}
CP_HTTP_PORT=$(pick_free_port 29080)
CP_CLIENT_WS_PORT=$(pick_free_port 30180)
CP_EDGE_WIRE_PORT=$(pick_free_port 31181)
EDGE_NODE_PORT=$(pick_free_port 32090)
EDGE_BOOTSTRAP_PORT=$(pick_free_port 33082)
EDGE_METRICS_PORT=$(pick_free_port 34092)
echo "[cp-edge-wire] ports: cp_http=$CP_HTTP_PORT cp_ws=$CP_CLIENT_WS_PORT cp_edge_wire=$CP_EDGE_WIRE_PORT edge_node=$EDGE_NODE_PORT edge_bootstrap=$EDGE_BOOTSTRAP_PORT edge_metrics=$EDGE_METRICS_PORT"
# -- Build temp binaries ------------------------------------------------------
echo "[cp-edge-wire] building temp binaries..."
go build -o "$CP_BIN" "$REPO_ROOT/apps/control-plane/cmd/control-plane"
go build -o "$EDGE_BIN" "$REPO_ROOT/apps/edge/cmd/edge"
# -- Write temp configs -------------------------------------------------------
cat > "$CP_CONFIG" <<EOF
server:
listen: "127.0.0.1:${CP_HTTP_PORT}"
wire_listen: "127.0.0.1:${CP_CLIENT_WS_PORT}"
edge_wire_listen: "127.0.0.1:${CP_EDGE_WIRE_PORT}"
logging:
level: "info"
pretty: false
EOF
cat > "$EDGE_CONFIG" <<EOF
edge:
id: "smoke-edge-wire"
name: "Smoke Edge Wire"
server:
listen: "127.0.0.1:${EDGE_NODE_PORT}"
bootstrap:
listen: "127.0.0.1:${EDGE_BOOTSTRAP_PORT}"
artifact_dir: "${TMP_DIR}/artifacts"
metrics:
port: ${EDGE_METRICS_PORT}
logging:
level: "info"
pretty: false
path: "${EDGE_LOG}"
control_plane:
enabled: true
wire_addr: "127.0.0.1:${CP_EDGE_WIRE_PORT}"
reconnect_interval_sec: 2
EOF
# -- Start Control Plane ------------------------------------------------------
echo "[cp-edge-wire] starting Control Plane..."
"$CP_BIN" serve --config "$CP_CONFIG" \
> "$CP_OUT" 2>&1 &
CP_PID=$!
# Wait for CP edge wire TCP port to be ready
echo "[cp-edge-wire] waiting for Control Plane edge wire port ${CP_EDGE_WIRE_PORT} (timeout: ${CP_READY_TIMEOUT}s)..."
deadline=$((SECONDS + CP_READY_TIMEOUT))
while ! (echo "" > /dev/tcp/127.0.0.1/"${CP_EDGE_WIRE_PORT}") 2>/dev/null; do
if ! kill -0 "$CP_PID" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: Control Plane exited before port was ready"
exit 1
fi
if (( SECONDS >= deadline )); then
echo "[cp-edge-wire] FAIL: Control Plane edge wire port ${CP_EDGE_WIRE_PORT} not ready after ${CP_READY_TIMEOUT}s"
exit 1
fi
sleep 0.5
done
echo "[cp-edge-wire] Control Plane edge wire port ready"
# -- Start Edge ---------------------------------------------------------------
echo "[cp-edge-wire] starting Edge..."
"$EDGE_BIN" serve --config "$EDGE_CONFIG" \
> "$EDGE_OUT" 2>&1 &
EDGE_PID=$!
# -- Wait for hello accepted on CP side ---------------------------------------
echo "[cp-edge-wire] waiting for hello accepted (timeout: ${HELLO_TIMEOUT}s)..."
deadline=$((SECONDS + HELLO_TIMEOUT))
while true; do
if grep -q "edge hello accepted" "$CP_OUT" 2>/dev/null; then
echo "[cp-edge-wire] CP: hello accepted"
break
fi
if ! kill -0 "$CP_PID" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: Control Plane exited while waiting for hello accepted"
exit 1
fi
if ! kill -0 "$EDGE_PID" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: Edge exited while waiting for hello accepted"
exit 1
fi
if (( SECONDS >= deadline )); then
echo "[cp-edge-wire] FAIL: hello accepted not seen after ${HELLO_TIMEOUT}s"
exit 1
fi
sleep 0.5
done
# -- Wait for connected marker on Edge side -----------------------------------
deadline=$((SECONDS + HELLO_TIMEOUT))
while true; do
if grep -q "connected to control plane" "$EDGE_LOG" 2>/dev/null; then
echo "[cp-edge-wire] Edge: connected to control plane"
break
fi
if ! kill -0 "$EDGE_PID" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: Edge exited while waiting for connected marker"
exit 1
fi
if (( SECONDS >= deadline )); then
echo "[cp-edge-wire] FAIL: 'connected to control plane' not seen on Edge after ${HELLO_TIMEOUT}s"
exit 1
fi
sleep 0.5
done
# -- Stop Edge and wait for disconnect on CP side -----------------------------
echo "[cp-edge-wire] stopping Edge process to trigger disconnect..."
kill "$EDGE_PID" 2>/dev/null || true
wait "$EDGE_PID" 2>/dev/null || true
EDGE_PID=""
echo "[cp-edge-wire] waiting for disconnect marker on CP (timeout: ${DISCONNECT_TIMEOUT}s)..."
deadline=$((SECONDS + DISCONNECT_TIMEOUT))
while true; do
if grep -q "edge disconnected" "$CP_OUT" 2>/dev/null; then
echo "[cp-edge-wire] CP: edge disconnected"
break
fi
if ! kill -0 "$CP_PID" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: Control Plane exited while waiting for disconnect marker"
exit 1
fi
if (( SECONDS >= deadline )); then
echo "[cp-edge-wire] FAIL: 'edge disconnected' not seen on CP after ${DISCONNECT_TIMEOUT}s"
exit 1
fi
sleep 0.5
done
# -- Final checks -------------------------------------------------------------
dump_logs
echo "==========================="
FAIL=0
if ! grep -q "edge hello accepted" "$CP_OUT" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: 'edge hello accepted' not found in CP log"
FAIL=1
fi
if ! grep -q "connected to control plane" "$EDGE_LOG" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: 'connected to control plane' not found in Edge log"
FAIL=1
fi
if ! grep -q "edge disconnected" "$CP_OUT" 2>/dev/null; then
echo "[cp-edge-wire] FAIL: 'edge disconnected' not found in CP log"
FAIL=1
fi
if [ "$FAIL" -eq 1 ]; then
echo "[cp-edge-wire] Control Plane-Edge wire smoke FAILED."
exit 1
fi
echo "[cp-edge-wire] Control Plane-Edge wire smoke PASSED."
exit 0