From 074feddaf3c6e00abcf079dd66288be1ce3fa959 Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Mon, 3 Aug 2020 23:18:24 +0530 Subject: [PATCH] e2e: add test cases for cephfs snapshot creation,deletion and restore Signed-off-by: Humble Chirammal --- e2e/cephfs.go | 282 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) diff --git a/e2e/cephfs.go b/e2e/cephfs.go index 4f4e65184..f47d796f2 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -3,7 +3,9 @@ package e2e import ( "fmt" "strings" + "sync" + vs "github.com/kubernetes-csi/external-snapshotter/v2/pkg/apis/volumesnapshot/v1beta1" . "github.com/onsi/ginkgo" // nolint v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -163,6 +165,11 @@ var _ = Describe("cephfs", func() { It("Test cephfs CSI", func() { pvcPath := cephfsExamplePath + "pvc.yaml" appPath := cephfsExamplePath + "pod.yaml" + pvcClonePath := cephfsExamplePath + "pvc-restore.yaml" + pvcSmartClonePath := cephfsExamplePath + "pvc-clone.yaml" + appClonePath := cephfsExamplePath + "pod-restore.yaml" + appSmartClonePath := cephfsExamplePath + "pod-clone.yaml" + snapshotPath := cephfsExamplePath + "snapshot.yaml" By("checking provisioner deployment is running") var err error @@ -362,6 +369,281 @@ var _ = Describe("cephfs", func() { } }) + By("create a PVC clone and bind it to an app", func() { + v, err := f.ClientSet.Discovery().ServerVersion() + if err != nil { + e2elog.Logf("failed to get server version with error %v", err) + Fail(err.Error()) + } + // snapshot beta is only supported from v1.17+ + if v.Major > "1" || (v.Major == "1" && v.Minor >= "17") { + var wg sync.WaitGroup + totalCount := 3 + wg.Add(totalCount) + createCephFSSnapshotClass(f) + pvc, err := loadPVC(pvcPath) + if err != nil { + Fail(err.Error()) + } + + pvc.Namespace = f.UniqueName + e2elog.Logf("The PVC template %+v", pvc) + err = createPVCAndvalidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + Fail(err.Error()) + } + + snap := getSnapshot(snapshotPath) + snap.Namespace = f.UniqueName + snap.Spec.Source.PersistentVolumeClaimName = &pvc.Name + // create snapshot + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, s vs.VolumeSnapshot) { + s.Name = fmt.Sprintf("%s%d", f.UniqueName, n) + err = createSnapshot(&s, deployTimeout) + if err != nil { + e2elog.Logf("failed to create snapshot %v", err) + Fail(err.Error()) + } + w.Done() + }(&wg, i, snap) + } + wg.Wait() + + pvcClone, err := loadPVC(pvcClonePath) + if err != nil { + Fail(err.Error()) + } + appClone, err := loadApp(appClonePath) + if err != nil { + Fail(err.Error()) + } + pvcClone.Namespace = f.UniqueName + appClone.Namespace = f.UniqueName + pvcClone.Spec.DataSource.Name = fmt.Sprintf("%s%d", f.UniqueName, 0) + + // create multiple PVC from same snapshot + wg.Add(totalCount) + for i := 0; i < totalCount; i++ { + + go func(w *sync.WaitGroup, n int, p v1.PersistentVolumeClaim, a v1.Pod) { + name := fmt.Sprintf("%s%d", f.UniqueName, n) + err = createPVCAndApp(name, f, &p, &a, deployTimeout) + if err != nil { + e2elog.Logf("failed to create pvc and app %v", err) + Fail(err.Error()) + } + w.Done() + }(&wg, i, *pvcClone, *appClone) + } + wg.Wait() + + wg.Add(totalCount) + // delete clone and app + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, p v1.PersistentVolumeClaim, a v1.Pod) { + name := fmt.Sprintf("%s%d", f.UniqueName, n) + p.Spec.DataSource.Name = name + err = deletePVCAndApp(name, f, &p, &a) + if err != nil { + e2elog.Logf("failed to delete pvc and app %v", err) + Fail(err.Error()) + } + w.Done() + }(&wg, i, *pvcClone, *appClone) + } + wg.Wait() + + // create clones from different snapshosts and bind it to an + // app + wg.Add(totalCount) + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, p v1.PersistentVolumeClaim, a v1.Pod) { + name := fmt.Sprintf("%s%d", f.UniqueName, n) + p.Spec.DataSource.Name = name + err = createPVCAndApp(name, f, &p, &a, deployTimeout) + if err != nil { + e2elog.Logf("failed to create pvc and app %v", err) + Fail(err.Error()) + } + w.Done() + }(&wg, i, *pvcClone, *appClone) + } + wg.Wait() + + wg.Add(totalCount) + // delete snapshot + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, s vs.VolumeSnapshot) { + s.Name = fmt.Sprintf("%s%d", f.UniqueName, n) + err = deleteSnapshot(&s, deployTimeout) + if err != nil { + e2elog.Logf("failed to delete snapshot %v", err) + Fail(err.Error()) + } + w.Done() + }(&wg, i, snap) + } + wg.Wait() + + wg.Add(totalCount) + // delete clone and app + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, p v1.PersistentVolumeClaim, a v1.Pod) { + name := fmt.Sprintf("%s%d", f.UniqueName, n) + p.Spec.DataSource.Name = name + err = deletePVCAndApp(name, f, &p, &a) + if err != nil { + e2elog.Logf("failed to delete pvc and app %v", err) + Fail(err.Error()) + } + w.Done() + }(&wg, i, *pvcClone, *appClone) + } + wg.Wait() + + // delete parent pvc + err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + Fail(err.Error()) + } + } + }) + + By("create a PVC-PVC clone and bind it to an app", func() { + v, err := f.ClientSet.Discovery().ServerVersion() + if err != nil { + e2elog.Logf("failed to get server version with error %v", err) + Fail(err.Error()) + } + // pvc clone is only supported from v1.16+ + if v.Major > "1" || (v.Major == "1" && v.Minor >= "16") { + var wg sync.WaitGroup + totalCount := 3 + pvc, err := loadPVC(pvcPath) + if err != nil { + Fail(err.Error()) + } + + pvc.Namespace = f.UniqueName + err = createPVCAndvalidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + Fail(err.Error()) + } + + pvcClone, err := loadPVC(pvcSmartClonePath) + if err != nil { + Fail(err.Error()) + } + pvcClone.Spec.DataSource.Name = pvc.Name + pvcClone.Namespace = f.UniqueName + appClone, err := loadApp(appSmartClonePath) + if err != nil { + Fail(err.Error()) + } + appClone.Namespace = f.UniqueName + wg.Add(totalCount) + // create clone and bind it to an app + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, p v1.PersistentVolumeClaim, a v1.Pod) { + name := fmt.Sprintf("%s%d", f.UniqueName, n) + err = createPVCAndApp(name, f, &p, &a, deployTimeout) + if err != nil { + Fail(err.Error()) + } + w.Done() + }(&wg, i, *pvcClone, *appClone) + } + wg.Wait() + // delete parent pvc + err = deletePVCAndValidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + Fail(err.Error()) + } + + wg.Add(totalCount) + // delete clone and app + for i := 0; i < totalCount; i++ { + go func(w *sync.WaitGroup, n int, p v1.PersistentVolumeClaim, a v1.Pod) { + name := fmt.Sprintf("%s%d", f.UniqueName, n) + p.Spec.DataSource.Name = name + err = deletePVCAndApp(name, f, &p, &a) + if err != nil { + Fail(err.Error()) + } + w.Done() + }(&wg, i, *pvcClone, *appClone) + } + wg.Wait() + } + }) + + By("populate source volume, create a PVC-PVC clone and bind it to an app", func() { + v, err := f.ClientSet.Discovery().ServerVersion() + if err != nil { + e2elog.Logf("failed to get server version with error %v", err) + Fail(err.Error()) + } + // pvc clone is only supported from v1.16+ + if v.Major > "1" || (v.Major == "1" && v.Minor >= "16") { + pvc, err := loadPVC(pvcPath) + if err != nil { + Fail(err.Error()) + } + app, err := loadApp(appPath) + if err != nil { + Fail(err.Error()) + } + err = createPVCAndvalidatePV(f.ClientSet, pvc, deployTimeout) + if err != nil { + Fail(err.Error()) + } + pvc.Namespace = f.UniqueName + wErr := writeDataInPod(app, f) + if wErr != nil { + Fail(wErr.Error()) + } + + pvcClone, err := loadPVC(pvcSmartClonePath) + if err != nil { + Fail(err.Error()) + } + pvcClone.Spec.DataSource.Name = pvc.Name + pvcClone.Namespace = f.UniqueName + appClone, err := loadApp(appSmartClonePath) + if err != nil { + Fail(err.Error()) + } + appClone.Namespace = f.UniqueName + totalCount := 1 + // create clone and bind it to an app + for i := 0; i < totalCount; i++ { + name := fmt.Sprintf("%s%d", f.UniqueName, i) + err = createPVCAndApp(name, f, pvcClone, appClone, deployTimeout) + if err != nil { + Fail(err.Error()) + } + } + + // delete parent pvc + err = deletePVCAndApp("", f, pvc, app) + if err != nil { + Fail(err.Error()) + } + + // delete clone and app + for i := 0; i < totalCount; i++ { + name := fmt.Sprintf("%s%d", f.UniqueName, i) + pvcClone.Spec.DataSource.Name = name + err = deletePVCAndApp(name, f, pvcClone, appClone) + if err != nil { + Fail(err.Error()) + } + } + + } + }) + By("Create ROX PVC and Bind it to an app", func() { // create pvc and bind it to an app pvc, err := loadPVC(pvcPath)