Browse Source
feat: add comprehensive S3 IAM integration tests GitHub Action
feat: add comprehensive S3 IAM integration tests GitHub Action
This GitHub Action provides comprehensive testing coverage for the SeaweedFS IAM system including STS, policy engine, roles, and S3 API integration. ### Test Coverage: #### IAM Unit Tests: - STS service tests (token generation, validation, providers) - Policy engine tests (evaluation, storage, distribution) - Integration tests (role management, cross-component) - S3 API IAM middleware tests #### S3 IAM Integration Tests (3 test types): - Basic: Authentication, token validation, basic workflows - Advanced: Session expiration, multipart uploads, presigned URLs - Policy Enforcement: IAM policies, bucket policies, contextual rules #### Keycloak Integration Tests: - Real OIDC provider integration via Docker Compose - End-to-end authentication flow with Keycloak - Claims mapping and role-based access control - Only runs on master pushes or when Keycloak files change #### Distributed IAM Tests: - Cross-instance token validation - Persistent storage (filer-based stores) - Configuration consistency across instances - Only runs on master pushes to avoid PR overhead #### Performance Tests: - IAM component benchmarks - Load testing for authentication flows - Memory and performance profiling - Only runs on master pushes ### Workflow Features: - Path-based triggering (only runs when IAM code changes) - Matrix strategy for comprehensive coverage - Proper service startup/shutdown with health checks - Detailed logging and artifact upload on failures - Timeout protection and resource cleanup - Docker Compose integration for complex scenarios ### CI/CD Integration: - Runs on pull requests for core functionality - Extended tests on master branch pushes - Artifact preservation for debugging failed tests - Efficient concurrency control to prevent conflictspull/7160/head
1 changed files with 386 additions and 0 deletions
@ -0,0 +1,386 @@ |
|||
name: "S3 IAM Integration Tests" |
|||
|
|||
on: |
|||
pull_request: |
|||
paths: |
|||
- 'weed/iam/**' |
|||
- 'weed/s3api/**' |
|||
- 'test/s3/iam/**' |
|||
- '.github/workflows/s3-iam-tests.yml' |
|||
push: |
|||
branches: [ master ] |
|||
paths: |
|||
- 'weed/iam/**' |
|||
- 'weed/s3api/**' |
|||
- 'test/s3/iam/**' |
|||
- '.github/workflows/s3-iam-tests.yml' |
|||
|
|||
concurrency: |
|||
group: ${{ github.head_ref }}/s3-iam-tests |
|||
cancel-in-progress: true |
|||
|
|||
permissions: |
|||
contents: read |
|||
|
|||
defaults: |
|||
run: |
|||
working-directory: weed |
|||
|
|||
jobs: |
|||
# Unit tests for IAM components |
|||
iam-unit-tests: |
|||
name: IAM Unit Tests |
|||
runs-on: ubuntu-22.04 |
|||
timeout-minutes: 15 |
|||
|
|||
steps: |
|||
- name: Check out code |
|||
uses: actions/checkout@v5 |
|||
|
|||
- name: Set up Go |
|||
uses: actions/setup-go@v5 |
|||
with: |
|||
go-version-file: 'go.mod' |
|||
id: go |
|||
|
|||
- name: Get dependencies |
|||
run: | |
|||
go mod download |
|||
|
|||
- name: Run IAM Unit Tests |
|||
timeout-minutes: 10 |
|||
run: | |
|||
set -x |
|||
echo "=== Running IAM STS Tests ===" |
|||
go test -v -timeout 5m ./iam/sts/... |
|||
|
|||
echo "=== Running IAM Policy Tests ===" |
|||
go test -v -timeout 5m ./iam/policy/... |
|||
|
|||
echo "=== Running IAM Integration Tests ===" |
|||
go test -v -timeout 5m ./iam/integration/... |
|||
|
|||
echo "=== Running S3 API IAM Tests ===" |
|||
go test -v -timeout 5m ./s3api/... -run ".*IAM.*|.*JWT.*|.*Auth.*" |
|||
|
|||
- name: Upload test results on failure |
|||
if: failure() |
|||
uses: actions/upload-artifact@v4 |
|||
with: |
|||
name: iam-unit-test-results |
|||
path: | |
|||
weed/testdata/ |
|||
weed/**/testdata/ |
|||
retention-days: 3 |
|||
|
|||
# S3 IAM integration tests with SeaweedFS services |
|||
s3-iam-integration-tests: |
|||
name: S3 IAM Integration Tests |
|||
runs-on: ubuntu-22.04 |
|||
timeout-minutes: 25 |
|||
strategy: |
|||
matrix: |
|||
test-type: ["basic", "advanced", "policy-enforcement"] |
|||
|
|||
steps: |
|||
- name: Check out code |
|||
uses: actions/checkout@v5 |
|||
|
|||
- name: Set up Go |
|||
uses: actions/setup-go@v5 |
|||
with: |
|||
go-version-file: 'go.mod' |
|||
id: go |
|||
|
|||
- name: Install SeaweedFS |
|||
working-directory: weed |
|||
run: | |
|||
go install -buildvcs=false |
|||
|
|||
- name: Run S3 IAM Integration Tests - ${{ matrix.test-type }} |
|||
timeout-minutes: 20 |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
set -x |
|||
echo "=== System Information ===" |
|||
uname -a |
|||
free -h |
|||
df -h |
|||
echo "=== Starting S3 IAM Integration Tests (${{ matrix.test-type }}) ===" |
|||
|
|||
# Set WEED_BINARY to use the installed version |
|||
export WEED_BINARY=$(which weed) |
|||
export TEST_TIMEOUT=15m |
|||
|
|||
# Run tests based on type |
|||
case "${{ matrix.test-type }}" in |
|||
"basic") |
|||
echo "Running basic IAM functionality tests..." |
|||
make clean setup start-services wait-for-services |
|||
go test -v -timeout 15m -run "TestS3IAMAuthentication|TestS3IAMBasicWorkflow|TestS3IAMTokenValidation" ./... |
|||
;; |
|||
"advanced") |
|||
echo "Running advanced IAM feature tests..." |
|||
make clean setup start-services wait-for-services |
|||
go test -v -timeout 15m -run "TestS3IAMSessionExpiration|TestS3IAMMultipart|TestS3IAMPresigned" ./... |
|||
;; |
|||
"policy-enforcement") |
|||
echo "Running policy enforcement tests..." |
|||
make clean setup start-services wait-for-services |
|||
go test -v -timeout 15m -run "TestS3IAMPolicyEnforcement|TestS3IAMBucketPolicy|TestS3IAMContextual" ./... |
|||
;; |
|||
esac |
|||
|
|||
# Always cleanup |
|||
make stop-services |
|||
|
|||
- name: Show service logs on failure |
|||
if: failure() |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
echo "=== Service Logs ===" |
|||
echo "--- Master Log ---" |
|||
tail -50 weed-master.log 2>/dev/null || echo "No master log found" |
|||
echo "" |
|||
echo "--- Filer Log ---" |
|||
tail -50 weed-filer.log 2>/dev/null || echo "No filer log found" |
|||
echo "" |
|||
echo "--- Volume Log ---" |
|||
tail -50 weed-volume.log 2>/dev/null || echo "No volume log found" |
|||
echo "" |
|||
echo "--- S3 API Log ---" |
|||
tail -50 weed-s3.log 2>/dev/null || echo "No S3 log found" |
|||
echo "" |
|||
|
|||
echo "=== Process Information ===" |
|||
ps aux | grep -E "(weed|test)" || true |
|||
netstat -tlnp | grep -E "(8333|8888|9333|8080)" || true |
|||
|
|||
- name: Upload test logs on failure |
|||
if: failure() |
|||
uses: actions/upload-artifact@v4 |
|||
with: |
|||
name: s3-iam-integration-logs-${{ matrix.test-type }} |
|||
path: test/s3/iam/weed-*.log |
|||
retention-days: 5 |
|||
|
|||
# Keycloak integration tests with Docker Compose |
|||
s3-iam-keycloak-tests: |
|||
name: S3 IAM Keycloak Integration |
|||
runs-on: ubuntu-22.04 |
|||
timeout-minutes: 30 |
|||
# Only run on master branch pushes or when Keycloak-related files change |
|||
if: | |
|||
github.event_name == 'push' && github.ref == 'refs/heads/master' || |
|||
contains(github.event.pull_request.changed_files, 'test/s3/iam/keycloak') || |
|||
contains(github.event.pull_request.changed_files, 'test/s3/iam/docker-compose') || |
|||
contains(github.event.pull_request.changed_files, 'test/s3/iam/s3_keycloak') |
|||
|
|||
steps: |
|||
- name: Check out code |
|||
uses: actions/checkout@v5 |
|||
|
|||
- name: Set up Go |
|||
uses: actions/setup-go@v5 |
|||
with: |
|||
go-version-file: 'go.mod' |
|||
id: go |
|||
|
|||
- name: Set up Docker Buildx |
|||
uses: docker/setup-buildx-action@v3 |
|||
|
|||
- name: Build SeaweedFS IAM Image |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
echo "Building custom SeaweedFS image with IAM support..." |
|||
docker build -f Dockerfile.s3 -t seaweedfs-iam:latest ../../.. |
|||
|
|||
- name: Start Keycloak and SeaweedFS Services |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
echo "Starting services with Docker Compose..." |
|||
docker compose up -d |
|||
|
|||
echo "Waiting for Keycloak to be ready..." |
|||
timeout 120 bash -c 'until curl -s http://localhost:8080/realms/seaweedfs-test/.well-known/openid-configuration > /dev/null; do sleep 5; done' || { |
|||
echo "Keycloak failed to start" |
|||
docker compose logs keycloak |
|||
exit 1 |
|||
} |
|||
|
|||
echo "Waiting for SeaweedFS S3 API to be ready..." |
|||
timeout 60 bash -c 'until curl -s http://localhost:8333 > /dev/null 2>&1; do sleep 3; done' || { |
|||
echo "SeaweedFS S3 API failed to start" |
|||
docker compose logs s3 |
|||
exit 1 |
|||
} |
|||
|
|||
echo "All services are ready" |
|||
|
|||
- name: Run Keycloak Integration Tests |
|||
timeout-minutes: 20 |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
set -x |
|||
echo "=== Running Keycloak Integration Tests ===" |
|||
|
|||
export KEYCLOAK_URL="http://localhost:8080" |
|||
export S3_ENDPOINT="http://localhost:8333" |
|||
|
|||
# Give services extra time to fully initialize |
|||
sleep 15 |
|||
|
|||
# Run Keycloak-specific tests |
|||
go test -v -timeout 15m -run "TestKeycloak" ./... || { |
|||
echo "❌ Keycloak integration tests failed" |
|||
echo "=== Service Logs ===" |
|||
docker compose logs --tail=100 |
|||
exit 1 |
|||
} |
|||
|
|||
- name: Show Docker logs on failure |
|||
if: failure() |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
echo "=== Docker Compose Service Logs ===" |
|||
docker compose logs --tail=200 |
|||
|
|||
echo "=== Container Status ===" |
|||
docker compose ps |
|||
|
|||
echo "=== Network Information ===" |
|||
docker network ls |
|||
curl -v http://localhost:8080/realms/seaweedfs-test/.well-known/openid-configuration || true |
|||
curl -v http://localhost:8333 || true |
|||
|
|||
- name: Cleanup Docker Services |
|||
if: always() |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
echo "Stopping Docker Compose services..." |
|||
docker compose down -v --remove-orphans |
|||
docker image prune -f |
|||
|
|||
- name: Upload Docker logs on failure |
|||
if: failure() |
|||
uses: actions/upload-artifact@v4 |
|||
with: |
|||
name: s3-iam-keycloak-logs |
|||
path: test/s3/iam/docker-*.log |
|||
retention-days: 5 |
|||
|
|||
# Distributed IAM tests |
|||
s3-iam-distributed-tests: |
|||
name: S3 IAM Distributed Tests |
|||
runs-on: ubuntu-22.04 |
|||
timeout-minutes: 25 |
|||
# Only run on master branch pushes to avoid overloading PR testing |
|||
if: github.event_name == 'push' && github.ref == 'refs/heads/master' |
|||
|
|||
steps: |
|||
- name: Check out code |
|||
uses: actions/checkout@v5 |
|||
|
|||
- name: Set up Go |
|||
uses: actions/setup-go@v5 |
|||
with: |
|||
go-version-file: 'go.mod' |
|||
id: go |
|||
|
|||
- name: Install SeaweedFS |
|||
working-directory: weed |
|||
run: | |
|||
go install -buildvcs=false |
|||
|
|||
- name: Run Distributed IAM Tests |
|||
timeout-minutes: 20 |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
set -x |
|||
echo "=== System Information ===" |
|||
uname -a |
|||
free -h |
|||
|
|||
export WEED_BINARY=$(which weed) |
|||
export TEST_TIMEOUT=15m |
|||
|
|||
# Test distributed configuration |
|||
echo "Testing distributed IAM configuration..." |
|||
make clean setup |
|||
|
|||
# Start services with distributed IAM config |
|||
echo "Starting services with distributed configuration..." |
|||
make start-services |
|||
make wait-for-services |
|||
|
|||
# Run distributed-specific tests |
|||
go test -v -timeout 15m -run "TestDistributed|TestCrossInstance|TestPersistence" ./... || { |
|||
echo "❌ Distributed tests failed, checking logs..." |
|||
make logs |
|||
exit 1 |
|||
} |
|||
|
|||
make stop-services |
|||
|
|||
- name: Upload distributed test logs |
|||
if: always() |
|||
uses: actions/upload-artifact@v4 |
|||
with: |
|||
name: s3-iam-distributed-logs |
|||
path: test/s3/iam/weed-*.log |
|||
retention-days: 7 |
|||
|
|||
# Performance and stress tests |
|||
s3-iam-performance-tests: |
|||
name: S3 IAM Performance Tests |
|||
runs-on: ubuntu-22.04 |
|||
timeout-minutes: 30 |
|||
# Only run on master branch pushes to avoid overloading PR testing |
|||
if: github.event_name == 'push' && github.ref == 'refs/heads/master' |
|||
|
|||
steps: |
|||
- name: Check out code |
|||
uses: actions/checkout@v5 |
|||
|
|||
- name: Set up Go |
|||
uses: actions/setup-go@v5 |
|||
with: |
|||
go-version-file: 'go.mod' |
|||
id: go |
|||
|
|||
- name: Install SeaweedFS |
|||
working-directory: weed |
|||
run: | |
|||
go install -buildvcs=false |
|||
|
|||
- name: Run IAM Performance Benchmarks |
|||
timeout-minutes: 25 |
|||
working-directory: test/s3/iam |
|||
run: | |
|||
set -x |
|||
echo "=== Running IAM Performance Tests ===" |
|||
|
|||
export WEED_BINARY=$(which weed) |
|||
export TEST_TIMEOUT=20m |
|||
|
|||
make clean setup start-services wait-for-services |
|||
|
|||
# Run performance benchmarks |
|||
echo "Running performance benchmarks..." |
|||
go test -bench=. -benchmem -timeout 20m ./... || { |
|||
echo "❌ Performance tests failed" |
|||
make logs |
|||
exit 1 |
|||
} |
|||
|
|||
make stop-services |
|||
|
|||
- name: Upload performance test results |
|||
if: always() |
|||
uses: actions/upload-artifact@v4 |
|||
with: |
|||
name: s3-iam-performance-results |
|||
path: | |
|||
test/s3/iam/weed-*.log |
|||
test/s3/iam/*.test |
|||
retention-days: 7 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue