#!/bin/bash # test-deploy-workload.sh — Deploy a test workload and verify it reaches Running # Usage: ./test/integration/test-deploy-workload.sh # Requires: kubectl on host, QEMU set -euo pipefail ISO="${1:?Usage: $0 }" TIMEOUT_K8S=${TIMEOUT_K8S:-300} TIMEOUT_POD=${TIMEOUT_POD:-120} API_PORT=6443 SERIAL_LOG=$(mktemp /tmp/kubesolo-workload-XXXXXX.log) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" . "$SCRIPT_DIR/../lib/qemu-helpers.sh" 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 QEMU_PID="" EXTRACT_DIR="" cleanup() { [ -n "$QEMU_PID" ] && kill "$QEMU_PID" 2>/dev/null || true rm -f "$DATA_DISK" "$SERIAL_LOG" [ -n "$EXTRACT_DIR" ] && rm -rf "$EXTRACT_DIR" } trap cleanup EXIT KUBECTL="kubectl --server=https://localhost:${API_PORT} --insecure-skip-tls-verify" echo "==> Workload deployment test: $ISO" # Extract kernel from ISO EXTRACT_DIR="$(mktemp -d /tmp/kubesolo-extract-XXXXXX)" extract_kernel_from_iso "$ISO" "$EXTRACT_DIR" KVM_FLAG=$(detect_kvm) # Launch QEMU # shellcheck disable=SC2086 qemu-system-x86_64 \ -m 2048 -smp 2 \ -nographic \ $KVM_FLAG \ -kernel "$VMLINUZ" \ -initrd "$INITRAMFS" \ -drive "file=$DATA_DISK,format=raw,if=virtio" \ -net "nic,model=virtio" \ -net "user,hostfwd=tcp::${API_PORT}-:6443" \ -serial "file:$SERIAL_LOG" \ -append "console=ttyS0,115200n8 kubesolo.data=/dev/vda" \ & QEMU_PID=$! # Wait for K8s API echo " Waiting for K8s API..." ELAPSED=0 K8S_READY=0 while [ "$ELAPSED" -lt "$TIMEOUT_K8S" ]; do if $KUBECTL get nodes 2>/dev/null | grep -q "Ready"; then K8S_READY=1 break fi sleep 5 ELAPSED=$((ELAPSED + 5)) printf "\r Elapsed: %ds / %ds" "$ELAPSED" "$TIMEOUT_K8S" done echo "" if [ "$K8S_READY" != "1" ]; then echo "==> FAIL: K8s node did not reach Ready within ${TIMEOUT_K8S}s" exit 1 fi echo "==> K8s node Ready (${ELAPSED}s)" # Deploy test workload echo "==> Deploying test nginx pod..." $KUBECTL run test-nginx --image=nginx:alpine --restart=Never 2>/dev/null || { echo "==> FAIL: Could not create test pod" exit 1 } # Wait for pod to be Running echo " Waiting for pod to reach Running..." ELAPSED=0 POD_RUNNING=0 STATUS="" while [ "$ELAPSED" -lt "$TIMEOUT_POD" ]; do STATUS=$($KUBECTL get pod test-nginx -o jsonpath='{.status.phase}' 2>/dev/null || echo "") if [ "$STATUS" = "Running" ]; then POD_RUNNING=1 break fi sleep 5 ELAPSED=$((ELAPSED + 5)) printf "\r Elapsed: %ds / %ds (status: %s)" "$ELAPSED" "$TIMEOUT_POD" "${STATUS:-pending}" done echo "" # Cleanup test pod $KUBECTL delete pod test-nginx --grace-period=0 --force 2>/dev/null || true if [ "$POD_RUNNING" = "1" ]; then echo "==> PASS: Test pod reached Running state (${ELAPSED}s)" exit 0 else echo "==> FAIL: Test pod did not reach Running within ${TIMEOUT_POD}s (last status: $STATUS)" echo " Pod events:" $KUBECTL describe pod test-nginx 2>/dev/null | tail -20 || true exit 1 fi