* ci(nightly): persist the nightly deb on Cloudflare R2 Upload the deb to artifacts/rustfs/packages/nightly/ (dated name plus a rustfs-nightly-latest.deb alias) through the same R2 channel package.yml uses, so the nightly package can be downloaded later with a stable URL. The step is skipped when the R2 secrets are not configured, keeping the artifact-only mode intact. * test: add pool expansion / decommission E2E script and workflow Add the admin-API based pool expansion, rebalance and decommission test script (scripts/test/rustfs_pool_expand.sh) plus a workflow_dispatch / nightly workflow that runs it on a self-hosted runner against real nodes. The workflow accepts a release tag or a direct .deb URL (e.g. nightly/R2 package) via the package_url input. * ci(pool-test): run the pool expansion test on the smoke-testing runner
5.3 KiB
RustFS Pool Expansion / Decommission Test
End-to-end test for storage pool expansion, data rebalancing and
pool decommission, driven by
scripts/test/rustfs_pool_expand.sh.
All pool / rebalance / decommission checks talk to the RustFS admin API
directly with SigV4-signed HTTP requests and assert on the JSON responses
(jq), so the results are exact and independent of any client CLI output
formatting. rc is not required.
What it does
- Downloads the RustFS
.debpackage on all nodes (a release tag, or a direct URL such as a nightly/R2 package). - Installs it (
dpkg -i). - Starts the first pool and verifies it via
GET /rustfs/admin/v3/pools/list. - Writes data with
warpand monitors storage usage (GET /rustfs/admin/v3/storageinfo) until the threshold. - Expands to a second pool (nodes started in parallel).
- Starts rebalance (
POST /rustfs/admin/v3/rebalance/start) and waits for all pools to reportCompleted. - (3-pool mode) Expands to a third pool, rebalances again.
- (optional) Decommissions pool 0
(
POST /rustfs/admin/v3/pools/decommission), with automatic clear + retry on failure, and waits fordecommissionInfo.complete == true.
When an assertion fails, the script prints a per-pool summary and the full
JSON response (pool state, progress, failure counters, waitingReason,
unresolvedEntries, last rebalance error), so the GitHub Actions log shows
exactly where the test stopped. Credentials never appear in the logs.
Self-hosted runner prerequisites
- Register the admin host (e.g.
heal) as a runner with thesmoke-testinglabel. - Install
jq,openssl,curlandwarp(only needed for--with-warp) on the runner.rcis not required. - The runner user must be able to SSH to all nodes without a password prompt
(
~/.ssh/configwith keys). - The nodes need passwordless
sudofor the SSH user, resolvablerustfs-node*hostnames in/etc/hosts, and writable data directories. - The admin API credentials must have the
admin:server-info,admin:decommissionandadmin:rebalanceactions.
Configuration
Set these in the repository (secrets/variables):
| Kind | Name | Purpose |
|---|---|---|
| Secret | RUSTFS_ACCESS_KEY |
RustFS access key |
| Secret | RUSTFS_SECRET_KEY |
RustFS secret key |
| Var | RUSTFS_API_ENDPOINT |
Admin API endpoint, e.g. http://10.0.0.7:9000 (RUSTFS_RC_ENDPOINT is used as a fallback) |
| Var | RUSTFS_NODES |
Space-separated node names, e.g. vm000 vm001 vm002 |
| Var | RUSTFS_SSH_USER |
SSH user for the nodes, e.g. azureuser |
Workflow inputs
| Input | Default | Meaning |
|---|---|---|
rustfs_version |
1.0.0-rc.3 |
GitHub release tag to test |
package_url |
(empty) | Direct .deb URL (e.g. nightly/R2); overrides rustfs_version |
pools |
3 |
Expand to 2 or 3 pools |
storage_threshold |
50 |
Stop warp writes at N% usage |
warp_duration |
10m |
warp write duration |
run_decommission |
true |
Run decommission (3-pool mode only) |
cleanup_before |
true |
Reset nodes before the test |
cleanup_after |
true |
Reset nodes after the test |
⚠️
cleanup_before/cleanup_afterrun the script's--resetmode, which stops the services and deletes the data directories and config on all nodes. Only use this workflow against a dedicated test environment.
Manual usage
# Full workflow with a release tag
./scripts/test/rustfs_pool_expand.sh --all --with-warp -y \
--version 1.0.0-rc.3 --endpoint http://10.0.0.7:9000
# Use a direct .deb URL (e.g. nightly package on R2)
./scripts/test/rustfs_pool_expand.sh --all --with-warp -y \
--package-url https://dl.rustfs.com/artifacts/rustfs/packages/nightly/rustfs-nightly-latest.deb \
--endpoint http://10.0.0.7:9000
# Preflight / reset / single step
./scripts/test/rustfs_pool_expand.sh --preflight --version 1.0.0-rc.3
./scripts/test/rustfs_pool_expand.sh --reset -y
./scripts/test/rustfs_pool_expand.sh --step 9 --finalize-decommission -y
Known issues and caveats
- RustFS
1.0.0-rc.3fails decommission with a largewarp-written bucket ("metacache listing quorum failed / timeout"). If decommission repeatedly fails, reduce the written data (lowerstorage_threshold) or remove the test bucket, then re-run step 9. The script detects the failure, clears metadata and retriesDECOMMISSION_RETRIEStimes before giving up. - Multi-pool nodes must start simultaneously (the script does this) or the
first node dies with
not first disk. - The admin API is SigV4-signed (
host,x-amz-content-sha256: UNSIGNED-PAYLOAD,x-amz-date), matching the signer the RustFS server itself trusts. If the cluster requires a non-default region, setSIGV4_REGIONin the script.