diff --git a/test/e2e/storage/drivers/csi.go b/test/e2e/storage/drivers/csi.go index e146813bb12..f0e9cd1d8c7 100644 --- a/test/e2e/storage/drivers/csi.go +++ b/test/e2e/storage/drivers/csi.go @@ -352,6 +352,7 @@ type gcePDCSIDriver struct { var _ testsuites.TestDriver = &gcePDCSIDriver{} var _ testsuites.DynamicPVTestDriver = &gcePDCSIDriver{} +var _ testsuites.SnapshottableTestDriver = &gcePDCSIDriver{} // InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface func InitGcePDCSIDriver() testsuites.TestDriver { @@ -383,6 +384,7 @@ func InitGcePDCSIDriver() testsuites.TestDriver { testsuites.CapTopology: true, testsuites.CapControllerExpansion: true, testsuites.CapNodeExpansion: true, + testsuites.CapSnapshotDataSource: true, }, RequiredAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, TopologyKeys: []string{GCEPDCSIZoneTopologyKey}, @@ -418,6 +420,15 @@ func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *testsuites.PerT return testsuites.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix) } +func (g *gcePDCSIDriver) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured { + parameters := map[string]string{} + snapshotter := g.driverInfo.Name + ns := config.Framework.Namespace.Name + suffix := fmt.Sprintf("%s-vsc", snapshotter) + + return testsuites.GetSnapshotClass(snapshotter, parameters, ns, suffix) +} + func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*testsuites.PerTestConfig, func()) { ginkgo.By("deploying csi gce-pd driver") cancelLogging := testsuites.StartPodLogs(f) diff --git a/test/e2e/storage/testsuites/provisioning.go b/test/e2e/storage/testsuites/provisioning.go index b41fbd4e77e..7d7b5a68b1a 100644 --- a/test/e2e/storage/testsuites/provisioning.go +++ b/test/e2e/storage/testsuites/provisioning.go @@ -631,6 +631,12 @@ func prepareSnapshotDataSourceForProvisioning( ginkgo.By("[Initialize dataSource]creating a initClaim") updatedClaim, err := client.CoreV1().PersistentVolumeClaims(initClaim.Namespace).Create(initClaim) framework.ExpectNoError(err) + + // write namespace to the /mnt/test (= the volume). + ginkgo.By("[Initialize dataSource]write data to volume") + command := fmt.Sprintf("echo '%s' > /mnt/test/initialData", updatedClaim.GetNamespace()) + RunInPodWithVolume(client, updatedClaim.Namespace, updatedClaim.Name, "pvc-snapshot-writer", command, node) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, updatedClaim.Namespace, updatedClaim.Name, framework.Poll, framework.ClaimProvisionTimeout) framework.ExpectNoError(err) @@ -639,11 +645,6 @@ func prepareSnapshotDataSourceForProvisioning( _, err = client.CoreV1().PersistentVolumeClaims(updatedClaim.Namespace).Get(updatedClaim.Name, metav1.GetOptions{}) framework.ExpectNoError(err) - // write namespace to the /mnt/test (= the volume). - ginkgo.By("[Initialize dataSource]write data to volume") - command := fmt.Sprintf("echo '%s' > /mnt/test/initialData", updatedClaim.GetNamespace()) - RunInPodWithVolume(client, updatedClaim.Namespace, updatedClaim.Name, "pvc-snapshot-writer", command, node) - ginkgo.By("[Initialize dataSource]creating a SnapshotClass") snapshotClass, err = dynamicClient.Resource(snapshotClassGVR).Create(snapshotClass, metav1.CreateOptions{}) diff --git a/test/e2e/storage/testsuites/snapshottable.go b/test/e2e/storage/testsuites/snapshottable.go index db57e7948ab..119f715a3fc 100644 --- a/test/e2e/storage/testsuites/snapshottable.go +++ b/test/e2e/storage/testsuites/snapshottable.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic" "k8s.io/kubernetes/test/e2e/framework" + e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epv "k8s.io/kubernetes/test/e2e/framework/pv" "k8s.io/kubernetes/test/e2e/framework/volume" "k8s.io/kubernetes/test/e2e/storage/testpatterns" @@ -146,6 +147,12 @@ func (s *snapshottableTestSuite) defineTests(driver TestDriver, pattern testpatt framework.Failf("Error deleting claim %q. Error: %v", pvc.Name, err) } }() + + ginkgo.By("starting a pod to use the claim") + command := "echo 'hello world' > /mnt/test/data" + pod := StartInPodWithVolume(cs, pvc.Namespace, pvc.Name, "pvc-snapshottable-tester", command, e2epod.NodeSelection{Name: config.ClientNodeName}) + defer StopPod(cs, pod) + err = e2epv.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, cs, pvc.Namespace, pvc.Name, framework.Poll, framework.ClaimProvisionTimeout) framework.ExpectNoError(err) diff --git a/test/e2e/testing-manifests/storage-csi/gce-pd/controller_ss.yaml b/test/e2e/testing-manifests/storage-csi/gce-pd/controller_ss.yaml index 9a042f84b79..c05cb4a4dd2 100644 --- a/test/e2e/testing-manifests/storage-csi/gce-pd/controller_ss.yaml +++ b/test/e2e/testing-manifests/storage-csi/gce-pd/controller_ss.yaml @@ -15,8 +15,18 @@ spec: spec: serviceAccountName: csi-gce-pd-controller-sa containers: + - name: csi-snapshotter + # TODO: replace with official 2.0.0 release when ready + image: quay.io/k8scsi/csi-snapshotter:v2.0.0-rc2 + args: + - "--v=5" + - "--csi-address=/csi/csi.sock" + imagePullPolicy: Always + volumeMounts: + - name: socket-dir + mountPath: /csi - name: csi-provisioner - image: gcr.io/gke-release/csi-provisioner:v1.4.0-gke.0 + image: quay.io/k8scsi/csi-provisioner:v1.5.0-rc1 args: - "--v=5" - "--csi-address=/csi/csi.sock" diff --git a/test/e2e/testing-manifests/storage-csi/gce-pd/csi-controller-rbac.yaml b/test/e2e/testing-manifests/storage-csi/gce-pd/csi-controller-rbac.yaml index 53a07f34b69..8ce1455ce0f 100644 --- a/test/e2e/testing-manifests/storage-csi/gce-pd/csi-controller-rbac.yaml +++ b/test/e2e/testing-manifests/storage-csi/gce-pd/csi-controller-rbac.yaml @@ -29,6 +29,12 @@ rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshots"] + verbs: ["get", "list"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["get", "list"] --- @@ -112,6 +118,39 @@ roleRef: name: csi-gce-pd-resizer-role apiGroup: rbac.authorization.k8s.io +--- +# xref: https://github.com/kubernetes-csi/external-snapshotter/blob/master/deploy/kubernetes/csi-snapshotter/rbac-csi-snapshotter.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: csi-gce-pd-snapshotter-role +rules: + - apiGroups: [""] + resources: ["events"] + verbs: ["list", "watch", "create", "update", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotclasses"] + verbs: ["get", "list", "watch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents"] + verbs: ["get", "list", "watch", "update", "delete", "patch"] + - apiGroups: ["snapshot.storage.k8s.io"] + resources: ["volumesnapshotcontents/status"] + verbs: ["update", "patch"] + +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: csi-gce-pd-controller-snapshotter-binding +subjects: + - kind: ServiceAccount + name: csi-gce-pd-controller-sa +roleRef: + kind: ClusterRole + name: csi-gce-pd-snapshotter-role + apiGroup: rbac.authorization.k8s.io + --- # priviledged Pod Security Policy, previously defined via PrivilegedTestPSPClusterRoleBinding() kind: ClusterRoleBinding @@ -121,7 +160,6 @@ metadata: subjects: - kind: ServiceAccount name: csi-gce-pd-controller-sa - namespace: default roleRef: kind: ClusterRole name: e2e-test-privileged-psp