You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							335 lines
						
					
					
						
							9.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							335 lines
						
					
					
						
							9.6 KiB
						
					
					
				
								#!/bin/bash
							 | 
						|
								
							 | 
						|
								set -euo pipefail
							 | 
						|
								
							 | 
						|
								# Colors for output
							 | 
						|
								RED='\033[0;31m'
							 | 
						|
								GREEN='\033[0;32m'
							 | 
						|
								BLUE='\033[0;34m'
							 | 
						|
								YELLOW='\033[1;33m'
							 | 
						|
								NC='\033[0m' # No Color
							 | 
						|
								
							 | 
						|
								# Configuration
							 | 
						|
								COMPOSE_FILE="docker-compose.mount-rdma.yml"
							 | 
						|
								PROJECT_NAME="seaweedfs-rdma-mount"
							 | 
						|
								
							 | 
						|
								# Function to show usage
							 | 
						|
								show_usage() {
							 | 
						|
								    echo -e "${BLUE}🚀 SeaweedFS RDMA Mount Test Runner${NC}"
							 | 
						|
								    echo "===================================="
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Usage: $0 [COMMAND] [OPTIONS]"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Commands:"
							 | 
						|
								    echo "  start           Start the RDMA mount environment"
							 | 
						|
								    echo "  stop            Stop and cleanup the environment"
							 | 
						|
								    echo "  restart         Restart the environment"
							 | 
						|
								    echo "  status          Show status of all services"
							 | 
						|
								    echo "  logs [service]  Show logs for all services or specific service"
							 | 
						|
								    echo "  test            Run integration tests"
							 | 
						|
								    echo "  perf            Run performance tests"
							 | 
						|
								    echo "  shell           Open shell in mount container"
							 | 
						|
								    echo "  cleanup         Full cleanup including volumes"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Services:"
							 | 
						|
								    echo "  seaweedfs-master    SeaweedFS master server"
							 | 
						|
								    echo "  seaweedfs-volume    SeaweedFS volume server"
							 | 
						|
								    echo "  seaweedfs-filer     SeaweedFS filer server"
							 | 
						|
								    echo "  rdma-engine         RDMA engine (Rust)"
							 | 
						|
								    echo "  rdma-sidecar        RDMA sidecar (Go)"
							 | 
						|
								    echo "  seaweedfs-mount     SeaweedFS mount with RDMA"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Examples:"
							 | 
						|
								    echo "  $0 start                    # Start all services"
							 | 
						|
								    echo "  $0 logs seaweedfs-mount     # Show mount logs"
							 | 
						|
								    echo "  $0 test                     # Run integration tests"
							 | 
						|
								    echo "  $0 perf                     # Run performance tests"
							 | 
						|
								    echo "  $0 shell                    # Open shell in mount container"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to check if Docker Compose is available
							 | 
						|
								check_docker_compose() {
							 | 
						|
								    if ! command -v docker-compose >/dev/null 2>&1 && ! docker compose version >/dev/null 2>&1; then
							 | 
						|
								        echo -e "${RED}❌ Docker Compose is not available${NC}"
							 | 
						|
								        echo "Please install Docker Compose to continue"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Use docker compose if available, otherwise docker-compose
							 | 
						|
								    if docker compose version >/dev/null 2>&1; then
							 | 
						|
								        DOCKER_COMPOSE="docker compose"
							 | 
						|
								    else
							 | 
						|
								        DOCKER_COMPOSE="docker-compose"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to build required images
							 | 
						|
								build_images() {
							 | 
						|
								    echo -e "${BLUE}🔨 Building required Docker images...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Build SeaweedFS binary first
							 | 
						|
								    echo "Building SeaweedFS binary..."
							 | 
						|
								    cd ..
							 | 
						|
								    make
							 | 
						|
								    cd seaweedfs-rdma-sidecar
							 | 
						|
								    
							 | 
						|
								    # Copy binary for Docker builds
							 | 
						|
								    mkdir -p bin
							 | 
						|
								    if [[ -f "../weed" ]]; then
							 | 
						|
								        cp ../weed bin/
							 | 
						|
								    elif [[ -f "../bin/weed" ]]; then
							 | 
						|
								        cp ../bin/weed bin/
							 | 
						|
								    elif [[ -f "../build/weed" ]]; then
							 | 
						|
								        cp ../build/weed bin/
							 | 
						|
								    else
							 | 
						|
								        echo "Error: Cannot find weed binary"
							 | 
						|
								        find .. -name "weed" -type f
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Build RDMA sidecar
							 | 
						|
								    echo "Building RDMA sidecar..."
							 | 
						|
								    go build -o bin/demo-server cmd/sidecar/main.go
							 | 
						|
								    
							 | 
						|
								    # Build Docker images
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" build
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Images built successfully${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to start services
							 | 
						|
								start_services() {
							 | 
						|
								    echo -e "${BLUE}🚀 Starting SeaweedFS RDMA Mount environment...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Build images if needed
							 | 
						|
								    if [[ ! -f "bin/weed" ]] || [[ ! -f "bin/demo-server" ]]; then
							 | 
						|
								        build_images
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Start services
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" up -d
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Services started${NC}"
							 | 
						|
								    echo ""
							 | 
						|
								    echo "Services are starting up. Use '$0 status' to check their status."
							 | 
						|
								    echo "Use '$0 logs' to see the logs."
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to stop services
							 | 
						|
								stop_services() {
							 | 
						|
								    echo -e "${BLUE}🛑 Stopping SeaweedFS RDMA Mount environment...${NC}"
							 | 
						|
								    
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" down
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Services stopped${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to restart services
							 | 
						|
								restart_services() {
							 | 
						|
								    echo -e "${BLUE}🔄 Restarting SeaweedFS RDMA Mount environment...${NC}"
							 | 
						|
								    
							 | 
						|
								    stop_services
							 | 
						|
								    sleep 2
							 | 
						|
								    start_services
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to show status
							 | 
						|
								show_status() {
							 | 
						|
								    echo -e "${BLUE}📊 Service Status${NC}"
							 | 
						|
								    echo "================"
							 | 
						|
								    
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" ps
							 | 
						|
								    
							 | 
						|
								    echo ""
							 | 
						|
								    echo -e "${BLUE}🔍 Health Checks${NC}"
							 | 
						|
								    echo "==============="
							 | 
						|
								    
							 | 
						|
								    # Check individual services
							 | 
						|
								    check_service_health "SeaweedFS Master" "http://localhost:9333/cluster/status"
							 | 
						|
								    check_service_health "SeaweedFS Volume" "http://localhost:8080/status"
							 | 
						|
								    check_service_health "SeaweedFS Filer" "http://localhost:8888/"
							 | 
						|
								    check_service_health "RDMA Sidecar" "http://localhost:8081/health"
							 | 
						|
								    
							 | 
						|
								    # Check mount status
							 | 
						|
								    echo -n "SeaweedFS Mount: "
							 | 
						|
								    if docker exec "${PROJECT_NAME}-seaweedfs-mount-1" mountpoint -q /mnt/seaweedfs 2>/dev/null; then
							 | 
						|
								        echo -e "${GREEN}✅ Mounted${NC}"
							 | 
						|
								    else
							 | 
						|
								        echo -e "${RED}❌ Not mounted${NC}"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to check service health
							 | 
						|
								check_service_health() {
							 | 
						|
								    local service_name=$1
							 | 
						|
								    local health_url=$2
							 | 
						|
								    
							 | 
						|
								    echo -n "$service_name: "
							 | 
						|
								    if curl -s "$health_url" >/dev/null 2>&1; then
							 | 
						|
								        echo -e "${GREEN}✅ Healthy${NC}"
							 | 
						|
								    else
							 | 
						|
								        echo -e "${RED}❌ Unhealthy${NC}"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to show logs
							 | 
						|
								show_logs() {
							 | 
						|
								    local service=$1
							 | 
						|
								    
							 | 
						|
								    if [[ -n "$service" ]]; then
							 | 
						|
								        echo -e "${BLUE}📋 Logs for $service${NC}"
							 | 
						|
								        echo "===================="
							 | 
						|
								        $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" logs -f "$service"
							 | 
						|
								    else
							 | 
						|
								        echo -e "${BLUE}📋 Logs for all services${NC}"
							 | 
						|
								        echo "======================="
							 | 
						|
								        $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" logs -f
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to run integration tests
							 | 
						|
								run_integration_tests() {
							 | 
						|
								    echo -e "${BLUE}🧪 Running integration tests...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Make sure services are running
							 | 
						|
								    if ! $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" ps | grep -q "Up"; then
							 | 
						|
								        echo -e "${RED}❌ Services are not running. Start them first with '$0 start'${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Run integration tests
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" --profile test run --rm integration-test
							 | 
						|
								    
							 | 
						|
								    # Show results
							 | 
						|
								    if [[ -d "./test-results" ]]; then
							 | 
						|
								        echo -e "${BLUE}📊 Test Results${NC}"
							 | 
						|
								        echo "==============="
							 | 
						|
								        
							 | 
						|
								        if [[ -f "./test-results/overall.result" ]]; then
							 | 
						|
								            local result
							 | 
						|
								            result=$(cat "./test-results/overall.result")
							 | 
						|
								            if [[ "$result" == "SUCCESS" ]]; then
							 | 
						|
								                echo -e "${GREEN}🎉 ALL TESTS PASSED!${NC}"
							 | 
						|
								            else
							 | 
						|
								                echo -e "${RED}💥 SOME TESTS FAILED!${NC}"
							 | 
						|
								            fi
							 | 
						|
								        fi
							 | 
						|
								        
							 | 
						|
								        echo ""
							 | 
						|
								        echo "Detailed results available in: ./test-results/"
							 | 
						|
								        ls -la ./test-results/
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to run performance tests
							 | 
						|
								run_performance_tests() {
							 | 
						|
								    echo -e "${BLUE}🏁 Running performance tests...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Make sure services are running
							 | 
						|
								    if ! $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" ps | grep -q "Up"; then
							 | 
						|
								        echo -e "${RED}❌ Services are not running. Start them first with '$0 start'${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Run performance tests
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" --profile performance run --rm performance-test
							 | 
						|
								    
							 | 
						|
								    # Show results
							 | 
						|
								    if [[ -d "./performance-results" ]]; then
							 | 
						|
								        echo -e "${BLUE}📊 Performance Results${NC}"
							 | 
						|
								        echo "======================"
							 | 
						|
								        echo ""
							 | 
						|
								        echo "Results available in: ./performance-results/"
							 | 
						|
								        ls -la ./performance-results/
							 | 
						|
								        
							 | 
						|
								        if [[ -f "./performance-results/performance_report.html" ]]; then
							 | 
						|
								            echo ""
							 | 
						|
								            echo -e "${GREEN}📄 HTML Report: ./performance-results/performance_report.html${NC}"
							 | 
						|
								        fi
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to open shell in mount container
							 | 
						|
								open_shell() {
							 | 
						|
								    echo -e "${BLUE}🐚 Opening shell in mount container...${NC}"
							 | 
						|
								    
							 | 
						|
								    if ! $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" ps seaweedfs-mount | grep -q "Up"; then
							 | 
						|
								        echo -e "${RED}❌ Mount container is not running${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    docker exec -it "${PROJECT_NAME}-seaweedfs-mount-1" /bin/bash
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Function to cleanup everything
							 | 
						|
								cleanup_all() {
							 | 
						|
								    echo -e "${BLUE}🧹 Full cleanup...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Stop services
							 | 
						|
								    $DOCKER_COMPOSE -f "$COMPOSE_FILE" -p "$PROJECT_NAME" down -v --remove-orphans
							 | 
						|
								    
							 | 
						|
								    # Remove images
							 | 
						|
								    echo "Removing Docker images..."
							 | 
						|
								    docker images | grep "$PROJECT_NAME" | awk '{print $3}' | xargs -r docker rmi -f
							 | 
						|
								    
							 | 
						|
								    # Clean up local files
							 | 
						|
								    rm -rf bin/ test-results/ performance-results/
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Full cleanup completed${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Main function
							 | 
						|
								main() {
							 | 
						|
								    local command=${1:-""}
							 | 
						|
								    
							 | 
						|
								    # Check Docker Compose availability
							 | 
						|
								    check_docker_compose
							 | 
						|
								    
							 | 
						|
								    case "$command" in
							 | 
						|
								        "start")
							 | 
						|
								            start_services
							 | 
						|
								            ;;
							 | 
						|
								        "stop")
							 | 
						|
								            stop_services
							 | 
						|
								            ;;
							 | 
						|
								        "restart")
							 | 
						|
								            restart_services
							 | 
						|
								            ;;
							 | 
						|
								        "status")
							 | 
						|
								            show_status
							 | 
						|
								            ;;
							 | 
						|
								        "logs")
							 | 
						|
								            show_logs "${2:-}"
							 | 
						|
								            ;;
							 | 
						|
								        "test")
							 | 
						|
								            run_integration_tests
							 | 
						|
								            ;;
							 | 
						|
								        "perf")
							 | 
						|
								            run_performance_tests
							 | 
						|
								            ;;
							 | 
						|
								        "shell")
							 | 
						|
								            open_shell
							 | 
						|
								            ;;
							 | 
						|
								        "cleanup")
							 | 
						|
								            cleanup_all
							 | 
						|
								            ;;
							 | 
						|
								        "build")
							 | 
						|
								            build_images
							 | 
						|
								            ;;
							 | 
						|
								        "help"|"-h"|"--help")
							 | 
						|
								            show_usage
							 | 
						|
								            ;;
							 | 
						|
								        "")
							 | 
						|
								            show_usage
							 | 
						|
								            ;;
							 | 
						|
								        *)
							 | 
						|
								            echo -e "${RED}❌ Unknown command: $command${NC}"
							 | 
						|
								            echo ""
							 | 
						|
								            show_usage
							 | 
						|
								            exit 1
							 | 
						|
								            ;;
							 | 
						|
								    esac
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Run main function with all arguments
							 | 
						|
								main "$@"
							 |