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.
		
		
		
		
		
			
		
			
				
					
					
						
							814 lines
						
					
					
						
							28 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							814 lines
						
					
					
						
							28 KiB
						
					
					
				| name: "Kafka Gateway Tests" | |
|  | |
| on: | |
|   push: | |
|     branches: [ master ] | |
|   pull_request: | |
|     branches: [ master ] | |
|  | |
| concurrency: | |
|   group: ${{ github.head_ref }}/kafka-tests | |
|   cancel-in-progress: true | |
|  | |
| # Force different runners for better isolation | |
| env: | |
|   FORCE_RUNNER_SEPARATION: true | |
|  | |
| permissions: | |
|   contents: read | |
|  | |
| jobs: | |
|   kafka-unit-tests: | |
|     name: Kafka Unit Tests | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 5 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [unit-tests-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 1.0 --memory 1g --hostname kafka-unit-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 1 | |
|       CGO_ENABLED: 0 | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|       id: go | |
|  | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Setup Container Environment | |
|       run: | | |
|         apk add --no-cache git | |
|         ulimit -n 1024 || echo "Warning: Could not set file descriptor limit" | |
|                  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         go mod download         | |
|  | |
|     - name: Run Kafka Gateway Unit Tests | |
|       run: | | |
|         cd test/kafka | |
|         # Set process limits for container isolation | |
|         ulimit -n 512 || echo "Warning: Could not set file descriptor limit" | |
|         ulimit -u 100 || echo "Warning: Could not set process limit" | |
|         go test -v -timeout 10s ./unit/...         | |
|  | |
|   kafka-integration-tests: | |
|     name: Kafka Integration Tests (Critical) | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 5 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [integration-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 2.0 --memory 2g --ulimit nofile=1024:1024 --hostname kafka-integration-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 2 | |
|       CGO_ENABLED: 0 | |
|       KAFKA_TEST_ISOLATION: "true" | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|       id: go | |
|  | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Setup Integration Container Environment | |
|       run: | | |
|         apk add --no-cache git procps | |
|         ulimit -n 2048 || echo "Warning: Could not set file descriptor limit" | |
|                  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         go mod download         | |
|  | |
|     - name: Run Integration Tests | |
|       run: | | |
|         cd test/kafka | |
|         # Higher limits for integration tests | |
|         ulimit -n 1024 || echo "Warning: Could not set file descriptor limit" | |
|         ulimit -u 200 || echo "Warning: Could not set process limit" | |
|         go test -v -timeout 90s ./integration/...         | |
|       env: | |
|         GOMAXPROCS: 2 | |
|  | |
|   kafka-e2e-tests: | |
|     name: Kafka End-to-End Tests (with SMQ) | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 20 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [e2e-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 2.0 --memory 2g --hostname kafka-e2e-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 2 | |
|       CGO_ENABLED: 0 | |
|       KAFKA_E2E_ISOLATION: "true" | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|         cache: true | |
|         cache-dependency-path: | | |
|                     **/go.sum | |
|       id: go | |
|  | |
|     - name: Setup E2E Container Environment | |
|       run: | | |
|         apk add --no-cache git procps curl netcat-openbsd | |
|         ulimit -n 2048 || echo "Warning: Could not set file descriptor limit" | |
|                  | |
|     - name: Warm Go module cache | |
|       run: | | |
|         # Warm cache for root module | |
|         go mod download || true | |
|         # Warm cache for kafka test module | |
|         cd test/kafka | |
|         go mod download || true         | |
|  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         # Use go mod download with timeout to prevent hanging | |
|         timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"         | |
|  | |
|     - name: Build and start SeaweedFS MQ | |
|       run: | | |
|         set -e | |
|         cd $GITHUB_WORKSPACE | |
|         # Build weed binary | |
|         go build -o /usr/local/bin/weed ./weed | |
|         # Start SeaweedFS components with MQ brokers | |
|         export WEED_DATA_DIR=/tmp/seaweedfs-e2e-$RANDOM | |
|         mkdir -p "$WEED_DATA_DIR" | |
|          | |
|         # Start SeaweedFS server (master, volume, filer) with consistent IP advertising | |
|         nohup weed -v 1 server \ | |
|           -ip="127.0.0.1" \ | |
|           -ip.bind="0.0.0.0" \ | |
|           -dir="$WEED_DATA_DIR" \ | |
|           -master.raftHashicorp \ | |
|           -master.port=9333 \ | |
|           -volume.port=8081 \ | |
|           -filer.port=8888 \ | |
|           -filer=true \ | |
|           -metricsPort=9325 \ | |
|           > /tmp/weed-server.log 2>&1 & | |
|            | |
|         # Wait for master to be ready | |
|         for i in $(seq 1 30); do | |
|           if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then | |
|             echo "SeaweedFS master HTTP is up"; break | |
|           fi | |
|           echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Wait for master gRPC to be ready (this is what broker discovery uses) | |
|         echo "Waiting for master gRPC port..." | |
|         for i in $(seq 1 30); do | |
|           if nc -z 127.0.0.1 19333; then | |
|             echo "✓ SeaweedFS master gRPC is up (port 19333)" | |
|             break | |
|           fi | |
|           echo "  Waiting for master gRPC... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Give server time to initialize all components including gRPC services | |
|         echo "Waiting for SeaweedFS components to initialize..." | |
|         sleep 15 | |
|          | |
|         # Additional wait specifically for gRPC services to be ready for streaming | |
|         echo "Allowing extra time for master gRPC streaming services to initialize..." | |
|         sleep 10 | |
|          | |
|         # Start MQ broker with maximum verbosity for debugging | |
|         echo "Starting MQ broker..." | |
|         nohup weed -v 3 mq.broker \ | |
|           -master="127.0.0.1:9333" \ | |
|           -ip="127.0.0.1" \ | |
|           -port=17777 \ | |
|           -logFlushInterval=0 \ | |
|           > /tmp/weed-mq-broker.log 2>&1 & | |
|          | |
|         # Wait for broker to be ready with better error reporting   | |
|         sleep 15 | |
|         broker_ready=false | |
|         for i in $(seq 1 20); do | |
|           if nc -z 127.0.0.1 17777; then | |
|             echo "SeaweedFS MQ broker is up" | |
|             broker_ready=true | |
|             break | |
|           fi | |
|           echo "Waiting for MQ broker... ($i/20)"; sleep 1 | |
|         done | |
|          | |
|         # Give broker additional time to register with master | |
|         if [ "$broker_ready" = true ]; then | |
|           echo "Allowing broker to register with master..." | |
|           sleep 30 | |
|            | |
|           # Check if broker is properly registered by querying cluster nodes | |
|           echo "Cluster status after broker registration:" | |
|           curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status" | |
|            | |
|           echo "Checking cluster topology (includes registered components):" | |
|           curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status" | |
|            | |
|           echo "Verifying broker discovery via master client debug:" | |
|           echo "If broker registration is successful, it should appear in dir status" | |
|            | |
|           echo "Testing gRPC connectivity with weed binary:" | |
|           echo "This simulates what the gateway does during broker discovery..." | |
|           timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..." | |
|           echo "Shell test results:" | |
|           cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs" | |
|         fi | |
|          | |
|         # Check if broker failed to start and show logs | |
|         if [ "$broker_ready" = false ]; then | |
|           echo "ERROR: MQ broker failed to start. Broker logs:" | |
|           cat /tmp/weed-mq-broker.log || echo "No broker logs found" | |
|           echo "Server logs:"   | |
|           tail -20 /tmp/weed-server.log || echo "No server logs found" | |
|           exit 1 | |
|         fi         | |
|  | |
|     - name: Run End-to-End Tests | |
|       run: | | |
|         cd test/kafka | |
|         # Higher limits for E2E tests | |
|         ulimit -n 1024 || echo "Warning: Could not set file descriptor limit" | |
|         ulimit -u 200 || echo "Warning: Could not set process limit" | |
|          | |
|         # Allow additional time for all background processes to settle | |
|         echo "Allowing additional settlement time for SeaweedFS ecosystem..." | |
|         sleep 15 | |
|          | |
|         # Run tests and capture result | |
|         if ! go test -v -timeout 180s ./e2e/...; then | |
|           echo "=========================================" | |
|           echo "Tests failed! Showing debug information:" | |
|           echo "=========================================" | |
|           echo "Server logs (last 50 lines):" | |
|           tail -50 /tmp/weed-server.log || echo "No server logs" | |
|           echo "=========================================" | |
|           echo "Broker logs (last 50 lines):" | |
|           tail -50 /tmp/weed-mq-broker.log || echo "No broker logs" | |
|           echo "=========================================" | |
|           exit 1 | |
|         fi         | |
|       env: | |
|         GOMAXPROCS: 2 | |
|         SEAWEEDFS_MASTERS: 127.0.0.1:9333 | |
|  | |
|   kafka-consumer-group-tests: | |
|     name: Kafka Consumer Group Tests (Highly Isolated) | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 20 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [consumer-group-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 1.0 --memory 2g --ulimit nofile=512:512 --hostname kafka-consumer-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 1 | |
|       CGO_ENABLED: 0 | |
|       KAFKA_CONSUMER_ISOLATION: "true" | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|         cache: true | |
|         cache-dependency-path: | | |
|                     **/go.sum | |
|       id: go | |
|  | |
|     - name: Setup Consumer Group Container Environment | |
|       run: | | |
|         apk add --no-cache git procps curl netcat-openbsd | |
|         ulimit -n 256 || echo "Warning: Could not set file descriptor limit" | |
|                  | |
|     - name: Warm Go module cache | |
|       run: | | |
|         # Warm cache for root module | |
|         go mod download || true | |
|         # Warm cache for kafka test module | |
|         cd test/kafka | |
|         go mod download || true         | |
|  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         # Use go mod download with timeout to prevent hanging | |
|         timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"         | |
|  | |
|     - name: Build and start SeaweedFS MQ | |
|       run: | | |
|         set -e | |
|         cd $GITHUB_WORKSPACE | |
|         # Build weed binary | |
|         go build -o /usr/local/bin/weed ./weed | |
|         # Start SeaweedFS components with MQ brokers | |
|         export WEED_DATA_DIR=/tmp/seaweedfs-mq-$RANDOM | |
|         mkdir -p "$WEED_DATA_DIR" | |
|          | |
|         # Start SeaweedFS server (master, volume, filer) with consistent IP advertising | |
|         nohup weed -v 1 server \ | |
|           -ip="127.0.0.1" \ | |
|           -ip.bind="0.0.0.0" \ | |
|           -dir="$WEED_DATA_DIR" \ | |
|           -master.raftHashicorp \ | |
|           -master.port=9333 \ | |
|           -volume.port=8081 \ | |
|           -filer.port=8888 \ | |
|           -filer=true \ | |
|           -metricsPort=9325 \ | |
|           > /tmp/weed-server.log 2>&1 & | |
|            | |
|         # Wait for master to be ready | |
|         for i in $(seq 1 30); do | |
|           if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then | |
|             echo "SeaweedFS master HTTP is up"; break | |
|           fi | |
|           echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Wait for master gRPC to be ready (this is what broker discovery uses) | |
|         echo "Waiting for master gRPC port..." | |
|         for i in $(seq 1 30); do | |
|           if nc -z 127.0.0.1 19333; then | |
|             echo "✓ SeaweedFS master gRPC is up (port 19333)" | |
|             break | |
|           fi | |
|           echo "  Waiting for master gRPC... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Give server time to initialize all components including gRPC services | |
|         echo "Waiting for SeaweedFS components to initialize..." | |
|         sleep 15 | |
|          | |
|         # Additional wait specifically for gRPC services to be ready for streaming | |
|         echo "Allowing extra time for master gRPC streaming services to initialize..." | |
|         sleep 10 | |
|          | |
|         # Start MQ broker with maximum verbosity for debugging | |
|         echo "Starting MQ broker..." | |
|         nohup weed -v 3 mq.broker \ | |
|           -master="127.0.0.1:9333" \ | |
|           -ip="127.0.0.1" \ | |
|           -port=17777 \ | |
|           -logFlushInterval=0 \ | |
|           > /tmp/weed-mq-broker.log 2>&1 & | |
|          | |
|         # Wait for broker to be ready with better error reporting   | |
|         sleep 15 | |
|         broker_ready=false | |
|         for i in $(seq 1 20); do | |
|           if nc -z 127.0.0.1 17777; then | |
|             echo "SeaweedFS MQ broker is up" | |
|             broker_ready=true | |
|             break | |
|           fi | |
|           echo "Waiting for MQ broker... ($i/20)"; sleep 1 | |
|         done | |
|          | |
|         # Give broker additional time to register with master | |
|         if [ "$broker_ready" = true ]; then | |
|           echo "Allowing broker to register with master..." | |
|           sleep 30 | |
|            | |
|           # Check if broker is properly registered by querying cluster nodes | |
|           echo "Cluster status after broker registration:" | |
|           curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status" | |
|            | |
|           echo "Checking cluster topology (includes registered components):" | |
|           curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status" | |
|            | |
|           echo "Verifying broker discovery via master client debug:" | |
|           echo "If broker registration is successful, it should appear in dir status" | |
|            | |
|           echo "Testing gRPC connectivity with weed binary:" | |
|           echo "This simulates what the gateway does during broker discovery..." | |
|           timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..." | |
|           echo "Shell test results:" | |
|           cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs" | |
|         fi | |
|          | |
|         # Check if broker failed to start and show logs | |
|         if [ "$broker_ready" = false ]; then | |
|           echo "ERROR: MQ broker failed to start. Broker logs:" | |
|           cat /tmp/weed-mq-broker.log || echo "No broker logs found" | |
|           echo "Server logs:"   | |
|           tail -20 /tmp/weed-server.log || echo "No server logs found" | |
|           exit 1 | |
|         fi         | |
|  | |
|     - name: Run Consumer Group Tests | |
|       run: | | |
|         cd test/kafka | |
|         # Test consumer group functionality with explicit timeout | |
|         ulimit -n 512 || echo "Warning: Could not set file descriptor limit" | |
|         ulimit -u 100 || echo "Warning: Could not set process limit" | |
|         timeout 240s go test -v -run "^TestConsumerGroups" -timeout 180s ./integration/... || echo "Test execution timed out or failed"         | |
|       env: | |
|         GOMAXPROCS: 1 | |
|         SEAWEEDFS_MASTERS: 127.0.0.1:9333 | |
|  | |
|   kafka-client-compatibility: | |
|     name: Kafka Client Compatibility (with SMQ) | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 25 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [client-compat-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 1.0 --memory 1.5g --shm-size 256m --hostname kafka-client-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 1 | |
|       CGO_ENABLED: 0 | |
|       KAFKA_CLIENT_ISOLATION: "true" | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|         cache: true | |
|         cache-dependency-path: | | |
|                     **/go.sum | |
|       id: go | |
|  | |
|     - name: Setup Client Container Environment | |
|       run: | | |
|         apk add --no-cache git procps curl netcat-openbsd | |
|         ulimit -n 1024 || echo "Warning: Could not set file descriptor limit"         | |
|  | |
|     - name: Warm Go module cache | |
|       run: | | |
|         # Warm cache for root module | |
|         go mod download || true | |
|         # Warm cache for kafka test module | |
|         cd test/kafka | |
|         go mod download || true         | |
|  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"         | |
|  | |
|     - name: Build and start SeaweedFS MQ | |
|       run: | | |
|         set -e | |
|         cd $GITHUB_WORKSPACE | |
|         # Build weed binary | |
|         go build -o /usr/local/bin/weed ./weed | |
|         # Start SeaweedFS components with MQ brokers | |
|         export WEED_DATA_DIR=/tmp/seaweedfs-client-$RANDOM | |
|         mkdir -p "$WEED_DATA_DIR" | |
|          | |
|         # Start SeaweedFS server (master, volume, filer) with consistent IP advertising | |
|         nohup weed -v 1 server \ | |
|           -ip="127.0.0.1" \ | |
|           -ip.bind="0.0.0.0" \ | |
|           -dir="$WEED_DATA_DIR" \ | |
|           -master.raftHashicorp \ | |
|           -master.port=9333 \ | |
|           -volume.port=8081 \ | |
|           -filer.port=8888 \ | |
|           -filer=true \ | |
|           -metricsPort=9325 \ | |
|           > /tmp/weed-server.log 2>&1 & | |
|            | |
|         # Wait for master to be ready | |
|         for i in $(seq 1 30); do | |
|           if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then | |
|             echo "SeaweedFS master HTTP is up"; break | |
|           fi | |
|           echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Wait for master gRPC to be ready (this is what broker discovery uses) | |
|         echo "Waiting for master gRPC port..." | |
|         for i in $(seq 1 30); do | |
|           if nc -z 127.0.0.1 19333; then | |
|             echo "✓ SeaweedFS master gRPC is up (port 19333)" | |
|             break | |
|           fi | |
|           echo "  Waiting for master gRPC... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Give server time to initialize all components including gRPC services | |
|         echo "Waiting for SeaweedFS components to initialize..." | |
|         sleep 15 | |
|          | |
|         # Additional wait specifically for gRPC services to be ready for streaming | |
|         echo "Allowing extra time for master gRPC streaming services to initialize..." | |
|         sleep 10 | |
|          | |
|         # Start MQ broker with maximum verbosity for debugging | |
|         echo "Starting MQ broker..." | |
|         nohup weed -v 3 mq.broker \ | |
|           -master="127.0.0.1:9333" \ | |
|           -ip="127.0.0.1" \ | |
|           -port=17777 \ | |
|           -logFlushInterval=0 \ | |
|           > /tmp/weed-mq-broker.log 2>&1 & | |
|          | |
|         # Wait for broker to be ready with better error reporting   | |
|         sleep 15 | |
|         broker_ready=false | |
|         for i in $(seq 1 20); do | |
|           if nc -z 127.0.0.1 17777; then | |
|             echo "SeaweedFS MQ broker is up" | |
|             broker_ready=true | |
|             break | |
|           fi | |
|           echo "Waiting for MQ broker... ($i/20)"; sleep 1 | |
|         done | |
|          | |
|         # Give broker additional time to register with master | |
|         if [ "$broker_ready" = true ]; then | |
|           echo "Allowing broker to register with master..." | |
|           sleep 30 | |
|            | |
|           # Check if broker is properly registered by querying cluster nodes | |
|           echo "Cluster status after broker registration:" | |
|           curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status" | |
|            | |
|           echo "Checking cluster topology (includes registered components):" | |
|           curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status" | |
|            | |
|           echo "Verifying broker discovery via master client debug:" | |
|           echo "If broker registration is successful, it should appear in dir status" | |
|            | |
|           echo "Testing gRPC connectivity with weed binary:" | |
|           echo "This simulates what the gateway does during broker discovery..." | |
|           timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..." | |
|           echo "Shell test results:" | |
|           cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs" | |
|         fi | |
|          | |
|         # Check if broker failed to start and show logs | |
|         if [ "$broker_ready" = false ]; then | |
|           echo "ERROR: MQ broker failed to start. Broker logs:" | |
|           cat /tmp/weed-mq-broker.log || echo "No broker logs found" | |
|           echo "Server logs:"   | |
|           tail -20 /tmp/weed-server.log || echo "No server logs found" | |
|           exit 1 | |
|         fi         | |
|  | |
|     - name: Run Client Compatibility Tests | |
|       run: | | |
|         cd test/kafka | |
|         go test -v -run "^TestClientCompatibility" -timeout 180s ./integration/...         | |
|       env: | |
|         GOMAXPROCS: 1 | |
|         SEAWEEDFS_MASTERS: 127.0.0.1:9333 | |
|  | |
|   kafka-smq-integration-tests: | |
|     name: Kafka SMQ Integration Tests (Full Stack) | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 20 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [smq-integration-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 1.0 --memory 2g --hostname kafka-smq-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 1 | |
|       CGO_ENABLED: 0 | |
|       KAFKA_SMQ_INTEGRATION: "true" | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|         cache: true | |
|         cache-dependency-path: | | |
|                     **/go.sum | |
|       id: go | |
|  | |
|     - name: Setup SMQ Integration Container Environment | |
|       run: | | |
|         apk add --no-cache git procps curl netcat-openbsd | |
|         ulimit -n 1024 || echo "Warning: Could not set file descriptor limit" | |
|                  | |
|     - name: Warm Go module cache | |
|       run: | | |
|         # Warm cache for root module | |
|         go mod download || true | |
|         # Warm cache for kafka test module | |
|         cd test/kafka | |
|         go mod download || true         | |
|  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"         | |
|  | |
|     - name: Build and start SeaweedFS MQ | |
|       run: | | |
|         set -e | |
|         cd $GITHUB_WORKSPACE | |
|         # Build weed binary | |
|         go build -o /usr/local/bin/weed ./weed | |
|         # Start SeaweedFS components with MQ brokers | |
|         export WEED_DATA_DIR=/tmp/seaweedfs-smq-$RANDOM | |
|         mkdir -p "$WEED_DATA_DIR" | |
|          | |
|         # Start SeaweedFS server (master, volume, filer) with consistent IP advertising | |
|         nohup weed -v 1 server \ | |
|           -ip="127.0.0.1" \ | |
|           -ip.bind="0.0.0.0" \ | |
|           -dir="$WEED_DATA_DIR" \ | |
|           -master.raftHashicorp \ | |
|           -master.port=9333 \ | |
|           -volume.port=8081 \ | |
|           -filer.port=8888 \ | |
|           -filer=true \ | |
|           -metricsPort=9325 \ | |
|           > /tmp/weed-server.log 2>&1 & | |
|            | |
|         # Wait for master to be ready | |
|         for i in $(seq 1 30); do | |
|           if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then | |
|             echo "SeaweedFS master HTTP is up"; break | |
|           fi | |
|           echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Wait for master gRPC to be ready (this is what broker discovery uses) | |
|         echo "Waiting for master gRPC port..." | |
|         for i in $(seq 1 30); do | |
|           if nc -z 127.0.0.1 19333; then | |
|             echo "✓ SeaweedFS master gRPC is up (port 19333)" | |
|             break | |
|           fi | |
|           echo "  Waiting for master gRPC... ($i/30)"; sleep 1 | |
|         done | |
|          | |
|         # Give server time to initialize all components including gRPC services | |
|         echo "Waiting for SeaweedFS components to initialize..." | |
|         sleep 15 | |
|          | |
|         # Additional wait specifically for gRPC services to be ready for streaming | |
|         echo "Allowing extra time for master gRPC streaming services to initialize..." | |
|         sleep 10 | |
|          | |
|         # Start MQ broker with maximum verbosity for debugging | |
|         echo "Starting MQ broker..." | |
|         nohup weed -v 3 mq.broker \ | |
|           -master="127.0.0.1:9333" \ | |
|           -ip="127.0.0.1" \ | |
|           -port=17777 \ | |
|           -logFlushInterval=0 \ | |
|           > /tmp/weed-mq-broker.log 2>&1 & | |
|          | |
|         # Wait for broker to be ready with better error reporting   | |
|         sleep 15 | |
|         broker_ready=false | |
|         for i in $(seq 1 20); do | |
|           if nc -z 127.0.0.1 17777; then | |
|             echo "SeaweedFS MQ broker is up" | |
|             broker_ready=true | |
|             break | |
|           fi | |
|           echo "Waiting for MQ broker... ($i/20)"; sleep 1 | |
|         done | |
|          | |
|         # Give broker additional time to register with master | |
|         if [ "$broker_ready" = true ]; then | |
|           echo "Allowing broker to register with master..." | |
|           sleep 30 | |
|            | |
|           # Check if broker is properly registered by querying cluster nodes | |
|           echo "Cluster status after broker registration:" | |
|           curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status" | |
|            | |
|           echo "Checking cluster topology (includes registered components):" | |
|           curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status" | |
|            | |
|           echo "Verifying broker discovery via master client debug:" | |
|           echo "If broker registration is successful, it should appear in dir status" | |
|            | |
|           echo "Testing gRPC connectivity with weed binary:" | |
|           echo "This simulates what the gateway does during broker discovery..." | |
|           timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..." | |
|           echo "Shell test results:" | |
|           cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs" | |
|         fi | |
|          | |
|         # Check if broker failed to start and show logs | |
|         if [ "$broker_ready" = false ]; then | |
|           echo "ERROR: MQ broker failed to start. Broker logs:" | |
|           cat /tmp/weed-mq-broker.log || echo "No broker logs found" | |
|           echo "Server logs:"   | |
|           tail -20 /tmp/weed-server.log || echo "No server logs found" | |
|           exit 1 | |
|         fi         | |
|  | |
|     - name: Run SMQ Integration Tests | |
|       run: | | |
|         cd test/kafka | |
|         ulimit -n 512 || echo "Warning: Could not set file descriptor limit" | |
|         ulimit -u 100 || echo "Warning: Could not set process limit" | |
|         # Run the dedicated SMQ integration tests | |
|         go test -v -run "^TestSMQIntegration" -timeout 180s ./integration/...         | |
|       env: | |
|         GOMAXPROCS: 1 | |
|         SEAWEEDFS_MASTERS: 127.0.0.1:9333 | |
|  | |
|   kafka-protocol-tests: | |
|     name: Kafka Protocol Tests (Isolated) | |
|     runs-on: ubuntu-latest | |
|     timeout-minutes: 5 | |
|     strategy: | |
|       fail-fast: false | |
|       matrix: | |
|         container-id: [protocol-1] | |
|     container: | |
|       image: golang:1.24-alpine | |
|       options: --cpus 1.0 --memory 1g --tmpfs /tmp:exec --hostname kafka-protocol-${{ matrix.container-id }} | |
|     env: | |
|       GOMAXPROCS: 1 | |
|       CGO_ENABLED: 0 | |
|       KAFKA_PROTOCOL_ISOLATION: "true" | |
|       CONTAINER_ID: ${{ matrix.container-id }} | |
|     steps: | |
|     - name: Set up Go 1.x | |
|       uses: actions/setup-go@v6 | |
|       with: | |
|         go-version: ^1.24 | |
|       id: go | |
|  | |
|     - name: Check out code | |
|       uses: actions/checkout@v5 | |
|  | |
|     - name: Setup Protocol Container Environment | |
|       run: | | |
|         apk add --no-cache git procps | |
|         # Ensure proper permissions for test execution | |
|         chmod -R 755 /tmp || true | |
|         export TMPDIR=/tmp | |
|         export GOCACHE=/tmp/go-cache | |
|         mkdir -p $GOCACHE | |
|         chmod 755 $GOCACHE         | |
|  | |
|     - name: Get dependencies | |
|       run: | | |
|         cd test/kafka | |
|         go mod download         | |
|  | |
|     - name: Run Protocol Tests | |
|       run: | | |
|         cd test/kafka | |
|         export TMPDIR=/tmp | |
|         export GOCACHE=/tmp/go-cache | |
|         # Run protocol tests from the weed/mq/kafka directory since they test the protocol implementation | |
|         cd ../../weed/mq/kafka | |
|         go test -v -run "^Test.*" -timeout 10s ./...         | |
|       env: | |
|         GOMAXPROCS: 1 | |
|         TMPDIR: /tmp | |
|         GOCACHE: /tmp/go-cache
 |