diff --git a/e2e/cephfs.go b/e2e/cephfs.go index eb1d553b6aa..388d6b1a650 100644 --- a/e2e/cephfs.go +++ b/e2e/cephfs.go @@ -279,6 +279,7 @@ var _ = Describe("cephfs", func() { appClonePath := cephFSExamplePath + "pod-restore.yaml" appSmartClonePath := cephFSExamplePath + "pod-clone.yaml" snapshotPath := cephFSExamplePath + "snapshot.yaml" + appEphemeralPath := cephFSExamplePath + "pod-ephemeral.yaml" By("checking provisioner deployment is running", func() { err := waitForDeploymentComplete(cephFSDeploymentName, cephCSINamespace, f.ClientSet, deployTimeout) @@ -312,6 +313,37 @@ var _ = Describe("cephfs", func() { } }) } + By("verify generic ephemeral volume support", func() { + // generic ephemeral volume support is beta since v1.21. + if !k8sVersionGreaterEquals(f.ClientSet, 1, 21) { + Skip("generic ephemeral volume only supported from v1.21+") + } + err := createCephfsStorageClass(f.ClientSet, f, true, nil) + if err != nil { + e2elog.Failf("failed to create CephFS storageclass: %v", err) + } + // create application + app, err := loadApp(appEphemeralPath) + if err != nil { + e2elog.Failf("failed to load application: %v", err) + } + app.Namespace = f.UniqueName + err = createApp(f.ClientSet, app, deployTimeout) + if err != nil { + e2elog.Failf("failed to create application: %v", err) + } + validateSubvolumeCount(f, 1, fileSystemName, subvolumegroup) + // delete pod + err = deletePod(app.Name, app.Namespace, f.ClientSet, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete application: %v", err) + } + validateSubvolumeCount(f, 0, fileSystemName, subvolumegroup) + err = deleteResource(cephFSExamplePath + "storageclass.yaml") + if err != nil { + e2elog.Failf("failed to delete CephFS storageclass: %v", err) + } + }) By("check static PVC", func() { scPath := cephFSExamplePath + "secret.yaml" diff --git a/e2e/rbd.go b/e2e/rbd.go index e16c5c00c97..7d72e7fa29f 100644 --- a/e2e/rbd.go +++ b/e2e/rbd.go @@ -57,6 +57,7 @@ var ( appClonePath = rbdExamplePath + "pod-restore.yaml" appSmartClonePath = rbdExamplePath + "pod-clone.yaml" appBlockSmartClonePath = rbdExamplePath + "block-pod-clone.yaml" + appEphemeralPath = rbdExamplePath + "pod-ephemeral.yaml" snapshotPath = rbdExamplePath + "snapshot.yaml" defaultCloneCount = 10 @@ -367,6 +368,36 @@ var _ = Describe("RBD", func() { } }) } + By("verify generic ephemeral volume support", func() { + // generic ephemeral volume support is supported from 1.21 + if !k8sVersionGreaterEquals(f.ClientSet, 1, 21) { + Skip("generic ephemeral volume only supported from v1.21+") + } + // create application + app, err := loadApp(appEphemeralPath) + if err != nil { + e2elog.Failf("failed to load application: %v", err) + } + app.Namespace = f.UniqueName + err = createApp(f.ClientSet, app, deployTimeout) + if err != nil { + e2elog.Failf("failed to create application: %v", err) + } + // validate created backend rbd images + validateRBDImageCount(f, 1, defaultRBDPool) + err = deletePod(app.Name, app.Namespace, f.ClientSet, deployTimeout) + if err != nil { + e2elog.Failf("failed to delete application: %v", err) + } + // validate created backend rbd images + validateRBDImageCount(f, 0, defaultRBDPool) + // validate images in trash + err = waitToRemoveImagesFromTrash(f, defaultRBDPool, deployTimeout) + if err != nil { + e2elog.Failf("failed to validate rbd images in pool %s trash: %v", defaultRBDPool, err) + } + }) + // todo: may be remove the below deletion test later once the migration nodestage tests are adjusted // also to have deletion validation through the same. By("validate RBD migration+static Block PVC Deletion", func() { diff --git a/examples/cephfs/pod-ephemeral.yaml b/examples/cephfs/pod-ephemeral.yaml new file mode 100644 index 00000000000..7a81ca94c71 --- /dev/null +++ b/examples/cephfs/pod-ephemeral.yaml @@ -0,0 +1,23 @@ +--- +kind: Pod +apiVersion: v1 +metadata: + name: csi-cephfs-demo-ephemeral-pod +spec: + containers: + - name: web-server + image: docker.io/library/nginx:latest + volumeMounts: + - mountPath: /myspace + name: mypvc + volumes: + - name: mypvc + ephemeral: + volumeClaimTemplate: + spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-cephfs-sc + resources: + requests: + storage: 1Gi diff --git a/examples/rbd/pod-ephemeral.yaml b/examples/rbd/pod-ephemeral.yaml new file mode 100644 index 00000000000..697e61ab753 --- /dev/null +++ b/examples/rbd/pod-ephemeral.yaml @@ -0,0 +1,23 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: csi-rbd-demo-ephemeral-pod +spec: + containers: + - name: web-server + image: docker.io/library/nginx:latest + volumeMounts: + - mountPath: /myspace + name: mypvc + volumes: + - name: mypvc + ephemeral: + volumeClaimTemplate: + spec: + accessModes: + - ReadWriteOnce + storageClassName: csi-rbd-sc + resources: + requests: + storage: 1Gi diff --git a/scripts/minikube.sh b/scripts/minikube.sh index 1cb38f5e835..4a7ca00c622 100755 --- a/scripts/minikube.sh +++ b/scripts/minikube.sh @@ -160,7 +160,7 @@ CSI_RESIZER_VERSION=${CSI_RESIZER_VERSION:-"v1.2.0"} CSI_NODE_DRIVER_REGISTRAR_VERSION=${CSI_NODE_DRIVER_REGISTRAR_VERSION:-"v2.2.0"} #feature-gates for kube -K8S_FEATURE_GATES=${K8S_FEATURE_GATES:-"ExpandCSIVolumes=true"} +K8S_FEATURE_GATES=${K8S_FEATURE_GATES:-""} #extra-config for kube https://minikube.sigs.k8s.io/docs/reference/configuration/kubernetes/ EXTRA_CONFIG_PSP="--extra-config=apiserver.enable-admission-plugins=PodSecurityPolicy --addons=pod-security-policy"