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.
		
		
		
		
		
			
		
			
				
					
					
						
							212 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							212 lines
						
					
					
						
							6.3 KiB
						
					
					
				
								#!/bin/bash
							 | 
						|
								
							 | 
						|
								# Complete Test Environment Setup Script
							 | 
						|
								# This script sets up all required services and configurations for S3 IAM integration tests
							 | 
						|
								
							 | 
						|
								set -e
							 | 
						|
								
							 | 
						|
								# Colors
							 | 
						|
								RED='\033[0;31m'
							 | 
						|
								GREEN='\033[0;32m'
							 | 
						|
								YELLOW='\033[1;33m'
							 | 
						|
								BLUE='\033[0;34m'
							 | 
						|
								NC='\033[0m'
							 | 
						|
								
							 | 
						|
								SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
							 | 
						|
								
							 | 
						|
								echo -e "${BLUE}🚀 Setting up complete test environment for SeaweedFS S3 IAM...${NC}"
							 | 
						|
								echo -e "${BLUE}==========================================================${NC}"
							 | 
						|
								
							 | 
						|
								# Check prerequisites
							 | 
						|
								check_prerequisites() {
							 | 
						|
								    echo -e "${YELLOW}🔍 Checking prerequisites...${NC}"
							 | 
						|
								    
							 | 
						|
								    local missing_tools=()
							 | 
						|
								    
							 | 
						|
								    for tool in docker jq curl; do
							 | 
						|
								        if ! command -v "$tool" >/dev/null 2>&1; then
							 | 
						|
								            missing_tools+=("$tool")
							 | 
						|
								        fi
							 | 
						|
								    done
							 | 
						|
								    
							 | 
						|
								    if [ ${#missing_tools[@]} -gt 0 ]; then
							 | 
						|
								        echo -e "${RED}❌ Missing required tools: ${missing_tools[*]}${NC}"
							 | 
						|
								        echo -e "${YELLOW}Please install the missing tools and try again${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ All prerequisites met${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Set up Keycloak for OIDC testing
							 | 
						|
								setup_keycloak() {
							 | 
						|
								    echo -e "\n${BLUE}1. Setting up Keycloak for OIDC testing...${NC}"
							 | 
						|
								    
							 | 
						|
								    if ! "${SCRIPT_DIR}/setup_keycloak.sh"; then
							 | 
						|
								        echo -e "${RED}❌ Failed to set up Keycloak${NC}"
							 | 
						|
								        return 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Keycloak setup completed${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Set up SeaweedFS test cluster
							 | 
						|
								setup_seaweedfs_cluster() {
							 | 
						|
								    echo -e "\n${BLUE}2. Setting up SeaweedFS test cluster...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Build SeaweedFS binary if needed
							 | 
						|
								    echo -e "${YELLOW}🔧 Building SeaweedFS binary...${NC}"
							 | 
						|
								    cd "${SCRIPT_DIR}/../../../"  # Go to seaweedfs root
							 | 
						|
								    if ! make > /dev/null 2>&1; then
							 | 
						|
								        echo -e "${RED}❌ Failed to build SeaweedFS binary${NC}"
							 | 
						|
								        return 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    cd "${SCRIPT_DIR}"  # Return to test directory
							 | 
						|
								    
							 | 
						|
								    # Clean up any existing test data
							 | 
						|
								    echo -e "${YELLOW}🧹 Cleaning up existing test data...${NC}"
							 | 
						|
								    rm -rf test-volume-data/* 2>/dev/null || true
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ SeaweedFS cluster setup completed${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Set up test data and configurations
							 | 
						|
								setup_test_configurations() {
							 | 
						|
								    echo -e "\n${BLUE}3. Setting up test configurations...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Ensure IAM configuration is properly set up
							 | 
						|
								    if [ ! -f "${SCRIPT_DIR}/iam_config.json" ]; then
							 | 
						|
								        echo -e "${YELLOW}⚠️  IAM configuration not found, using default config${NC}"
							 | 
						|
								        cp "${SCRIPT_DIR}/iam_config.local.json" "${SCRIPT_DIR}/iam_config.json" 2>/dev/null || {
							 | 
						|
								            echo -e "${RED}❌ No IAM configuration files found${NC}"
							 | 
						|
								            return 1
							 | 
						|
								        }
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    # Validate configuration
							 | 
						|
								    if ! jq . "${SCRIPT_DIR}/iam_config.json" >/dev/null; then
							 | 
						|
								        echo -e "${RED}❌ Invalid IAM configuration JSON${NC}"
							 | 
						|
								        return 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Test configurations set up${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Verify services are ready
							 | 
						|
								verify_services() {
							 | 
						|
								    echo -e "\n${BLUE}4. Verifying services are ready...${NC}"
							 | 
						|
								    
							 | 
						|
								    # Check if Keycloak is responding
							 | 
						|
								    echo -e "${YELLOW}🔍 Checking Keycloak availability...${NC}"
							 | 
						|
								    local keycloak_ready=false
							 | 
						|
								    for i in $(seq 1 30); do
							 | 
						|
								        if curl -sf "http://localhost:8080/health/ready" >/dev/null 2>&1; then
							 | 
						|
								            keycloak_ready=true
							 | 
						|
								            break
							 | 
						|
								        fi
							 | 
						|
								        if curl -sf "http://localhost:8080/realms/master" >/dev/null 2>&1; then
							 | 
						|
								            keycloak_ready=true
							 | 
						|
								            break
							 | 
						|
								        fi
							 | 
						|
								        sleep 2
							 | 
						|
								    done
							 | 
						|
								    
							 | 
						|
								    if [ "$keycloak_ready" = true ]; then
							 | 
						|
								        echo -e "${GREEN}✅ Keycloak is ready${NC}"
							 | 
						|
								    else
							 | 
						|
								        echo -e "${YELLOW}⚠️  Keycloak may not be fully ready yet${NC}"
							 | 
						|
								        echo -e "${YELLOW}This is okay - tests will wait for Keycloak when needed${NC}"
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Service verification completed${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Set up environment variables
							 | 
						|
								setup_environment() {
							 | 
						|
								    echo -e "\n${BLUE}5. Setting up environment variables...${NC}"
							 | 
						|
								    
							 | 
						|
								    export ENABLE_DISTRIBUTED_TESTS=true
							 | 
						|
								    export ENABLE_PERFORMANCE_TESTS=true
							 | 
						|
								    export ENABLE_STRESS_TESTS=true
							 | 
						|
								    export KEYCLOAK_URL="http://localhost:8080"
							 | 
						|
								    export S3_ENDPOINT="http://localhost:8333"
							 | 
						|
								    export TEST_TIMEOUT=60m
							 | 
						|
								    export CGO_ENABLED=0
							 | 
						|
								    
							 | 
						|
								    # Write environment to a file for other scripts to source
							 | 
						|
								    cat > "${SCRIPT_DIR}/.test_env" << EOF
							 | 
						|
								export ENABLE_DISTRIBUTED_TESTS=true
							 | 
						|
								export ENABLE_PERFORMANCE_TESTS=true
							 | 
						|
								export ENABLE_STRESS_TESTS=true
							 | 
						|
								export KEYCLOAK_URL="http://localhost:8080"
							 | 
						|
								export S3_ENDPOINT="http://localhost:8333"
							 | 
						|
								export TEST_TIMEOUT=60m
							 | 
						|
								export CGO_ENABLED=0
							 | 
						|
								EOF
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}✅ Environment variables set${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Display setup summary
							 | 
						|
								display_summary() {
							 | 
						|
								    echo -e "\n${BLUE}📊 Setup Summary${NC}"
							 | 
						|
								    echo -e "${BLUE}=================${NC}"
							 | 
						|
								    echo -e "Keycloak URL: ${KEYCLOAK_URL:-http://localhost:8080}"
							 | 
						|
								    echo -e "S3 Endpoint: ${S3_ENDPOINT:-http://localhost:8333}"
							 | 
						|
								    echo -e "Test Timeout: ${TEST_TIMEOUT:-60m}"
							 | 
						|
								    echo -e "IAM Config: ${SCRIPT_DIR}/iam_config.json"
							 | 
						|
								    echo -e ""
							 | 
						|
								    echo -e "${GREEN}✅ Complete test environment setup finished!${NC}"
							 | 
						|
								    echo -e "${YELLOW}💡 You can now run tests with: make run-all-tests${NC}"
							 | 
						|
								    echo -e "${YELLOW}💡 Or run specific tests with: go test -v -timeout=60m -run TestName${NC}"
							 | 
						|
								    echo -e "${YELLOW}💡 To stop Keycloak: docker stop keycloak-iam-test${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Main execution
							 | 
						|
								main() {
							 | 
						|
								    check_prerequisites
							 | 
						|
								    
							 | 
						|
								    # Track what was set up for cleanup on failure
							 | 
						|
								    local setup_steps=()
							 | 
						|
								    
							 | 
						|
								    if setup_keycloak; then
							 | 
						|
								        setup_steps+=("keycloak")
							 | 
						|
								    else
							 | 
						|
								        echo -e "${RED}❌ Failed to set up Keycloak${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    if setup_seaweedfs_cluster; then
							 | 
						|
								        setup_steps+=("seaweedfs")
							 | 
						|
								    else
							 | 
						|
								        echo -e "${RED}❌ Failed to set up SeaweedFS cluster${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    if setup_test_configurations; then
							 | 
						|
								        setup_steps+=("config")
							 | 
						|
								    else
							 | 
						|
								        echo -e "${RED}❌ Failed to set up test configurations${NC}"
							 | 
						|
								        exit 1
							 | 
						|
								    fi
							 | 
						|
								    
							 | 
						|
								    setup_environment
							 | 
						|
								    verify_services
							 | 
						|
								    display_summary
							 | 
						|
								    
							 | 
						|
								    echo -e "${GREEN}🎉 All setup completed successfully!${NC}"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Cleanup on script interruption
							 | 
						|
								cleanup() {
							 | 
						|
								    echo -e "\n${YELLOW}🧹 Cleaning up on script interruption...${NC}"
							 | 
						|
								    # Note: We don't automatically stop Keycloak as it might be shared
							 | 
						|
								    echo -e "${YELLOW}💡 If you want to stop Keycloak: docker stop keycloak-iam-test${NC}"
							 | 
						|
								    exit 1
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								trap cleanup INT TERM
							 | 
						|
								
							 | 
						|
								# Execute main function
							 | 
						|
								main "$@"
							 |