| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- #!/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 "$@"
|