From 9b6921b05b6c64227bc56c4b8a1f8a448ca801a6 Mon Sep 17 00:00:00 2001 From: akalenyu Date: Tue, 21 Mar 2023 06:25:13 +0200 Subject: [PATCH] Follow up for WFFC test suite adjustments (#2633) * Follow up for WFFC test suite adjustments Previous PR does not make our test suite completely WFFC-friendly, as it turns out more follow ups were needed. Signed-off-by: Alex Kalenyuk * Change restartpolicy on testing pods to rerun on failure This dates back a long time ago (5yrs), it seems that we may want to restart on intermediate errs Signed-off-by: Alex Kalenyuk --------- Signed-off-by: Alex Kalenyuk --- tests/cloner_test.go | 18 +++++++++++------- tests/csiclone_test.go | 19 ++++++++++++++++--- tests/datavolume_test.go | 1 + tests/external_population_test.go | 6 +++++- tests/framework/pvc.go | 2 +- tests/import_test.go | 1 + tests/smartclone_test.go | 1 + 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/tests/cloner_test.go b/tests/cloner_test.go index 6f2b19eba0..83d15627e6 100644 --- a/tests/cloner_test.go +++ b/tests/cloner_test.go @@ -492,6 +492,7 @@ var _ = Describe("all clone tests", func() { Expect(err).ToNot(HaveOccurred()) targetPvc, err := utils.WaitForPVC(f.K8sClient, targetDataVolume.Namespace, targetDataVolume.Name) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(targetDataVolume) By("Wait for target PVC Bound phase") utils.WaitForPersistentVolumeClaimPhase(f.K8sClient, f.Namespace.Name, v1.ClaimBound, targetPvc.Name) @@ -585,10 +586,11 @@ var _ = Describe("all clone tests", func() { targetDV := utils.NewDataVolumeCloneToBlockPVStorageAPI("target-dv", "2Gi", sourcePvc.Namespace, sourcePvc.Name, f.BlockSCName) - tagretDataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, targetDV) + targetDataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, targetDV) Expect(err).ToNot(HaveOccurred()) - targetPvc, err := utils.WaitForPVC(f.K8sClient, tagretDataVolume.Namespace, tagretDataVolume.Name) + targetPvc, err := utils.WaitForPVC(f.K8sClient, targetDataVolume.Namespace, targetDataVolume.Name) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(targetDataVolume) By("Wait for target PVC Bound phase") utils.WaitForPersistentVolumeClaimPhase(f.K8sClient, f.Namespace.Name, v1.ClaimBound, targetPvc.Name) @@ -685,11 +687,7 @@ var _ = Describe("all clone tests", func() { targetDv, err = utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, targetDv) Expect(err).ToNot(HaveOccurred()) - // As of now, csi and smart clone check the values before the pvc is created, and the network clone - // checks it in the upload phase, so it needs a PVC, this might be improved - if cloneType == "network" { - f.ForceBindPvcIfDvIsWaitForFirstConsumer(targetDv) - } + f.ForceBindPvcIfDvIsWaitForFirstConsumer(targetDv) f.ExpectEvent(f.Namespace.Name).Should(ContainSubstring(controller.ErrIncompatiblePVC)) }) @@ -1934,6 +1932,7 @@ var _ = Describe("all clone tests", func() { controller.AddAnnotation(targetDV, controller.AnnDeleteAfterCompletion, "false") dataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, targetNs.Name, targetDV) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) targetPvc, err := utils.WaitForPVC(f.K8sClient, dataVolume.Namespace, dataVolume.Name) Expect(err).ToNot(HaveOccurred()) @@ -2644,6 +2643,11 @@ var _ = Describe("all clone tests", func() { var i int var err error + defaultSc := utils.DefaultStorageClass.GetName() + if crossNamespace && f.IsBindingModeWaitForFirstConsumer(&defaultSc) { + Skip("only host assisted is applicable with WFFC cross namespace") + } + targetNs := f.Namespace if crossNamespace { targetNamespace, err = f.CreateNamespace("cdi-cross-ns-snapshot-clone-test", nil) diff --git a/tests/csiclone_test.go b/tests/csiclone_test.go index aacf757145..243bc9bc59 100644 --- a/tests/csiclone_test.go +++ b/tests/csiclone_test.go @@ -1,11 +1,13 @@ package tests import ( + "context" "fmt" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" cc "kubevirt.io/containerized-data-importer/pkg/controller/common" @@ -50,12 +52,13 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component][crit:high][rfe_id: utils.ConfigureCloneStrategy(f.CrClient, f.CdiClient, f.CsiCloneSCName, originalProfileSpec, cdiv1.CloneStrategyCsiClone) dataVolume, md5 := createDataVolume("dv-csi-clone-test-1", utils.DefaultImagePath, v1.PersistentVolumeFilesystem, f.CsiCloneSCName, f) - f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(string(cdiv1.CSICloneInProgress))) // Wait for operation Succeeded waitForDvPhase(cdiv1.Succeeded, dataVolume, f) f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.CloneSucceeded)) // Verify PVC's content verifyPVC(dataVolume, f, utils.DefaultImagePath, md5) + // Verify csi clone took place + verifyCSIClone(dataVolume, f) }) It("Verify DataVolume CSI Cloning - volumeMode block - Positive flow", func() { @@ -67,12 +70,13 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component][crit:high][rfe_id: utils.ConfigureCloneStrategy(f.CrClient, f.CdiClient, f.CsiCloneSCName, originalProfileSpec, cdiv1.CloneStrategyCsiClone) dataVolume, expectedMd5 := createDataVolume("dv-csi-clone-test-1", utils.DefaultPvcMountPath, v1.PersistentVolumeBlock, f.CsiCloneSCName, f) - f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.CSICloneInProgress)) // Wait for operation Succeeded waitForDvPhase(cdiv1.Succeeded, dataVolume, f) f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.CloneSucceeded)) // Verify PVC's content verifyPVC(dataVolume, f, utils.DefaultPvcMountPath, expectedMd5) + // Verify csi clone took place + verifyCSIClone(dataVolume, f) }) It("[posneg:negative][test_id:6655] Support for CSI Clone strategy in storage profile with SC HPP - negative", func() { @@ -126,12 +130,14 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component][crit:high][rfe_id: Expect(err).ToNot(HaveOccurred()) By("Verify clone completed after quota increase") - f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(string(cdiv1.CSICloneInProgress))) // Wait for operation Succeeded + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) waitForDvPhase(cdiv1.Succeeded, dataVolume, f) f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.CloneSucceeded)) // Verify PVC's content verifyPVC(dataVolume, f, utils.DefaultImagePath, md5) + // Verify csi clone took place + verifyCSIClone(dataVolume, f) err = f.DeleteStorageQuota() Expect(err).ToNot(HaveOccurred()) @@ -158,3 +164,10 @@ func createDataVolumeDontWait(dataVolumeName, testPath string, volumeMode v1.Per return dataVolume, md5 } + +func verifyCSIClone(dataVolume *cdiv1.DataVolume, f *framework.Framework) { + targetPvc, err := f.K8sClient.CoreV1().PersistentVolumeClaims(dataVolume.Namespace).Get(context.TODO(), dataVolume.Name, metav1.GetOptions{}) + Expect(err).ToNot(HaveOccurred()) + Expect(targetPvc.Spec.DataSource.Kind).To(Equal("PersistentVolumeClaim")) + Expect(targetPvc.Spec.DataSourceRef.Kind).To(Equal("PersistentVolumeClaim")) +} diff --git a/tests/datavolume_test.go b/tests/datavolume_test.go index f7ac7b0654..993f16352d 100644 --- a/tests/datavolume_test.go +++ b/tests/datavolume_test.go @@ -1358,6 +1358,7 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component]DataVolume tests", By(fmt.Sprintf("creating new datavolume %s", dataVolume.Name)) dataVolume, err = utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, dataVolume) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) By(fmt.Sprintf("waiting for datavolume to match phase %s", string(phase))) err = utils.WaitForDataVolumePhase(f, f.Namespace.Name, phase, dataVolume.Name) diff --git a/tests/external_population_test.go b/tests/external_population_test.go index e755ca25f5..f6542200d3 100644 --- a/tests/external_population_test.go +++ b/tests/external_population_test.go @@ -141,6 +141,7 @@ var _ = Describe("Population tests", func() { controller.AddAnnotation(dataVolume, controller.AnnDeleteAfterCompletion, "false") dataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, dataVolume) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) By("Verifying pvc was created") pvc, err := utils.WaitForPVC(f.K8sClient, dataVolume.Namespace, dataVolume.Name) @@ -249,6 +250,7 @@ var _ = Describe("Population tests", func() { controller.AddAnnotation(dataVolume, controller.AnnDeleteAfterCompletion, "false") dataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, dataVolume) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) By("Verifying pvc was created") targetPvc, err := utils.WaitForPVC(f.K8sClient, dataVolume.Namespace, dataVolume.Name) @@ -320,10 +322,12 @@ var _ = Describe("Population tests", func() { }, timeout, pollingInterval).Should(BeTrue()) By(fmt.Sprintf("Creating target datavolume %s", dataVolumeName)) - dataVolume := utils.NewDataVolumeWithExternalPopulationAndStorageSpec(dataVolumeName, "100Mi", f.SnapshotSCName, corev1.PersistentVolumeMode(corev1.PersistentVolumeFilesystem), dataSource, nil) + // PVC API because some provisioners only allow exact match between source size and restore size + dataVolume := utils.NewDataVolumeWithExternalPopulation(dataVolumeName, snapshot.Status.RestoreSize.String(), f.SnapshotSCName, corev1.PersistentVolumeMode(corev1.PersistentVolumeFilesystem), dataSource, nil) controller.AddAnnotation(dataVolume, controller.AnnDeleteAfterCompletion, "false") dataVolume, err = utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, dataVolume) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) By("Verifying pvc was created") targetPvc, err := utils.WaitForPVC(f.K8sClient, dataVolume.Namespace, dataVolume.Name) diff --git a/tests/framework/pvc.go b/tests/framework/pvc.go index b56009e2e7..caaeb8abea 100644 --- a/tests/framework/pvc.go +++ b/tests/framework/pvc.go @@ -370,7 +370,7 @@ func (f *Framework) NewPodWithPVC(podName, cmd string, pvc *k8sv1.PersistentVolu Spec: k8sv1.PodSpec{ // this may be causing an issue TerminationGracePeriodSeconds: &[]int64{10}[0], - RestartPolicy: k8sv1.RestartPolicyNever, + RestartPolicy: k8sv1.RestartPolicyOnFailure, Containers: []k8sv1.Container{ { Name: "runner", diff --git a/tests/import_test.go b/tests/import_test.go index 1d2ebe6e40..a2b33dc7b4 100644 --- a/tests/import_test.go +++ b/tests/import_test.go @@ -621,6 +621,7 @@ var _ = Describe("Importer Test Suite-Block_device", func() { dataVolume.Annotations[controller.AnnPodRetainAfterCompletion] = "true" dataVolume, err := utils.CreateDataVolumeFromDefinition(f.CdiClient, f.Namespace.Name, dataVolume) Expect(err).ToNot(HaveOccurred()) + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) var importer *v1.Pod By("Find importer pod") diff --git a/tests/smartclone_test.go b/tests/smartclone_test.go index 823a42f9ee..a8529eedc6 100644 --- a/tests/smartclone_test.go +++ b/tests/smartclone_test.go @@ -137,6 +137,7 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component]SmartClone tests", f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.SnapshotForSmartCloneInProgress)) f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.SmartClonePVCInProgress)) // Wait for operation Succeeded + f.ForceBindPvcIfDvIsWaitForFirstConsumer(dataVolume) waitForDvPhase(cdiv1.Succeeded, dataVolume, f) f.ExpectEvent(dataVolume.Namespace).Should(ContainSubstring(controller.CloneSucceeded)) // Verify PVC's content