diff --git a/.github/workflows/posix-compliance.yml b/.github/workflows/posix-compliance.yml index a64ea0d53..1b3f62830 100644 --- a/.github/workflows/posix-compliance.yml +++ b/.github/workflows/posix-compliance.yml @@ -109,9 +109,151 @@ jobs: sudo cp ./weed /usr/local/bin/weed which weed weed version - - - name: Run POSIX compliance tests - id: posix-tests + + - name: Set up SeaweedFS cluster + run: | + # Create directories for SeaweedFS cluster + mkdir -p /tmp/seaweedfs/{master,volume,filer,mount} + + # Start SeaweedFS master server in background + echo "Starting SeaweedFS master..." + weed master \ + -ip=127.0.0.1 \ + -port=9333 \ + -mdir=/tmp/seaweedfs/master \ + -raftBootstrap=true \ + > /tmp/seaweedfs/master.log 2>&1 & + MASTER_PID=$! + echo $MASTER_PID > /tmp/seaweedfs/master.pid + + # Wait for master to be ready + echo "Waiting for master to start..." + for i in {1..30}; do + if curl -sf http://127.0.0.1:9333/cluster/status > /dev/null 2>&1; then + echo "Master is ready" + break + fi + if [ $i -eq 30 ]; then + echo "Master failed to start" + cat /tmp/seaweedfs/master.log + exit 1 + fi + sleep 2 + done + + # Start volume server in background + echo "Starting SeaweedFS volume server..." + weed volume \ + -mserver=127.0.0.1:9333 \ + -ip=127.0.0.1 \ + -port=8080 \ + -dir=/tmp/seaweedfs/volume \ + -max=100 \ + > /tmp/seaweedfs/volume.log 2>&1 & + VOLUME_PID=$! + echo $VOLUME_PID > /tmp/seaweedfs/volume.pid + + # Wait for volume server to be ready + echo "Waiting for volume server to start..." + for i in {1..30}; do + if curl -sf http://127.0.0.1:8080/status > /dev/null 2>&1; then + echo "Volume server is ready" + break + fi + if [ $i -eq 30 ]; then + echo "Volume server failed to start" + cat /tmp/seaweedfs/volume.log + exit 1 + fi + sleep 2 + done + + # Start filer server in background + echo "Starting SeaweedFS filer..." + weed filer \ + -master=127.0.0.1:9333 \ + -ip=127.0.0.1 \ + -port=8888 \ + > /tmp/seaweedfs/filer.log 2>&1 & + FILER_PID=$! + echo $FILER_PID > /tmp/seaweedfs/filer.pid + + # Wait for filer to be ready + echo "Waiting for filer to start..." + for i in {1..30}; do + if curl -sf http://127.0.0.1:8888/dir/status > /dev/null 2>&1; then + echo "Filer is ready" + break + fi + if [ $i -eq 30 ]; then + echo "Filer failed to start" + cat /tmp/seaweedfs/filer.log + exit 1 + fi + sleep 2 + done + + # Show cluster status + echo "SeaweedFS cluster status:" + curl -s http://127.0.0.1:9333/cluster/status || true + + - name: Set up FUSE mount + run: | + # Create mount point + MOUNT_POINT="/tmp/seaweedfs/mount" + mkdir -p $MOUNT_POINT + + echo "Mounting SeaweedFS FUSE filesystem..." + # Mount SeaweedFS FUSE filesystem in background + weed mount \ + -filer=127.0.0.1:8888 \ + -dir=$MOUNT_POINT \ + -filer.path=/ \ + -dirAutoCreate=true \ + -allowOthers=true \ + -nonempty=true \ + > /tmp/seaweedfs/mount.log 2>&1 & + MOUNT_PID=$! + echo $MOUNT_PID > /tmp/seaweedfs/mount.pid + + # Wait for mount to be ready + echo "Waiting for FUSE mount to be ready..." + for i in {1..30}; do + if mountpoint -q $MOUNT_POINT 2>/dev/null; then + echo "FUSE mount is ready" + break + fi + # Alternative check - try to list the directory + if ls -la $MOUNT_POINT > /dev/null 2>&1; then + echo "FUSE mount is ready (directory accessible)" + break + fi + if [ $i -eq 30 ]; then + echo "FUSE mount failed to be ready" + cat /tmp/seaweedfs/mount.log + echo "Mount status:" + mount | grep fuse || echo "No FUSE mounts found" + ps aux | grep weed || echo "No weed processes found" + exit 1 + fi + sleep 2 + done + + # Verify mount is working + echo "Testing FUSE mount functionality..." + echo "test" > $MOUNT_POINT/test_file.txt + if [ "$(cat $MOUNT_POINT/test_file.txt)" = "test" ]; then + echo "FUSE mount is working correctly" + rm $MOUNT_POINT/test_file.txt + else + echo "FUSE mount is not working properly" + exit 1 + fi + + # Export mount point for tests + echo "SEAWEEDFS_MOUNT_POINT=$MOUNT_POINT" >> $GITHUB_ENV + + - name: Set up test environment run: | cd test/fuse_integration @@ -129,6 +271,23 @@ jobs: make -f posix_Makefile setup-external-tools || true fi + # Verify SeaweedFS cluster is accessible + echo "Verifying SeaweedFS cluster accessibility..." + curl -sf http://127.0.0.1:9333/cluster/status + curl -sf http://127.0.0.1:8080/status + curl -sf http://127.0.0.1:8888/dir/status + + # Verify mount point + echo "Mount point: $SEAWEEDFS_MOUNT_POINT" + ls -la $SEAWEEDFS_MOUNT_POINT + + - name: Run POSIX compliance tests + id: posix-tests + env: + SEAWEEDFS_MOUNT_POINT: ${{ env.SEAWEEDFS_MOUNT_POINT }} + run: | + cd test/fuse_integration + # Determine which tests to run TEST_TYPE="${{ github.event.inputs.test_type }}" if [ -z "$TEST_TYPE" ]; then @@ -136,6 +295,11 @@ jobs: fi echo "Running POSIX tests: $TEST_TYPE" + echo "Using mount point: $SEAWEEDFS_MOUNT_POINT" + + # Set test configuration to use our mounted filesystem + export TEST_MOUNT_POINT="$SEAWEEDFS_MOUNT_POINT" + export TEST_SKIP_CLUSTER_SETUP="true" case "$TEST_TYPE" in "critical") @@ -172,6 +336,153 @@ jobs: cd test/fuse_integration make -f posix_Makefile generate-report + - name: Cleanup SeaweedFS cluster and FUSE mount + if: always() + run: | + echo "Cleaning up SeaweedFS cluster and FUSE mount..." + + # Unmount FUSE filesystem + MOUNT_POINT="/tmp/seaweedfs/mount" + if mountpoint -q $MOUNT_POINT 2>/dev/null; then + echo "Unmounting FUSE filesystem..." + fusermount -u $MOUNT_POINT || umount $MOUNT_POINT || true + fi + + # Stop mount process + if [ -f /tmp/seaweedfs/mount.pid ]; then + MOUNT_PID=$(cat /tmp/seaweedfs/mount.pid) + if kill -0 $MOUNT_PID 2>/dev/null; then + echo "Stopping mount process (PID: $MOUNT_PID)..." + kill -TERM $MOUNT_PID || true + sleep 2 + kill -KILL $MOUNT_PID 2>/dev/null || true + fi + fi + + # Stop filer process + if [ -f /tmp/seaweedfs/filer.pid ]; then + FILER_PID=$(cat /tmp/seaweedfs/filer.pid) + if kill -0 $FILER_PID 2>/dev/null; then + echo "Stopping filer process (PID: $FILER_PID)..." + kill -TERM $FILER_PID || true + sleep 2 + kill -KILL $FILER_PID 2>/dev/null || true + fi + fi + + # Stop volume process + if [ -f /tmp/seaweedfs/volume.pid ]; then + VOLUME_PID=$(cat /tmp/seaweedfs/volume.pid) + if kill -0 $VOLUME_PID 2>/dev/null; then + echo "Stopping volume process (PID: $VOLUME_PID)..." + kill -TERM $VOLUME_PID || true + sleep 2 + kill -KILL $VOLUME_PID 2>/dev/null || true + fi + fi + + # Stop master process + if [ -f /tmp/seaweedfs/master.pid ]; then + MASTER_PID=$(cat /tmp/seaweedfs/master.pid) + if kill -0 $MASTER_PID 2>/dev/null; then + echo "Stopping master process (PID: $MASTER_PID)..." + kill -TERM $MASTER_PID || true + sleep 2 + kill -KILL $MASTER_PID 2>/dev/null || true + fi + fi + + # Kill any remaining weed processes + pkill -f "weed " || true + + # Clean up any stale mounts + fusermount -u $MOUNT_POINT 2>/dev/null || true + umount $MOUNT_POINT 2>/dev/null || true + + # Remove temporary directories + rm -rf /tmp/seaweedfs || true + + echo "Cleanup completed" + + - name: Collect system information for debugging + if: failure() + run: | + cd test/fuse_integration + mkdir -p reports/debug + + echo "System Information" > reports/debug/system_info.txt + uname -a >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "Mount Information" >> reports/debug/system_info.txt + mount >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "Disk Space" >> reports/debug/system_info.txt + df -h >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "Memory Information" >> reports/debug/system_info.txt + free -h >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "FUSE Information" >> reports/debug/system_info.txt + ls -la /dev/fuse >> reports/debug/system_info.txt + lsmod | grep fuse >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "SeaweedFS Version" >> reports/debug/system_info.txt + weed version >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "Go Version" >> reports/debug/system_info.txt + go version >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + echo "Running Processes" >> reports/debug/system_info.txt + ps aux | grep -E "(weed|fuse)" >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + + # Collect SeaweedFS service logs + echo "=== SeaweedFS Service Logs ===" >> reports/debug/system_info.txt + if [ -f /tmp/seaweedfs/master.log ]; then + echo "Master Log:" >> reports/debug/system_info.txt + tail -50 /tmp/seaweedfs/master.log >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + fi + + if [ -f /tmp/seaweedfs/volume.log ]; then + echo "Volume Log:" >> reports/debug/system_info.txt + tail -50 /tmp/seaweedfs/volume.log >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + fi + + if [ -f /tmp/seaweedfs/filer.log ]; then + echo "Filer Log:" >> reports/debug/system_info.txt + tail -50 /tmp/seaweedfs/filer.log >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + fi + + if [ -f /tmp/seaweedfs/mount.log ]; then + echo "Mount Log:" >> reports/debug/system_info.txt + tail -50 /tmp/seaweedfs/mount.log >> reports/debug/system_info.txt + echo "" >> reports/debug/system_info.txt + fi + + # Copy full logs as separate files + if [ -f /tmp/seaweedfs/master.log ]; then + cp /tmp/seaweedfs/master.log reports/debug/master.log + fi + if [ -f /tmp/seaweedfs/volume.log ]; then + cp /tmp/seaweedfs/volume.log reports/debug/volume.log + fi + if [ -f /tmp/seaweedfs/filer.log ]; then + cp /tmp/seaweedfs/filer.log reports/debug/filer.log + fi + if [ -f /tmp/seaweedfs/mount.log ]; then + cp /tmp/seaweedfs/mount.log reports/debug/mount.log + fi + - name: Upload test results uses: actions/upload-artifact@v4 if: always() @@ -211,9 +522,9 @@ jobs:
Test Summary - ``` + \`\`\` ${report} - ``` + \`\`\`
📊 Full results available in [test artifacts](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) @@ -292,19 +603,14 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - - name: Install gosec - run: go install github.com/securecodewarrior/gosec/v2/cmd/gosec@v2.18.2 + - name: Install security tools + run: | + go install github.com/securecodewarrior/gosec/v2/cmd/gosec@latest - name: Run security analysis on FUSE code run: | # Analyze mount and FUSE-related code for security issues - echo "Running gosec security analysis..." gosec -fmt json -out gosec-report.json -severity medium ./weed/mount/... ./weed/command/mount* ./weed/command/fuse* || true - - if [ ! -f gosec-report.json ]; then - echo "Warning: gosec report not found, creating placeholder" - echo '{"issues": [], "stats": {"files": 0, "lines": 0, "nosec": 0, "found": 0}, "error": "no report generated"}' > gosec-report.json - fi - name: Upload security analysis results uses: actions/upload-artifact@v4