mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-22 14:20:19 +00:00
e2e: add test cases for cephfs snapshot creation,deletion and restore
Signed-off-by: Humble Chirammal <hchiramm@redhat.com>
This commit is contained in:
parent
90762342a0
commit
074feddaf3
282
e2e/cephfs.go
282
e2e/cephfs.go
@ -3,7 +3,9 @@ package e2e
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
vs "github.com/kubernetes-csi/external-snapshotter/v2/pkg/apis/volumesnapshot/v1beta1"
|
||||||
. "github.com/onsi/ginkgo" // nolint
|
. "github.com/onsi/ginkgo" // nolint
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -163,6 +165,11 @@ var _ = Describe("cephfs", func() {
|
|||||||
It("Test cephfs CSI", func() {
|
It("Test cephfs CSI", func() {
|
||||||
pvcPath := cephfsExamplePath + "pvc.yaml"
|
pvcPath := cephfsExamplePath + "pvc.yaml"
|
||||||
appPath := cephfsExamplePath + "pod.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")
|
By("checking provisioner deployment is running")
|
||||||
var err error
|
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() {
|
By("Create ROX PVC and Bind it to an app", func() {
|
||||||
// create pvc and bind it to an app
|
// create pvc and bind it to an app
|
||||||
pvc, err := loadPVC(pvcPath)
|
pvc, err := loadPVC(pvcPath)
|
||||||
|
Loading…
Reference in New Issue
Block a user