Add snapshot limit enforcement for WCP with per-volume serialization #3745
+623
−5
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What this PR does / why we need it:
This PR implements snapshot limit enforcement for WCP environments to prevent users from exceeding a configurable maximum number of snapshots per volume.
What's Changed:
csi.vsphere.max-snapshots-per-volumesnapshot-limit-wcpFSS flagHow it Works:
When creating a snapshot, the driver queries existing snapshots for the volume and checks against the configured limit. If the limit would be exceeded, the request is rejected with a FailedPrecondition error. Per-volume locking ensures that concurrent snapshot requests are serialized to prevent race conditions where multiple requests could bypass the limit check.
Which issue this PR fixes (optional, in
fixes #<issue number>(, fixes #<issue_number>, ...)format, will close that issue when PR gets merged): fixes #Testing done:
Unit tests.
Unit Tests Added
TestGetSnapshotLimitFromNamespace - Tests for snapshot limit configuration:
WhenAnnotationExists_ValidValue- Reads valid limit from namespace annotationWhenAnnotationExists_ValueEqualsMax- Handles limit set to maximum (32)WhenAnnotationExists_ValueExceedsMax- Caps values exceeding 32 with warningWhenAnnotationExists_ValueIsZero- Allows zero limit (disabled)WhenAnnotationExists_ValueIsNegative- Rejects negative valuesWhenAnnotationExists_InvalidFormat- Handles non-numeric annotation valuesWhenAnnotationMissing- Uses default limit (4) when annotation is missingWhenNamespaceNotFound- Handles namespace lookup failuresWhenK8sClientCreationFails- Handles K8s client initialization errorsTestSnapshotLockManager - Tests for per-volume lock management:
AcquireAndRelease_SingleVolume- Basic lock lifecycleAcquireMultipleTimes_SameVolume- Multiple goroutines serialized properlyAcquireRelease_MultipleVolumes- Independent locks for different volumesConcurrentAccess_SameVolume- Concurrent requests properly serializedReleaseNonExistentLock- Graceful handling of invalid releasesSpecial notes for your reviewer:
Release note: