From 50639b9dd5e23d4951ab30440ec79cb61230af62 Mon Sep 17 00:00:00 2001 From: Rakshith R Date: Fri, 29 Mar 2024 15:26:02 +0530 Subject: [PATCH 1/2] rbd: add ParentInTrash parameter in rbdImage struct This commit adds ParentInTrash parameter in rbdImage struct and makes use of it in getParent() function in order to avoid error in case the parent is present but in trash. Signed-off-by: Rakshith R (cherry picked from commit c34b31ee05d56e7fcf0597f42b7ed5e2913a3cfd) --- internal/rbd/rbd_util.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index 31b330b4d37..b654db4d233 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -146,6 +146,8 @@ type rbdImage struct { // Set metadata on volume EnableMetadata bool + // ParentInTrash indicates the parent image is in trash. + ParentInTrash bool } // rbdVolume represents a CSI volume and its RBD image specifics. @@ -1613,6 +1615,7 @@ func (ri *rbdImage) getImageInfo() error { } else { ri.ParentName = parentInfo.Image.ImageName ri.ParentPool = parentInfo.Image.PoolName + ri.ParentInTrash = parentInfo.Image.Trash } // Get image creation time tm, err := image.GetCreateTimestamp() @@ -1631,7 +1634,9 @@ func (ri *rbdImage) getParent() (*rbdImage, error) { if err != nil { return nil, err } - if ri.ParentName == "" { + // The image may not have a parent or the parent maybe in trash. + // Return nil in both the cases. + if ri.ParentName == "" || ri.ParentInTrash { return nil, nil } From c329481218a6b209109dc53077867895fdc0784e Mon Sep 17 00:00:00 2001 From: Rakshith R Date: Fri, 29 Mar 2024 15:06:01 +0530 Subject: [PATCH 2/2] e2e: validate PVC-PVC clone creation with deleted parent snap This commit modifies a test case to check creation of PVC-PVC clone of a restored PVC when parent snapshot is deleted. Signed-off-by: Rakshith R (cherry picked from commit 1bb78fdf43c17bd33c13028995c83d21bfe053d9) --- e2e/rbd.go | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/e2e/rbd.go b/e2e/rbd.go index c8b71817b36..d07370e39ff 100644 --- a/e2e/rbd.go +++ b/e2e/rbd.go @@ -3552,7 +3552,7 @@ var _ = Describe("RBD", func() { validateRBDImageCount(f, 1, defaultRBDPool) validateOmapCount(f, 1, rbdType, defaultRBDPool, volumesType) for i := 0; i < snapChainDepth; i++ { - var pvcClone *v1.PersistentVolumeClaim + var pvcClone, smartClonePVC *v1.PersistentVolumeClaim snap := getSnapshot(snapshotPath) snap.Name = fmt.Sprintf("%s-%d", snap.Name, i) snap.Namespace = f.UniqueName @@ -3609,6 +3609,41 @@ var _ = Describe("RBD", func() { validateOmapCount(f, 1, rbdType, defaultRBDPool, volumesType) validateOmapCount(f, 0, rbdType, defaultRBDPool, snapsType) + // create pvc-pvc clone to validate pvc-pvc clone creation + // of child PVC created from a snapshot which no longer exits. + // Snapshot-> restore PVC -> delete Snapshot -> PVC-PVC clone. + smartClonePVC, err = loadPVC(pvcSmartClonePath) + if err != nil { + framework.Failf("failed to load smart clone PVC: %v", err) + } + + smartClonePVC.Name = fmt.Sprintf("%s-%d", smartClonePVC.Name, i) + smartClonePVC.Namespace = f.UniqueName + smartClonePVC.Spec.DataSource.Name = pvcClone.Name + err = createPVCAndvalidatePV(f.ClientSet, smartClonePVC, deployTimeout) + if err != nil { + framework.Failf("failed to create smart clone PVC %q: %v", + smartClonePVC.Name, err) + } + + // validate created backend rbd images = clone + smart clone + temp image + totalImages = 3 + validateRBDImageCount(f, totalImages, defaultRBDPool) + validateOmapCount(f, 2, rbdType, defaultRBDPool, volumesType) + validateOmapCount(f, 0, rbdType, defaultRBDPool, snapsType) + + err = deletePVCAndValidatePV(f.ClientSet, smartClonePVC, deployTimeout) + if err != nil { + framework.Failf("failed to delete smart clone PVC %q: %v", + smartClonePVC.Name, err) + } + + // validate created backend rbd images = clone + totalImages = 1 + validateRBDImageCount(f, totalImages, defaultRBDPool) + validateOmapCount(f, 1, rbdType, defaultRBDPool, volumesType) + validateOmapCount(f, 0, rbdType, defaultRBDPool, snapsType) + app.Spec.Volumes[0].PersistentVolumeClaim.ClaimName = pvcClone.Name // create application err = createApp(f.ClientSet, app, deployTimeout)