diff --git a/e2e/cephfs.go b/e2e/cephfs.go index 878a54038..53fb03eb5 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -395,11 +395,19 @@ var _ = Describe(cephfsType, func() { } validateSubvolumeCount(f, 1, fileSystemName, subvolumegroup) validateOmapCount(f, 1, cephfsType, metadataPool, volumesType) + pvcName := app.Spec.Volumes[0].Name // delete pod err = deletePod(app.Name, app.Namespace, f.ClientSet, deployTimeout) if err != nil { framework.Failf("failed to delete application: %v", err) } + + // wait for the associated PVC to be deleted + err = waitForPVCToBeDeleted(f.ClientSet, app.Namespace, pvcName, deployTimeout) + if err != nil { + framework.Failf("failed to wait for PVC deletion: %v", err) + } + validateSubvolumeCount(f, 0, fileSystemName, subvolumegroup) validateOmapCount(f, 0, cephfsType, metadataPool, volumesType) err = deleteResource(cephFSExamplePath + "storageclass.yaml") diff --git a/e2e/pvc.go b/e2e/pvc.go index fe4fb9cda..a067331a7 100644 --- a/e2e/pvc.go +++ b/e2e/pvc.go @@ -430,3 +430,35 @@ func getMetricsForPVC(f *framework.Framework, pvc *v1.PersistentVolumeClaim, t i return false, nil }) } + +func waitForPVCToBeDeleted(c kubernetes.Interface, namespace, pvcName string, t int) error { + timeout := time.Duration(t) * time.Minute + ctx := context.TODO() + start := time.Now() + + return wait.PollUntilContextTimeout(ctx, poll, timeout, true, func(ctx context.Context) (bool, error) { + pvc, err := c.CoreV1().PersistentVolumeClaims(namespace).Get(ctx, pvcName, metav1.GetOptions{}) + // Check that the PVC is really deleted. + framework.Logf( + "waiting for PVC %s in state %s to be deleted (%d seconds elapsed)", + pvcName, + pvc.Status.String(), + int(time.Since(start).Seconds())) + if err == nil { + framework.Logf("PVC %s (status: %s) has not been deleted yet, rechecking...", pvcName, pvc.Status) + + return false, nil + } + if isRetryableAPIError(err) { + framework.Logf("failed to verify deletion of PVC %s (status: %s): %v", pvcName, pvc.Status, err) + + return false, nil + } + if !apierrs.IsNotFound(err) { + return false, fmt.Errorf("get on deleted PVC %v failed with error other than \"not found\": %w", pvcName, err) + } + + // PVC has been successfully deleted + return true, nil + }) +} diff --git a/e2e/rbd.go b/e2e/rbd.go index 57d0c1b79..3361a39e5 100644 --- a/e2e/rbd.go +++ b/e2e/rbd.go @@ -813,10 +813,18 @@ var _ = Describe("RBD", func() { // validate created backend rbd images validateRBDImageCount(f, 1, defaultRBDPool) validateOmapCount(f, 1, rbdType, defaultRBDPool, volumesType) + pvcName := app.Spec.Volumes[0].Name err = deletePod(app.Name, app.Namespace, f.ClientSet, deployTimeout) if err != nil { framework.Failf("failed to delete application: %v", err) } + + // wait for the associated PVC to be deleted + err = waitForPVCToBeDeleted(f.ClientSet, app.Namespace, pvcName, deployTimeout) + if err != nil { + framework.Failf("failed to wait for PVC deletion: %v", err) + } + // validate created backend rbd images validateRBDImageCount(f, 0, defaultRBDPool) validateOmapCount(f, 0, rbdType, defaultRBDPool, volumesType)