#!/bin/bash # test-k8s-ready.sh — Verify K8s node reaches Ready state # Usage: ./test/integration/test-k8s-ready.sh # Requires: kubectl on host, QEMU with port forwarding set -euo pipefail ISO="${1:?Usage: $0 }" TIMEOUT_BOOT=120 TIMEOUT_K8S=300 API_PORT=6443 DATA_DISK=$(mktemp /tmp/kubesolo-data-XXXXXX.img) dd if=/dev/zero of="$DATA_DISK" bs=1M count=1024 2>/dev/null mkfs.ext4 -q -L KSOLODATA "$DATA_DISK" 2>/dev/null cleanup() { kill "$QEMU_PID" 2>/dev/null || true rm -f "$DATA_DISK" } trap cleanup EXIT echo "==> K8s readiness test: $ISO" # Launch QEMU with API port forwarded qemu-system-x86_64 \ -m 2048 -smp 2 \ -nographic \ -cdrom "$ISO" \ -boot d \ -drive "file=$DATA_DISK,format=raw,if=virtio" \ -net nic,model=virtio \ -net user,hostfwd=tcp::${API_PORT}-:6443 \ -append "console=ttyS0,115200n8 kubesolo.data=/dev/vda" \ & QEMU_PID=$! # Wait for API server echo " Waiting for K8s API on localhost:${API_PORT}..." ELAPSED=0 while [ "$ELAPSED" -lt "$TIMEOUT_K8S" ]; do if kubectl --kubeconfig=/dev/null \ --server="https://localhost:${API_PORT}" \ --insecure-skip-tls-verify \ get nodes 2>/dev/null | grep -q "Ready"; then echo "" echo "==> PASS: K8s node is Ready (${ELAPSED}s)" # Bonus: try deploying a pod echo " Deploying test pod..." kubectl --server="https://localhost:${API_PORT}" --insecure-skip-tls-verify \ run test-nginx --image=nginx:alpine --restart=Never 2>/dev/null || true sleep 10 if kubectl --server="https://localhost:${API_PORT}" --insecure-skip-tls-verify \ get pod test-nginx 2>/dev/null | grep -q "Running"; then echo "==> PASS: Test pod is Running" else echo "==> WARN: Test pod not Running (may need more time or image pull)" fi exit 0 fi sleep 5 ELAPSED=$((ELAPSED + 5)) printf "\r Elapsed: %ds / %ds" "$ELAPSED" "$TIMEOUT_K8S" done echo "" echo "==> FAIL: K8s node did not reach Ready within ${TIMEOUT_K8S}s" exit 1