mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-11 23:56:53 +00:00
ci(ilm): add gated s3-tests lane for lifecycle expiration cases (#4715)
* ci(ilm): move first batch of 5 s3-tests lifecycle expiration cases into a gated behavior lane (backlog#1148 ilm-10)
The 20 lifecycle cases in excluded_tests.txt were labeled "vendor-specific"
but the real blocker was the absence of a Ceph lc_debug_interval equivalent.
RUSTFS_ILM_DEBUG_DAY_SECS (ilm-5) now provides that, so Days>=1 expiration
behavior is testable in seconds.
These cases assert that objects/versions/uploads are actually removed by the
background scanner and the stale-multipart cleanup loop. They cannot join the
default single-server s3-implemented-tests gate: it disables the scanner, and a
global RUSTFS_ILM_DEBUG_DAY_SECS also shrinks the x-amz-expiration header that
the already-passing test_lifecycle_expiration_header_* cases assert on. So this
adds an isolated lane instead of putting them in implemented_tests.txt.
First batch (5), each verified against the pinned upstream source and the
RustFS evaluator/scanner/stale-multipart execution paths:
- test_lifecycle_expiration (prefix Days=1/Days=5, scanner delete)
- test_lifecyclev2_expiration (same via ListObjectsV2)
- test_lifecycle_noncur_expiration (NoncurrentVersionExpiration)
- test_lifecycle_deletemarker_expiration (ExpiredObjectDeleteMarker cascade)
- test_lifecycle_multipart_expiration (AbortIncompleteMultipartUpload)
Dropped from the batch, kept excluded with reason:
- test_lifecycle_expiration_days0: RustFS accepts Expiration{Days:0} (returns
200; only Days<0 is rejected in crates/lifecycle/src/core.rs validate()),
while AWS/this test expect InvalidArgument. Real validation gap.
Changes:
- scripts/s3-tests/lifecycle_behavior_tests.txt: new exact-node-id run set.
- scripts/s3-tests/run.sh: honor an IMPLEMENTED_TESTS_FILE override so a lane
can point at an alternate whitelist.
- .github/workflows/ci.yml: new s3-lifecycle-behavior-tests PR-gate job that
starts rustfs with RUSTFS_ILM_DEBUG_DAY_SECS=10, scanner enabled (cycle 2s,
no start delay) and a 2s stale-multipart cleanup interval, running the new
list serially.
- scripts/s3-tests/report_compat.py: recognize the behavior list so the weekly
scope=all sweep (plain server) does not misclassify expected failures.
- scripts/s3-tests/excluded_tests.txt: remove the 5 enabled cases; re-annotate
the remaining 15 lifecycle exclusions with real reasons + batch-2 plan.
- docs/architecture/s3-compatibility-matrix.md: sync counts (implemented 451,
excluded 274, behavior 5) and document the lane.
Refs backlog#1148 (ilm-10), master plan backlog#1155.
* fix(lifecycle): reject zero-day expiration/noncurrent/abort rules (backlog#1148 ilm-10) (#4722)
This commit is contained in:
@@ -157,26 +157,47 @@ test_encryption_sse_c_multipart_invalid_chunks_1
|
||||
test_encryption_sse_c_multipart_invalid_chunks_2
|
||||
test_get_multipart_checksum_object_attributes
|
||||
test_head_bucket_usage
|
||||
test_lifecycle_cloud_multiple_transition
|
||||
test_lifecycle_cloud_transition
|
||||
test_lifecycle_cloud_transition_large_obj
|
||||
test_lifecycle_deletemarker_expiration
|
||||
# -----------------------------------------------------------------------------
|
||||
# Lifecycle behavior (backlog#1148 ilm-10, master plan #1155)
|
||||
#
|
||||
# The upstream "Vendor-specific" label on these was inaccurate: the real blocker
|
||||
# was the absence of a Ceph `lc_debug_interval` equivalent, so Days>=1 expiration
|
||||
# behavior could not be exercised in seconds. RUSTFS_ILM_DEBUG_DAY_SECS (ilm-5)
|
||||
# now provides that. The first batch of expiration tests has been moved into the
|
||||
# dedicated behavior lane: scripts/s3-tests/lifecycle_behavior_tests.txt
|
||||
# (run by the ci.yml job `s3-lifecycle-behavior-tests`). The entries below are
|
||||
# NOT vendor-specific — they stay excluded from the DEFAULT single-server gate
|
||||
# for the specific reasons noted, and are queued for later batches.
|
||||
#
|
||||
# --- Batch 2 candidates: expiration with tag / size filters + noncurrent counts.
|
||||
# These need the same debug/scanner lane as batch 1 plus tag/size-filter and
|
||||
# NewerNoncurrentVersions coverage (see ilm-9). Queued for ilm-10 batch 2.
|
||||
test_lifecycle_deletemarker_expiration_with_days_tag
|
||||
test_lifecycle_expiration
|
||||
test_lifecycle_expiration_days0
|
||||
test_lifecycle_expiration_newer_noncurrent
|
||||
test_lifecycle_expiration_noncur_tags1
|
||||
test_lifecycle_expiration_size_gt
|
||||
test_lifecycle_expiration_size_lt
|
||||
test_lifecycle_expiration_tags2
|
||||
test_lifecycle_expiration_versioned_tags2
|
||||
test_lifecycle_multipart_expiration
|
||||
test_lifecycle_noncur_cloud_transition
|
||||
test_lifecycle_noncur_expiration
|
||||
#
|
||||
# --- Storage-class transition to a remote/warm tier. Needs a real tier backend
|
||||
# (the hermetic second-RustFS cold layer from ilm-7) which is not wired into
|
||||
# the s3-tests topology. Queued behind ilm-7.
|
||||
test_lifecycle_noncur_transition
|
||||
test_lifecycle_transition
|
||||
#
|
||||
# --- Single-rule multi-level Transition (hot->warm->cold). RustFS only honors
|
||||
# transitions.first() (core.rs:676); multi-level semantics are undecided and
|
||||
# tracked as a product item (ex-ilm-20). Do not enable until that lands.
|
||||
test_lifecycle_transition_single_rule_multi_trans
|
||||
test_lifecyclev2_expiration
|
||||
#
|
||||
# --- Cloud (S3/remote) transition + restore. Requires the [s3 cloud] endpoint
|
||||
# the RustFS SNSD harness does not provision; depends on ilm-7 tier carrier.
|
||||
test_lifecycle_cloud_multiple_transition
|
||||
test_lifecycle_cloud_transition
|
||||
test_lifecycle_cloud_transition_large_obj
|
||||
test_lifecycle_noncur_cloud_transition
|
||||
# -----------------------------------------------------------------------------
|
||||
test_list_buckets_anonymous
|
||||
test_list_buckets_paginated
|
||||
test_list_multipart_upload
|
||||
|
||||
Reference in New Issue
Block a user