# KMS End-to-End Tests This directory contains the integration suites used to validate the full RustFS KMS (Key Management Service) workflow. ## 📁 Test Overview ### `kms_local_test.rs` End-to-end coverage for the local KMS backend: - Auto-start and configure the local backend - Configure KMS through the dynamic configuration API - Verify SSE-C (client-provided keys) - Exercise S3-compatible encryption/decryption - Validate key lifecycle management ### `kms_vault_test.rs` End-to-end coverage for the Vault backend: - Launch a Vault dev server automatically - Configure the transit engine and encryption keys - Configure KMS via the dynamic configuration API - Run the full Vault integration flow - Validate token authentication and encryption operations ### `kms_comprehensive_test.rs` **Full KMS capability suite** (currently disabled because of AWS SDK compatibility issues): - **Bucket encryption configuration**: SSE-S3 and SSE-KMS defaults - **All SSE encryption modes**: - SSE-S3 (S3-managed server-side encryption) - SSE-KMS (KMS-managed server-side encryption) - SSE-C (client-provided keys) - **Object operations**: upload, download, and validation for every SSE mode - **Multipart uploads**: cover each SSE mode - **Object replication**: cross-mode replication scenarios - **Complete KMS API management**: - Key lifecycle (create, list, describe, delete, cancel delete) - Direct encrypt/decrypt operations - Data key generation and handling - KMS service lifecycle (start, stop, status) ### `kms_integration_test.rs` Broad integration tests that exercise: - Multiple backends - KMS lifecycle management - Error handling and recovery - **Note**: currently disabled because of AWS SDK compatibility gaps ## 🚀 Running Tests ### Prerequisites 1. **System dependencies** ```bash # macOS brew install vault awscurl # Ubuntu/Debian apt-get install vault pip install awscurl ``` 2. **Build RustFS** ```bash cargo build ``` ### Run individual suites #### Local backend ```bash cd crates/e2e_test cargo test test_local_kms_end_to_end -- --nocapture ``` #### Vault backend ```bash cd crates/e2e_test cargo test test_vault_kms_end_to_end -- --nocapture ``` #### High availability ```bash cd crates/e2e_test cargo test test_vault_kms_high_availability -- --nocapture ``` #### Comprehensive features (disabled) ```bash cd crates/e2e_test # Disabled due to AWS SDK compatibility gaps # cargo test test_comprehensive_kms_functionality -- --nocapture # cargo test test_sse_modes_compatibility -- --nocapture # cargo test test_kms_api_comprehensive -- --nocapture ``` ### Run all KMS suites ```bash cd crates/e2e_test cargo test kms -- --nocapture ``` ### Run serially (avoid port conflicts) ```bash cd crates/e2e_test cargo test kms -- --nocapture --test-threads=1 ``` ## 🔧 Configuration ### Environment variables ```bash # Optional: custom RustFS port (default 9050) export RUSTFS_TEST_PORT=9050 # Optional: custom Vault port (default 8200) export VAULT_TEST_PORT=8200 # Optional: enable verbose logging export RUST_LOG=debug ``` ### Required binaries Tests look for: - `../../target/debug/rustfs` – RustFS server - `vault` – Vault CLI (must be on PATH) - `/Users/dandan/Library/Python/3.9/bin/awscurl` – AWS SigV4 helper ## 📋 Test Flow ### Local backend 1. **Prepare environment** – create temporary directories and key storage paths 2. **Start RustFS** – launch the server with KMS enabled 3. **Wait for readiness** – confirm the port listener and S3 API 4. **Configure KMS** – send configuration via awscurl to the admin API 5. **Start KMS** – activate the KMS service 6. **Exercise functionality** - Create a test bucket - Run SSE-C encryption with client-provided keys - Validate encryption/decryption behavior 7. **Cleanup** – stop processes and remove temporary files ### Vault backend 1. **Launch Vault** – start the dev-mode server 2. **Configure Vault** - Enable the transit secrets engine - Create the `rustfs-master-key` 3. **Start RustFS** – run the server with KMS enabled 4. **Configure KMS** – point RustFS at Vault (address, token, transit config, key path) 5. **Exercise functionality** – complete the encryption/decryption workflow 6. **Cleanup** – stop all services ## 🛠️ Troubleshooting ### Common issues **Q: `RustFS server failed to become ready`** ```bash lsof -i :9050 kill -9 # Free the port if necessary ``` **Q: Vault fails to start** ```bash which vault vault version ``` **Q: awscurl authentication fails** ```bash ls /Users/dandan/Library/Python/3.9/bin/awscurl # Or install elsewhere pip install awscurl which awscurl # Update the path in tests accordingly ``` **Q: Tests time out** ```bash RUST_LOG=debug cargo test test_local_kms_end_to_end -- --nocapture ``` ### Debug tips 1. **Enable verbose logs** ```bash RUST_LOG=rustfs_kms=debug,rustfs=info cargo test -- --nocapture ``` 2. **Keep temporary files** – comment out cleanup logic to inspect generated configs 3. **Pause execution** – add `std::thread::sleep` for manual inspection during tests 4. **Monitor ports** ```bash netstat -an | grep 9050 curl http://127.0.0.1:9050/health/ready ``` ## 📊 Coverage ### Functional - ✅ Dynamic KMS configuration - ✅ Local and Vault backends - ✅ AWS S3-compatible encryption APIs - ✅ Key lifecycle management - ✅ Error handling and recovery paths - ✅ High-availability behavior ### Encryption modes - ✅ SSE-C (customer-provided) - ✅ SSE-S3 (S3-managed) - ✅ SSE-KMS (KMS-managed) ### S3 operations - ✅ Object upload/download (SSE-C) - 🚧 Multipart uploads (pending AWS SDK fixes) - 🚧 Object replication (pending AWS SDK fixes) - 🚧 Bucket encryption defaults (pending AWS SDK fixes) ### KMS API - ✅ Basic key management (create/list) - 🚧 Full key lifecycle (pending AWS SDK fixes) - 🚧 Direct encrypt/decrypt (pending AWS SDK fixes) - 🚧 Data key operations (pending AWS SDK fixes) - ✅ Service lifecycle (configure/start/stop/status) ### Authentication - ✅ Vault token auth - 🚧 Vault AppRole auth ## 🔄 CI Integration Designed to run inside CI/CD pipelines: ```yaml - name: Run KMS E2E Tests run: | sudo apt-get update sudo apt-get install -y vault pip install awscurl cargo build cd crates/e2e_test cargo test kms -- --nocapture --test-threads=1 ``` ## 📚 References - [KMS configuration types](../../../kms/src/config.rs) - [Dynamic configuration API handlers](../../../../rustfs/src/admin/handlers/kms_dynamic.rs) - [KMS management API handlers](../../../../rustfs/src/admin/handlers/kms_management.rs) --- *These suites ensure KMS stability and reliability, building confidence for production deployments.*