Skip to content

Commit f0ad0b0

Browse files
committed
Allowing provisioning to proceed to prevent leaking resources
1 parent b84b08f commit f0ad0b0

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

pkg/controller/controller.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1160,8 +1160,10 @@ func (p *csiProvisioner) getSnapshotSource(ctx context.Context, claim *v1.Persis
11601160
return nil, fmt.Errorf("error getting snapshot %s from api server: %v", dataSource.Name, err)
11611161
}
11621162

1163+
// Allow the create volume request to proceed even if the snapshot is being deleted.
1164+
// This ensures proper cleanup of orphaned volumes and allows snapshot deletion to proceed.
11631165
if snapshotObj.ObjectMeta.DeletionTimestamp != nil {
1164-
return nil, fmt.Errorf("snapshot %s is currently being deleted", dataSource.Name)
1166+
klog.V(3).Infof("Snapshot %s/%s is being deleted, but allowing provisioning to proceed for potential cleanup", dataSource.Namespace, dataSource.Name)
11651167
}
11661168
klog.V(5).Infof("VolumeSnapshot %+v", snapshotObj)
11671169

pkg/controller/controller_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2963,6 +2963,7 @@ func TestProvisionFromSnapshot(t *testing.T) {
29632963
nilContentStatus bool
29642964
nilSnapshotHandle bool
29652965
allowVolumeModeChange bool
2966+
snapshotBeingDeleted bool // set DeletionTimestamp on snapshot
29662967
xnsEnabled bool // set to use CrossNamespaceVolumeDataSource feature, default false
29672968
snapNamespace string
29682969
withreferenceGrants bool // set to use ReferenceGrant, default false
@@ -4486,6 +4487,55 @@ func TestProvisionFromSnapshot(t *testing.T) {
44864487
referenceGrantFrom: []gatewayv1beta1.ReferenceGrantFrom{},
44874488
referenceGrantTo: []gatewayv1beta1.ReferenceGrantTo{},
44884489
},
4490+
"provision with snapshot being deleted should proceed for cleanup": {
4491+
volOpts: controller.ProvisionOptions{
4492+
StorageClass: &storagev1.StorageClass{
4493+
ReclaimPolicy: &deletePolicy,
4494+
Parameters: map[string]string{},
4495+
Provisioner: "test-driver",
4496+
},
4497+
PVName: "test-name",
4498+
PVC: &v1.PersistentVolumeClaim{
4499+
ObjectMeta: metav1.ObjectMeta{
4500+
UID: "testid",
4501+
Annotations: driverNameAnnotation,
4502+
},
4503+
Spec: v1.PersistentVolumeClaimSpec{
4504+
StorageClassName: &snapClassName,
4505+
Resources: v1.VolumeResourceRequirements{
4506+
Requests: v1.ResourceList{
4507+
v1.ResourceName(v1.ResourceStorage): resource.MustParse(strconv.FormatInt(requestedBytes, 10)),
4508+
},
4509+
},
4510+
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
4511+
DataSource: &v1.TypedLocalObjectReference{
4512+
Name: snapName,
4513+
Kind: "VolumeSnapshot",
4514+
APIGroup: &apiGrp,
4515+
},
4516+
},
4517+
},
4518+
},
4519+
snapshotStatusReady: true,
4520+
snapshotBeingDeleted: true,
4521+
expectedPVSpec: &pvSpec{
4522+
Name: "test-testi",
4523+
ReclaimPolicy: v1.PersistentVolumeReclaimDelete,
4524+
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
4525+
Capacity: v1.ResourceList{
4526+
v1.ResourceName(v1.ResourceStorage): bytesToQuantity(requestedBytes),
4527+
},
4528+
CSIPVS: &v1.CSIPersistentVolumeSource{
4529+
Driver: "test-driver",
4530+
VolumeHandle: "test-volume-id",
4531+
FSType: "ext4",
4532+
VolumeAttributes: map[string]string{
4533+
"storage.kubernetes.io/csiProvisionerIdentity": "test-provisioner",
4534+
},
4535+
},
4536+
},
4537+
expectCSICall: true,
4538+
},
44894539
}
44904540

44914541
tmpdir := tempDir(t)
@@ -4516,6 +4566,10 @@ func TestProvisionFromSnapshot(t *testing.T) {
45164566
if tc.nilReadyToUse {
45174567
snap.Status.ReadyToUse = nil
45184568
}
4569+
if tc.snapshotBeingDeleted {
4570+
deletionTime := metav1.Now()
4571+
snap.ObjectMeta.DeletionTimestamp = &deletionTime
4572+
}
45194573
return true, snap, nil
45204574
})
45214575

0 commit comments

Comments
 (0)