diff options
Diffstat (limited to 'seaweedfs-rdma-sidecar/tests/run-integration-tests.sh')
| -rwxr-xr-x | seaweedfs-rdma-sidecar/tests/run-integration-tests.sh | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/seaweedfs-rdma-sidecar/tests/run-integration-tests.sh b/seaweedfs-rdma-sidecar/tests/run-integration-tests.sh new file mode 100755 index 000000000..8f23c7e5f --- /dev/null +++ b/seaweedfs-rdma-sidecar/tests/run-integration-tests.sh @@ -0,0 +1,302 @@ +#!/bin/bash + +# SeaweedFS RDMA Integration Test Suite +# Comprehensive testing of the complete integration in Docker environment + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +print_header() { + echo -e "\n${PURPLE}===============================================${NC}" + echo -e "${PURPLE}$1${NC}" + echo -e "${PURPLE}===============================================${NC}\n" +} + +print_step() { + echo -e "${CYAN}🔵 $1${NC}" +} + +print_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +print_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +print_error() { + echo -e "${RED}❌ $1${NC}" +} + +wait_for_service() { + local url=$1 + local service_name=$2 + local max_attempts=30 + local attempt=1 + + print_step "Waiting for $service_name to be ready..." + + while [ $attempt -le $max_attempts ]; do + if curl -s "$url" > /dev/null 2>&1; then + print_success "$service_name is ready" + return 0 + fi + + echo -n "." + sleep 2 + attempt=$((attempt + 1)) + done + + print_error "$service_name failed to become ready after $max_attempts attempts" + return 1 +} + +test_seaweedfs_master() { + print_header "TESTING SEAWEEDFS MASTER" + + wait_for_service "$SEAWEEDFS_MASTER/cluster/status" "SeaweedFS Master" + + print_step "Checking master status..." + response=$(curl -s "$SEAWEEDFS_MASTER/cluster/status") + + if echo "$response" | jq -e '.IsLeader == true' > /dev/null; then + print_success "SeaweedFS Master is leader and ready" + else + print_error "SeaweedFS Master is not ready" + echo "$response" + return 1 + fi +} + +test_seaweedfs_volume() { + print_header "TESTING SEAWEEDFS VOLUME SERVER" + + wait_for_service "$SEAWEEDFS_VOLUME/status" "SeaweedFS Volume Server" + + print_step "Checking volume server status..." + response=$(curl -s "$SEAWEEDFS_VOLUME/status") + + if echo "$response" | jq -e '.Version' > /dev/null; then + print_success "SeaweedFS Volume Server is ready" + echo "Volume Server Version: $(echo "$response" | jq -r '.Version')" + else + print_error "SeaweedFS Volume Server is not ready" + echo "$response" + return 1 + fi +} + +test_rdma_engine() { + print_header "TESTING RDMA ENGINE" + + print_step "Checking RDMA engine socket..." + if [ -S "$RDMA_SOCKET_PATH" ]; then + print_success "RDMA engine socket exists" + else + print_error "RDMA engine socket not found at $RDMA_SOCKET_PATH" + return 1 + fi + + print_step "Testing RDMA engine ping..." + if ./test-rdma ping --socket "$RDMA_SOCKET_PATH" 2>/dev/null; then + print_success "RDMA engine ping successful" + else + print_error "RDMA engine ping failed" + return 1 + fi + + print_step "Testing RDMA engine capabilities..." + if ./test-rdma capabilities --socket "$RDMA_SOCKET_PATH" 2>/dev/null | grep -q "Version:"; then + print_success "RDMA engine capabilities retrieved" + ./test-rdma capabilities --socket "$RDMA_SOCKET_PATH" 2>/dev/null | head -5 + else + print_error "RDMA engine capabilities failed" + return 1 + fi +} + +test_rdma_sidecar() { + print_header "TESTING RDMA SIDECAR" + + wait_for_service "$SIDECAR_URL/health" "RDMA Sidecar" + + print_step "Testing sidecar health..." + response=$(curl -s "$SIDECAR_URL/health") + + if echo "$response" | jq -e '.status == "healthy"' > /dev/null; then + print_success "RDMA Sidecar is healthy" + echo "RDMA Status: $(echo "$response" | jq -r '.rdma.enabled')" + else + print_error "RDMA Sidecar health check failed" + echo "$response" + return 1 + fi + + print_step "Testing sidecar stats..." + stats=$(curl -s "$SIDECAR_URL/stats") + + if echo "$stats" | jq -e '.enabled' > /dev/null; then + print_success "RDMA Sidecar stats retrieved" + echo "RDMA Enabled: $(echo "$stats" | jq -r '.enabled')" + echo "RDMA Connected: $(echo "$stats" | jq -r '.connected')" + + if echo "$stats" | jq -e '.capabilities' > /dev/null; then + version=$(echo "$stats" | jq -r '.capabilities.version') + sessions=$(echo "$stats" | jq -r '.capabilities.max_sessions') + print_success "RDMA Engine Info: Version=$version, Max Sessions=$sessions" + fi + else + print_error "RDMA Sidecar stats failed" + echo "$stats" + return 1 + fi +} + +test_direct_rdma_operations() { + print_header "TESTING DIRECT RDMA OPERATIONS" + + print_step "Testing direct RDMA read operation..." + if ./test-rdma read --socket "$RDMA_SOCKET_PATH" --volume 1 --needle 12345 --size 1024 2>/dev/null | grep -q "RDMA read completed"; then + print_success "Direct RDMA read operation successful" + else + print_warning "Direct RDMA read operation failed (expected in mock mode)" + fi + + print_step "Running RDMA performance benchmark..." + benchmark_result=$(./test-rdma bench --socket "$RDMA_SOCKET_PATH" --iterations 5 --read-size 2048 2>/dev/null | tail -10) + + if echo "$benchmark_result" | grep -q "Operations/sec:"; then + print_success "RDMA benchmark completed" + echo "$benchmark_result" | grep -E "Operations|Latency|Throughput" + else + print_warning "RDMA benchmark had issues (expected in mock mode)" + fi +} + +test_sidecar_needle_operations() { + print_header "TESTING SIDECAR NEEDLE OPERATIONS" + + print_step "Testing needle read via sidecar..." + response=$(curl -s "$SIDECAR_URL/read?volume=1&needle=12345&cookie=305419896&size=1024") + + if echo "$response" | jq -e '.success == true' > /dev/null; then + print_success "Sidecar needle read successful" + + is_rdma=$(echo "$response" | jq -r '.is_rdma') + source=$(echo "$response" | jq -r '.source') + duration=$(echo "$response" | jq -r '.duration') + + if [ "$is_rdma" = "true" ]; then + print_success "RDMA fast path used! Duration: $duration" + else + print_warning "HTTP fallback used. Duration: $duration" + fi + + echo "Response details:" + echo "$response" | jq '{success, is_rdma, source, duration, data_size}' + else + print_error "Sidecar needle read failed" + echo "$response" + return 1 + fi +} + +test_sidecar_benchmark() { + print_header "TESTING SIDECAR BENCHMARK" + + print_step "Running sidecar performance benchmark..." + response=$(curl -s "$SIDECAR_URL/benchmark?iterations=5&size=2048") + + if echo "$response" | jq -e '.benchmark_results' > /dev/null; then + print_success "Sidecar benchmark completed" + + rdma_ops=$(echo "$response" | jq -r '.benchmark_results.rdma_ops') + http_ops=$(echo "$response" | jq -r '.benchmark_results.http_ops') + avg_latency=$(echo "$response" | jq -r '.benchmark_results.avg_latency') + ops_per_sec=$(echo "$response" | jq -r '.benchmark_results.ops_per_sec') + + echo "Benchmark Results:" + echo " RDMA Operations: $rdma_ops" + echo " HTTP Operations: $http_ops" + echo " Average Latency: $avg_latency" + echo " Operations/sec: $ops_per_sec" + else + print_error "Sidecar benchmark failed" + echo "$response" + return 1 + fi +} + +test_error_handling() { + print_header "TESTING ERROR HANDLING AND FALLBACK" + + print_step "Testing invalid needle read..." + response=$(curl -s "$SIDECAR_URL/read?volume=999&needle=999999&size=1024") + + # Should succeed with mock data or fail gracefully + if echo "$response" | jq -e '.success' > /dev/null; then + result=$(echo "$response" | jq -r '.success') + if [ "$result" = "true" ]; then + print_success "Error handling working - mock data returned" + else + print_success "Error handling working - graceful failure" + fi + else + print_success "Error handling working - proper error response" + fi +} + +main() { + print_header "🚀 SEAWEEDFS RDMA INTEGRATION TEST SUITE" + + echo -e "${GREEN}Starting comprehensive integration tests...${NC}" + echo -e "${BLUE}Environment:${NC}" + echo -e " RDMA Socket: $RDMA_SOCKET_PATH" + echo -e " Sidecar URL: $SIDECAR_URL" + echo -e " SeaweedFS Master: $SEAWEEDFS_MASTER" + echo -e " SeaweedFS Volume: $SEAWEEDFS_VOLUME" + + # Run tests in sequence + test_seaweedfs_master + test_seaweedfs_volume + test_rdma_engine + test_rdma_sidecar + test_direct_rdma_operations + test_sidecar_needle_operations + test_sidecar_benchmark + test_error_handling + + print_header "🎉 ALL INTEGRATION TESTS COMPLETED!" + + echo -e "${GREEN}✅ Test Summary:${NC}" + echo -e " ✅ SeaweedFS Master: Working" + echo -e " ✅ SeaweedFS Volume Server: Working" + echo -e " ✅ Rust RDMA Engine: Working (Mock Mode)" + echo -e " ✅ Go RDMA Sidecar: Working" + echo -e " ✅ IPC Communication: Working" + echo -e " ✅ Needle Operations: Working" + echo -e " ✅ Performance Benchmarking: Working" + echo -e " ✅ Error Handling: Working" + + print_success "SeaweedFS RDMA integration is fully functional!" + + return 0 +} + +# Check required environment variables +if [ -z "$RDMA_SOCKET_PATH" ] || [ -z "$SIDECAR_URL" ] || [ -z "$SEAWEEDFS_MASTER" ] || [ -z "$SEAWEEDFS_VOLUME" ]; then + print_error "Required environment variables not set" + echo "Required: RDMA_SOCKET_PATH, SIDECAR_URL, SEAWEEDFS_MASTER, SEAWEEDFS_VOLUME" + exit 1 +fi + +# Run main test suite +main "$@" |
