From dfcf2ca345d3830f1e48d8338a753ba23a77eb22 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 9 Nov 2018 11:15:16 +0100 Subject: [PATCH] e2e/storage: separate generic testsuites from specific drivers This makes it possible to use the testsuites package out-of-tree without pulling in unnecessary dependencies and code (in test/e2e/storage/vsphere) that defines tests that are not wanted in a custom test suite. --- test/e2e/storage/csi_volumes.go | 14 +- test/e2e/storage/drivers/csi.go | 74 ++-- test/e2e/storage/drivers/in_tree.go | 323 +++++++++--------- test/e2e/storage/in_tree_volumes.go | 6 +- test/e2e/storage/testsuites/base.go | 35 +- .../storage/testsuites/driveroperations.go | 114 +++++++ test/e2e/storage/testsuites/provisioning.go | 19 +- test/e2e/storage/testsuites/subpath.go | 11 +- .../base.go => testsuites/testdriver.go} | 91 +---- test/e2e/storage/testsuites/volume_io.go | 7 +- test/e2e/storage/testsuites/volumemode.go | 25 +- test/e2e/storage/testsuites/volumes.go | 15 +- 12 files changed, 378 insertions(+), 356 deletions(-) create mode 100644 test/e2e/storage/testsuites/driveroperations.go rename test/e2e/storage/{drivers/base.go => testsuites/testdriver.go} (65%) diff --git a/test/e2e/storage/csi_volumes.go b/test/e2e/storage/csi_volumes.go index e614f4e9513..47f98c60618 100644 --- a/test/e2e/storage/csi_volumes.go +++ b/test/e2e/storage/csi_volumes.go @@ -43,7 +43,7 @@ import ( ) // List of testDrivers to be executed in below loop -var csiTestDrivers = []func() drivers.TestDriver{ +var csiTestDrivers = []func() testsuites.TestDriver{ drivers.InitHostPathCSIDriver, drivers.InitGcePDCSIDriver, drivers.InitGcePDExternalCSIDriver, @@ -126,12 +126,12 @@ var _ = utils.SIGDescribe("CSI Volumes", func() { for _, initDriver := range csiTestDrivers { curDriver := initDriver() - Context(drivers.GetDriverNameWithFeatureTags(curDriver), func() { + Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() { driver := curDriver BeforeEach(func() { // setupDriver - drivers.SetCommonDriverParameters(driver, f, config) + testsuites.SetCommonDriverParameters(driver, f, config) driver.CreateDriver() }) @@ -149,14 +149,14 @@ var _ = utils.SIGDescribe("CSI Volumes", func() { var ( cs clientset.Interface csics csiclient.Interface - driver drivers.TestDriver + driver testsuites.TestDriver ) BeforeEach(func() { cs = f.ClientSet csics = f.CSIClientSet driver = drivers.InitHostPathCSIDriver() - drivers.SetCommonDriverParameters(driver, f, config) + testsuites.SetCommonDriverParameters(driver, f, config) driver.CreateDriver() }) @@ -193,7 +193,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() { test := t It(test.name, func() { if test.driverExists { - csiDriver := createCSIDriver(csics, drivers.GetUniqueDriverName(driver), test.driverAttachable) + csiDriver := createCSIDriver(csics, testsuites.GetUniqueDriverName(driver), test.driverAttachable) if csiDriver != nil { defer csics.CsiV1alpha1().CSIDrivers().Delete(csiDriver.Name, nil) } @@ -201,7 +201,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() { By("Creating pod") var sc *storagev1.StorageClass - if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok { + if dDriver, ok := driver.(testsuites.DynamicPVTestDriver); ok { sc = dDriver.GetDynamicProvisionStorageClass("") } nodeName := driver.GetDriverInfo().Config.ClientNodeName diff --git a/test/e2e/storage/drivers/csi.go b/test/e2e/storage/drivers/csi.go index 247bdc507f4..62187a0f6c8 100644 --- a/test/e2e/storage/drivers/csi.go +++ b/test/e2e/storage/drivers/csi.go @@ -44,38 +44,39 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/storage/testpatterns" + "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" ) // hostpathCSI type hostpathCSIDriver struct { cleanup func() - driverInfo DriverInfo + driverInfo testsuites.DriverInfo manifests []string } -func initHostPathCSIDriver(name string, manifests ...string) TestDriver { +func initHostPathCSIDriver(name string, manifests ...string) testsuites.TestDriver { return &hostpathCSIDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: name, FeatureTag: "", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[Capability]bool{ - CapPersistence: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, }, }, manifests: manifests, } } -var _ TestDriver = &hostpathCSIDriver{} -var _ DynamicPVTestDriver = &hostpathCSIDriver{} +var _ testsuites.TestDriver = &hostpathCSIDriver{} +var _ testsuites.DynamicPVTestDriver = &hostpathCSIDriver{} // InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface -func InitHostPathCSIDriver() TestDriver { +func InitHostPathCSIDriver() testsuites.TestDriver { return initHostPathCSIDriver("csi-hostpath", "test/e2e/testing-manifests/storage-csi/driver-registrar/rbac.yaml", "test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml", @@ -87,7 +88,7 @@ func InitHostPathCSIDriver() TestDriver { ) } -func (h *hostpathCSIDriver) GetDriverInfo() *DriverInfo { +func (h *hostpathCSIDriver) GetDriverInfo() *testsuites.DriverInfo { return &h.driverInfo } @@ -95,12 +96,12 @@ func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern } func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass { - provisioner := GetUniqueDriverName(h) + provisioner := testsuites.GetUniqueDriverName(h) parameters := map[string]string{} ns := h.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", provisioner) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (h *hostpathCSIDriver) GetClaimSize() string { @@ -122,7 +123,7 @@ func (h *hostpathCSIDriver) CreateDriver() { // settings are ignored for this test. We could patch the image definitions. o := utils.PatchCSIOptions{ OldDriverName: h.driverInfo.Name, - NewDriverName: GetUniqueDriverName(h), + NewDriverName: testsuites.GetUniqueDriverName(h), DriverContainerName: "hostpath", ProvisionerContainerName: "csi-provisioner", NodeName: h.driverInfo.Config.ServerNodeName, @@ -145,7 +146,7 @@ func (h *hostpathCSIDriver) CleanupDriver() { } // InitHostPathV0CSIDriver returns a variant of hostpathCSIDriver with different manifests. -func InitHostPathV0CSIDriver() TestDriver { +func InitHostPathV0CSIDriver() testsuites.TestDriver { return initHostPathCSIDriver("csi-hostpath-v0", "test/e2e/testing-manifests/storage-csi/driver-registrar/rbac.yaml", "test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml", @@ -160,16 +161,16 @@ func InitHostPathV0CSIDriver() TestDriver { // gce-pd type gcePDCSIDriver struct { cleanup func() - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } -var _ TestDriver = &gcePDCSIDriver{} -var _ DynamicPVTestDriver = &gcePDCSIDriver{} +var _ testsuites.TestDriver = &gcePDCSIDriver{} +var _ testsuites.DynamicPVTestDriver = &gcePDCSIDriver{} // InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface -func InitGcePDCSIDriver() TestDriver { +func InitGcePDCSIDriver() testsuites.TestDriver { return &gcePDCSIDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "pd.csi.storage.gke.io", FeatureTag: "[Serial]", MaxFileSize: testpatterns.FileSizeMedium, @@ -180,16 +181,16 @@ func InitGcePDCSIDriver() TestDriver { "ext4", "xfs", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapExec: true, }, }, } } -func (g *gcePDCSIDriver) GetDriverInfo() *DriverInfo { +func (g *gcePDCSIDriver) GetDriverInfo() *testsuites.DriverInfo { return &g.driverInfo } @@ -206,7 +207,7 @@ func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storage parameters := map[string]string{"type": "pd-standard"} - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (g *gcePDCSIDriver) GetClaimSize() string { @@ -223,7 +224,7 @@ func (g *gcePDCSIDriver) CreateDriver() { // These are the options which would have to be used: // o := utils.PatchCSIOptions{ // OldDriverName: g.driverInfo.Name, - // NewDriverName: GetUniqueDriverName(g), + // NewDriverName: testsuites.GetUniqueDriverName(g), // DriverContainerName: "gce-driver", // ProvisionerContainerName: "csi-external-provisioner", // } @@ -252,17 +253,18 @@ func (g *gcePDCSIDriver) CleanupDriver() { // gcePd-external type gcePDExternalCSIDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } -var _ TestDriver = &gcePDExternalCSIDriver{} -var _ DynamicPVTestDriver = &gcePDExternalCSIDriver{} +var _ testsuites.TestDriver = &gcePDExternalCSIDriver{} +var _ testsuites.DynamicPVTestDriver = &gcePDExternalCSIDriver{} // InitGcePDExternalCSIDriver returns gcePDExternalCSIDriver that implements TestDriver interface -func InitGcePDExternalCSIDriver() TestDriver { +func InitGcePDExternalCSIDriver() testsuites.TestDriver { return &gcePDExternalCSIDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "pd.csi.storage.gke.io", + // TODO(#70258): this is temporary until we can figure out how to make e2e tests a library FeatureTag: "[Feature: gcePD-external]", MaxFileSize: testpatterns.FileSizeMedium, @@ -273,16 +275,16 @@ func InitGcePDExternalCSIDriver() TestDriver { "ext4", "xfs", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapExec: true, }, }, } } -func (g *gcePDExternalCSIDriver) GetDriverInfo() *DriverInfo { +func (g *gcePDExternalCSIDriver) GetDriverInfo() *testsuites.DriverInfo { return &g.driverInfo } @@ -298,7 +300,7 @@ func (g *gcePDExternalCSIDriver) GetDynamicProvisionStorageClass(fsType string) parameters := map[string]string{"type": "pd-standard"} - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (g *gcePDExternalCSIDriver) GetClaimSize() string { diff --git a/test/e2e/storage/drivers/in_tree.go b/test/e2e/storage/drivers/in_tree.go index 67f0abc854c..d121f3e4fa9 100644 --- a/test/e2e/storage/drivers/in_tree.go +++ b/test/e2e/storage/drivers/in_tree.go @@ -55,6 +55,7 @@ import ( kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/storage/testpatterns" + "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" vspheretest "k8s.io/kubernetes/test/e2e/storage/vsphere" imageutils "k8s.io/kubernetes/test/utils/image" @@ -65,7 +66,7 @@ type nfsDriver struct { externalProvisionerPod *v1.Pod externalPluginName string - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type nfsTestResource struct { @@ -73,16 +74,16 @@ type nfsTestResource struct { serverPod *v1.Pod } -var _ TestDriver = &nfsDriver{} -var _ PreprovisionedVolumeTestDriver = &nfsDriver{} -var _ InlineVolumeTestDriver = &nfsDriver{} -var _ PreprovisionedPVTestDriver = &nfsDriver{} -var _ DynamicPVTestDriver = &nfsDriver{} +var _ testsuites.TestDriver = &nfsDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &nfsDriver{} +var _ testsuites.InlineVolumeTestDriver = &nfsDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &nfsDriver{} +var _ testsuites.DynamicPVTestDriver = &nfsDriver{} // InitNFSDriver returns nfsDriver that implements TestDriver interface -func InitNFSDriver() TestDriver { +func InitNFSDriver() testsuites.TestDriver { return &nfsDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "nfs", MaxFileSize: testpatterns.FileSizeLarge, SupportedFsType: sets.NewString( @@ -90,15 +91,15 @@ func InitNFSDriver() TestDriver { ), SupportedMountOption: sets.NewString("proto=tcp", "relatime"), RequiredMountOption: sets.NewString("vers=4.1"), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapExec: true, }, }, } } -func (n *nfsDriver) GetDriverInfo() *DriverInfo { +func (n *nfsDriver) GetDriverInfo() *testsuites.DriverInfo { return &n.driverInfo } @@ -135,7 +136,7 @@ func (n *nfsDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.St ns := n.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", n.driverInfo.Name) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (n *nfsDriver) GetClaimSize() string { @@ -218,7 +219,7 @@ func (n *nfsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource // Gluster type glusterFSDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type glusterTestResource struct { @@ -226,29 +227,29 @@ type glusterTestResource struct { serverPod *v1.Pod } -var _ TestDriver = &glusterFSDriver{} -var _ PreprovisionedVolumeTestDriver = &glusterFSDriver{} -var _ InlineVolumeTestDriver = &glusterFSDriver{} -var _ PreprovisionedPVTestDriver = &glusterFSDriver{} +var _ testsuites.TestDriver = &glusterFSDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &glusterFSDriver{} +var _ testsuites.InlineVolumeTestDriver = &glusterFSDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &glusterFSDriver{} // InitGlusterFSDriver returns glusterFSDriver that implements TestDriver interface -func InitGlusterFSDriver() TestDriver { +func InitGlusterFSDriver() testsuites.TestDriver { return &glusterFSDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "gluster", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapExec: true, }, }, } } -func (g *glusterFSDriver) GetDriverInfo() *DriverInfo { +func (g *glusterFSDriver) GetDriverInfo() *testsuites.DriverInfo { return &g.driverInfo } @@ -336,22 +337,22 @@ func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testRes // iSCSI // The iscsiadm utility and iscsi target kernel modules must be installed on all nodes. type iSCSIDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type iSCSITestResource struct { serverPod *v1.Pod serverIP string } -var _ TestDriver = &iSCSIDriver{} -var _ PreprovisionedVolumeTestDriver = &iSCSIDriver{} -var _ InlineVolumeTestDriver = &iSCSIDriver{} -var _ PreprovisionedPVTestDriver = &iSCSIDriver{} +var _ testsuites.TestDriver = &iSCSIDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &iSCSIDriver{} +var _ testsuites.InlineVolumeTestDriver = &iSCSIDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &iSCSIDriver{} // InitISCSIDriver returns iSCSIDriver that implements TestDriver interface -func InitISCSIDriver() TestDriver { +func InitISCSIDriver() testsuites.TestDriver { return &iSCSIDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "iscsi", FeatureTag: "[Feature:Volumes]", MaxFileSize: testpatterns.FileSizeMedium, @@ -362,17 +363,17 @@ func InitISCSIDriver() TestDriver { //"ext3", "ext4", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapBlock: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapBlock: true, + testsuites.CapExec: true, }, }, } } -func (i *iSCSIDriver) GetDriverInfo() *DriverInfo { +func (i *iSCSIDriver) GetDriverInfo() *testsuites.DriverInfo { return &i.driverInfo } @@ -446,7 +447,7 @@ func (i *iSCSIDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc // Ceph RBD type rbdDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type rbdTestResource struct { @@ -455,15 +456,15 @@ type rbdTestResource struct { secret *v1.Secret } -var _ TestDriver = &rbdDriver{} -var _ PreprovisionedVolumeTestDriver = &rbdDriver{} -var _ InlineVolumeTestDriver = &rbdDriver{} -var _ PreprovisionedPVTestDriver = &rbdDriver{} +var _ testsuites.TestDriver = &rbdDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &rbdDriver{} +var _ testsuites.InlineVolumeTestDriver = &rbdDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &rbdDriver{} // InitRbdDriver returns rbdDriver that implements TestDriver interface -func InitRbdDriver() TestDriver { +func InitRbdDriver() testsuites.TestDriver { return &rbdDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "rbd", FeatureTag: "[Feature:Volumes]", MaxFileSize: testpatterns.FileSizeMedium, @@ -474,17 +475,17 @@ func InitRbdDriver() TestDriver { //"ext3", "ext4", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapBlock: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapBlock: true, + testsuites.CapExec: true, }, }, } } -func (r *rbdDriver) GetDriverInfo() *DriverInfo { +func (r *rbdDriver) GetDriverInfo() *testsuites.DriverInfo { return &r.driverInfo } @@ -574,7 +575,7 @@ type cephFSDriver struct { serverPod *v1.Pod secret *v1.Secret - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type cephTestResource struct { @@ -583,30 +584,30 @@ type cephTestResource struct { secret *v1.Secret } -var _ TestDriver = &cephFSDriver{} -var _ PreprovisionedVolumeTestDriver = &cephFSDriver{} -var _ InlineVolumeTestDriver = &cephFSDriver{} -var _ PreprovisionedPVTestDriver = &cephFSDriver{} +var _ testsuites.TestDriver = &cephFSDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &cephFSDriver{} +var _ testsuites.InlineVolumeTestDriver = &cephFSDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &cephFSDriver{} // InitCephFSDriver returns cephFSDriver that implements TestDriver interface -func InitCephFSDriver() TestDriver { +func InitCephFSDriver() testsuites.TestDriver { return &cephFSDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "ceph", FeatureTag: "[Feature:Volumes]", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapExec: true, }, }, } } -func (c *cephFSDriver) GetDriverInfo() *DriverInfo { +func (c *cephFSDriver) GetDriverInfo() *testsuites.DriverInfo { return &c.driverInfo } @@ -682,30 +683,30 @@ func (c *cephFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResour type hostPathDriver struct { node v1.Node - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } -var _ TestDriver = &hostPathDriver{} -var _ PreprovisionedVolumeTestDriver = &hostPathDriver{} -var _ InlineVolumeTestDriver = &hostPathDriver{} +var _ testsuites.TestDriver = &hostPathDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathDriver{} +var _ testsuites.InlineVolumeTestDriver = &hostPathDriver{} // InitHostPathDriver returns hostPathDriver that implements TestDriver interface -func InitHostPathDriver() TestDriver { +func InitHostPathDriver() testsuites.TestDriver { return &hostPathDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "hostPath", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[Capability]bool{ - CapPersistence: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, }, }, } } -func (h *hostPathDriver) GetDriverInfo() *DriverInfo { +func (h *hostPathDriver) GetDriverInfo() *testsuites.DriverInfo { return &h.driverInfo } @@ -748,7 +749,7 @@ func (h *hostPathDriver) DeleteVolume(volType testpatterns.TestVolType, testReso type hostPathSymlinkDriver struct { node v1.Node - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type hostPathSymlinkTestResource struct { @@ -757,27 +758,27 @@ type hostPathSymlinkTestResource struct { prepPod *v1.Pod } -var _ TestDriver = &hostPathSymlinkDriver{} -var _ PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{} -var _ InlineVolumeTestDriver = &hostPathSymlinkDriver{} +var _ testsuites.TestDriver = &hostPathSymlinkDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{} +var _ testsuites.InlineVolumeTestDriver = &hostPathSymlinkDriver{} // InitHostPathSymlinkDriver returns hostPathSymlinkDriver that implements TestDriver interface -func InitHostPathSymlinkDriver() TestDriver { +func InitHostPathSymlinkDriver() testsuites.TestDriver { return &hostPathSymlinkDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "hostPathSymlink", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[Capability]bool{ - CapPersistence: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, }, }, } } -func (h *hostPathSymlinkDriver) GetDriverInfo() *DriverInfo { +func (h *hostPathSymlinkDriver) GetDriverInfo() *testsuites.DriverInfo { return &h.driverInfo } @@ -894,30 +895,30 @@ func (h *hostPathSymlinkDriver) DeleteVolume(volType testpatterns.TestVolType, t // emptydir type emptydirDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } -var _ TestDriver = &emptydirDriver{} -var _ PreprovisionedVolumeTestDriver = &emptydirDriver{} -var _ InlineVolumeTestDriver = &emptydirDriver{} +var _ testsuites.TestDriver = &emptydirDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &emptydirDriver{} +var _ testsuites.InlineVolumeTestDriver = &emptydirDriver{} // InitEmptydirDriver returns emptydirDriver that implements TestDriver interface -func InitEmptydirDriver() TestDriver { +func InitEmptydirDriver() testsuites.TestDriver { return &emptydirDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "emptydir", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType ), - Capabilities: map[Capability]bool{ - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapExec: true, }, }, } } -func (e *emptydirDriver) GetDriverInfo() *DriverInfo { +func (e *emptydirDriver) GetDriverInfo() *testsuites.DriverInfo { return &e.driverInfo } @@ -953,7 +954,7 @@ func (e *emptydirDriver) CleanupDriver() { // and that the usual OpenStack authentication env. variables are set // (OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME at least). type cinderDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type cinderTestResource struct { @@ -961,32 +962,32 @@ type cinderTestResource struct { volumeID string } -var _ TestDriver = &cinderDriver{} -var _ PreprovisionedVolumeTestDriver = &cinderDriver{} -var _ InlineVolumeTestDriver = &cinderDriver{} -var _ PreprovisionedPVTestDriver = &cinderDriver{} -var _ DynamicPVTestDriver = &cinderDriver{} +var _ testsuites.TestDriver = &cinderDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &cinderDriver{} +var _ testsuites.InlineVolumeTestDriver = &cinderDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &cinderDriver{} +var _ testsuites.DynamicPVTestDriver = &cinderDriver{} // InitCinderDriver returns cinderDriver that implements TestDriver interface -func InitCinderDriver() TestDriver { +func InitCinderDriver() testsuites.TestDriver { return &cinderDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "cinder", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType "ext3", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapExec: true, }, }, } } -func (c *cinderDriver) GetDriverInfo() *DriverInfo { +func (c *cinderDriver) GetDriverInfo() *testsuites.DriverInfo { return &c.driverInfo } @@ -1035,7 +1036,7 @@ func (c *cinderDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1 ns := c.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", c.driverInfo.Name) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (c *cinderDriver) GetClaimSize() string { @@ -1114,23 +1115,23 @@ func deleteCinderVolume(name string) error { // GCE type gcePdDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type gcePdTestResource struct { volumeName string } -var _ TestDriver = &gcePdDriver{} -var _ PreprovisionedVolumeTestDriver = &gcePdDriver{} -var _ InlineVolumeTestDriver = &gcePdDriver{} -var _ PreprovisionedPVTestDriver = &gcePdDriver{} -var _ DynamicPVTestDriver = &gcePdDriver{} +var _ testsuites.TestDriver = &gcePdDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &gcePdDriver{} +var _ testsuites.InlineVolumeTestDriver = &gcePdDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &gcePdDriver{} +var _ testsuites.DynamicPVTestDriver = &gcePdDriver{} // InitGceDriver returns gcePdDriver that implements TestDriver interface -func InitGcePdDriver() TestDriver { +func InitGcePdDriver() testsuites.TestDriver { return &gcePdDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "gcepd", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( @@ -1141,17 +1142,17 @@ func InitGcePdDriver() TestDriver { "xfs", ), SupportedMountOption: sets.NewString("debug", "nouid32"), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapBlock: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapBlock: true, + testsuites.CapExec: true, }, }, } } -func (g *gcePdDriver) GetDriverInfo() *DriverInfo { +func (g *gcePdDriver) GetDriverInfo() *testsuites.DriverInfo { return &g.driverInfo } @@ -1201,7 +1202,7 @@ func (g *gcePdDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1. ns := g.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (h *gcePdDriver) GetClaimSize() string { @@ -1238,7 +1239,7 @@ func (g *gcePdDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc // vSphere type vSphereDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type vSphereTestResource struct { @@ -1246,31 +1247,31 @@ type vSphereTestResource struct { nodeInfo *vspheretest.NodeInfo } -var _ TestDriver = &vSphereDriver{} -var _ PreprovisionedVolumeTestDriver = &vSphereDriver{} -var _ InlineVolumeTestDriver = &vSphereDriver{} -var _ PreprovisionedPVTestDriver = &vSphereDriver{} -var _ DynamicPVTestDriver = &vSphereDriver{} +var _ testsuites.TestDriver = &vSphereDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &vSphereDriver{} +var _ testsuites.InlineVolumeTestDriver = &vSphereDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &vSphereDriver{} +var _ testsuites.DynamicPVTestDriver = &vSphereDriver{} // InitVSphereDriver returns vSphereDriver that implements TestDriver interface -func InitVSphereDriver() TestDriver { +func InitVSphereDriver() testsuites.TestDriver { return &vSphereDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "vSphere", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType "ext4", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapExec: true, }, }, } } -func (v *vSphereDriver) GetDriverInfo() *DriverInfo { +func (v *vSphereDriver) GetDriverInfo() *testsuites.DriverInfo { return &v.driverInfo } @@ -1327,7 +1328,7 @@ func (v *vSphereDriver) GetDynamicProvisionStorageClass(fsType string) *storagev ns := v.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", v.driverInfo.Name) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (v *vSphereDriver) GetClaimSize() string { @@ -1361,40 +1362,40 @@ func (v *vSphereDriver) DeleteVolume(volType testpatterns.TestVolType, testResou // Azure type azureDriver struct { - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } type azureTestResource struct { volumeName string } -var _ TestDriver = &azureDriver{} -var _ PreprovisionedVolumeTestDriver = &azureDriver{} -var _ InlineVolumeTestDriver = &azureDriver{} -var _ PreprovisionedPVTestDriver = &azureDriver{} -var _ DynamicPVTestDriver = &azureDriver{} +var _ testsuites.TestDriver = &azureDriver{} +var _ testsuites.PreprovisionedVolumeTestDriver = &azureDriver{} +var _ testsuites.InlineVolumeTestDriver = &azureDriver{} +var _ testsuites.PreprovisionedPVTestDriver = &azureDriver{} +var _ testsuites.DynamicPVTestDriver = &azureDriver{} // InitAzureDriver returns azureDriver that implements TestDriver interface -func InitAzureDriver() TestDriver { +func InitAzureDriver() testsuites.TestDriver { return &azureDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "azure", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( "", // Default fsType "ext4", ), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapBlock: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapBlock: true, + testsuites.CapExec: true, }, }, } } -func (a *azureDriver) GetDriverInfo() *DriverInfo { +func (a *azureDriver) GetDriverInfo() *testsuites.DriverInfo { return &a.driverInfo } @@ -1449,7 +1450,7 @@ func (a *azureDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1. ns := a.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", a.driverInfo.Name) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (a *azureDriver) GetClaimSize() string { @@ -1482,21 +1483,21 @@ func (a *azureDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc type awsDriver struct { volumeName string - driverInfo DriverInfo + driverInfo testsuites.DriverInfo } -var _ TestDriver = &awsDriver{} +var _ testsuites.TestDriver = &awsDriver{} // TODO: Fix authorization error in attach operation and uncomment below -//var _ PreprovisionedVolumeTestDriver = &awsDriver{} -//var _ InlineVolumeTestDriver = &awsDriver{} -//var _ PreprovisionedPVTestDriver = &awsDriver{} -var _ DynamicPVTestDriver = &awsDriver{} +//var _ testsuites.PreprovisionedVolumeTestDriver = &awsDriver{} +//var _ testsuites.InlineVolumeTestDriver = &awsDriver{} +//var _ testsuites.PreprovisionedPVTestDriver = &awsDriver{} +var _ testsuites.DynamicPVTestDriver = &awsDriver{} // InitAwsDriver returns awsDriver that implements TestDriver interface -func InitAwsDriver() TestDriver { +func InitAwsDriver() testsuites.TestDriver { return &awsDriver{ - driverInfo: DriverInfo{ + driverInfo: testsuites.DriverInfo{ Name: "aws", MaxFileSize: testpatterns.FileSizeMedium, SupportedFsType: sets.NewString( @@ -1504,17 +1505,17 @@ func InitAwsDriver() TestDriver { "ext3", ), SupportedMountOption: sets.NewString("debug", "nouid32"), - Capabilities: map[Capability]bool{ - CapPersistence: true, - CapFsGroup: true, - CapBlock: true, - CapExec: true, + Capabilities: map[testsuites.Capability]bool{ + testsuites.CapPersistence: true, + testsuites.CapFsGroup: true, + testsuites.CapBlock: true, + testsuites.CapExec: true, }, }, } } -func (a *awsDriver) GetDriverInfo() *DriverInfo { +func (a *awsDriver) GetDriverInfo() *testsuites.DriverInfo { return &a.driverInfo } @@ -1560,7 +1561,7 @@ func (a *awsDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.St ns := a.driverInfo.Framework.Namespace.Name suffix := fmt.Sprintf("%s-sc", a.driverInfo.Name) - return getStorageClass(provisioner, parameters, nil, ns, suffix) + return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) } func (a *awsDriver) GetClaimSize() string { diff --git a/test/e2e/storage/in_tree_volumes.go b/test/e2e/storage/in_tree_volumes.go index 603876150b5..11c9e73459d 100644 --- a/test/e2e/storage/in_tree_volumes.go +++ b/test/e2e/storage/in_tree_volumes.go @@ -27,7 +27,7 @@ import ( ) // List of testDrivers to be executed in below loop -var testDrivers = []func() drivers.TestDriver{ +var testDrivers = []func() testsuites.TestDriver{ drivers.InitNFSDriver, drivers.InitGlusterFSDriver, drivers.InitISCSIDriver, @@ -75,12 +75,12 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() { for _, initDriver := range testDrivers { curDriver := initDriver() - Context(drivers.GetDriverNameWithFeatureTags(curDriver), func() { + Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() { driver := curDriver BeforeEach(func() { // setupDriver - drivers.SetCommonDriverParameters(driver, f, config) + testsuites.SetCommonDriverParameters(driver, f, config) driver.CreateDriver() }) diff --git a/test/e2e/storage/testsuites/base.go b/test/e2e/storage/testsuites/base.go index b7555470342..c257b849620 100644 --- a/test/e2e/storage/testsuites/base.go +++ b/test/e2e/storage/testsuites/base.go @@ -30,7 +30,6 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/testpatterns" ) @@ -39,9 +38,9 @@ type TestSuite interface { // getTestSuiteInfo returns the TestSuiteInfo for this TestSuite getTestSuiteInfo() TestSuiteInfo // skipUnsupportedTest skips the test if this TestSuite is not suitable to be tested with the combination of TestPattern and TestDriver - skipUnsupportedTest(testpatterns.TestPattern, drivers.TestDriver) + skipUnsupportedTest(testpatterns.TestPattern, TestDriver) // execTest executes test of the testpattern for the driver - execTest(drivers.TestDriver, testpatterns.TestPattern) + execTest(TestDriver, testpatterns.TestPattern) } // TestSuiteInfo represents a set of parameters for TestSuite @@ -55,9 +54,9 @@ type TestSuiteInfo struct { type TestResource interface { // setupResource sets up test resources to be used for the tests with the // combination of TestDriver and TestPattern - setupResource(drivers.TestDriver, testpatterns.TestPattern) + setupResource(TestDriver, testpatterns.TestPattern) // cleanupResource clean up the test resources created in SetupResource - cleanupResource(drivers.TestDriver, testpatterns.TestPattern) + cleanupResource(TestDriver, testpatterns.TestPattern) } func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string { @@ -66,7 +65,7 @@ func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string { } // RunTestSuite runs all testpatterns of all testSuites for a driver -func RunTestSuite(f *framework.Framework, config framework.VolumeTestConfig, driver drivers.TestDriver, tsInits []func() TestSuite, tunePatternFunc func([]testpatterns.TestPattern) []testpatterns.TestPattern) { +func RunTestSuite(f *framework.Framework, config framework.VolumeTestConfig, driver TestDriver, tsInits []func() TestSuite, tunePatternFunc func([]testpatterns.TestPattern) []testpatterns.TestPattern) { for _, testSuiteInit := range tsInits { suite := testSuiteInit() patterns := tunePatternFunc(suite.getTestSuiteInfo().testPatterns) @@ -84,18 +83,18 @@ func RunTestSuite(f *framework.Framework, config framework.VolumeTestConfig, dri // 2. Check if fsType is supported by driver // 3. Check with driver specific logic // 4. Check with testSuite specific logic -func skipUnsupportedTest(suite TestSuite, driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func skipUnsupportedTest(suite TestSuite, driver TestDriver, pattern testpatterns.TestPattern) { dInfo := driver.GetDriverInfo() // 1. Check if Whether volType is supported by driver from its interface var isSupported bool switch pattern.VolType { case testpatterns.InlineVolume: - _, isSupported = driver.(drivers.InlineVolumeTestDriver) + _, isSupported = driver.(InlineVolumeTestDriver) case testpatterns.PreprovisionedPV: - _, isSupported = driver.(drivers.PreprovisionedPVTestDriver) + _, isSupported = driver.(PreprovisionedPVTestDriver) case testpatterns.DynamicPV: - _, isSupported = driver.(drivers.DynamicPVTestDriver) + _, isSupported = driver.(DynamicPVTestDriver) default: isSupported = false } @@ -121,7 +120,7 @@ func skipUnsupportedTest(suite TestSuite, driver drivers.TestDriver, pattern tes // See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource. // Also, see subpath.go in the same directory for how to extend and use it. type genericVolumeTestResource struct { - driver drivers.TestDriver + driver TestDriver volType string volSource *v1.VolumeSource pvc *v1.PersistentVolumeClaim @@ -134,7 +133,7 @@ type genericVolumeTestResource struct { var _ TestResource = &genericVolumeTestResource{} // setupResource sets up genericVolumeTestResource -func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (r *genericVolumeTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) { r.driver = driver dInfo := driver.GetDriverInfo() f := dInfo.Framework @@ -143,18 +142,18 @@ func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pat volType := pattern.VolType // Create volume for pre-provisioned volume tests - r.driverTestResource = drivers.CreateVolume(driver, volType) + r.driverTestResource = CreateVolume(driver, volType) switch volType { case testpatterns.InlineVolume: framework.Logf("Creating resource for inline volume") - if iDriver, ok := driver.(drivers.InlineVolumeTestDriver); ok { + if iDriver, ok := driver.(InlineVolumeTestDriver); ok { r.volSource = iDriver.GetVolumeSource(false, fsType, r.driverTestResource) r.volType = dInfo.Name } case testpatterns.PreprovisionedPV: framework.Logf("Creating resource for pre-provisioned PV") - if pDriver, ok := driver.(drivers.PreprovisionedPVTestDriver); ok { + if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok { pvSource := pDriver.GetPersistentVolumeSource(false, fsType, r.driverTestResource) if pvSource != nil { r.volSource, r.pv, r.pvc = createVolumeSourceWithPVCPV(f, dInfo.Name, pvSource, false) @@ -163,7 +162,7 @@ func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pat } case testpatterns.DynamicPV: framework.Logf("Creating resource for dynamic PV") - if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok { + if dDriver, ok := driver.(DynamicPVTestDriver); ok { claimSize := dDriver.GetClaimSize() r.sc = dDriver.GetDynamicProvisionStorageClass(fsType) @@ -188,7 +187,7 @@ func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pat } // cleanupResource cleans up genericVolumeTestResource -func (r *genericVolumeTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (r *genericVolumeTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) { dInfo := driver.GetDriverInfo() f := dInfo.Framework volType := pattern.VolType @@ -222,7 +221,7 @@ func (r *genericVolumeTestResource) cleanupResource(driver drivers.TestDriver, p } // Cleanup volume for pre-provisioned volume tests - drivers.DeleteVolume(driver, volType, r.driverTestResource) + DeleteVolume(driver, volType, r.driverTestResource) } func createVolumeSourceWithPVCPV( diff --git a/test/e2e/storage/testsuites/driveroperations.go b/test/e2e/storage/testsuites/driveroperations.go new file mode 100644 index 00000000000..41c2d3eb22f --- /dev/null +++ b/test/e2e/storage/testsuites/driveroperations.go @@ -0,0 +1,114 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testsuites + +import ( + "fmt" + + storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/test/e2e/framework" + "k8s.io/kubernetes/test/e2e/storage/testpatterns" +) + +// GetDriverNameWithFeatureTags returns driver name with feature tags +// For example) +// - [Driver: nfs] +// - [Driver: rbd][Feature:Volumes] +func GetDriverNameWithFeatureTags(driver TestDriver) string { + dInfo := driver.GetDriverInfo() + + return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag) +} + +// CreateVolume creates volume for test unless dynamicPV test +func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} { + switch volType { + case testpatterns.InlineVolume: + fallthrough + case testpatterns.PreprovisionedPV: + if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok { + return pDriver.CreateVolume(volType) + } + case testpatterns.DynamicPV: + // No need to create volume + default: + framework.Failf("Invalid volType specified: %v", volType) + } + return nil +} + +// DeleteVolume deletes volume for test unless dynamicPV test +func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResource interface{}) { + switch volType { + case testpatterns.InlineVolume: + fallthrough + case testpatterns.PreprovisionedPV: + if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok { + pDriver.DeleteVolume(volType, testResource) + } + case testpatterns.DynamicPV: + // No need to delete volume + default: + framework.Failf("Invalid volType specified: %v", volType) + } +} + +// SetCommonDriverParameters sets a common driver parameters to TestDriver +// This function is intended to be called in BeforeEach() inside test loop. +func SetCommonDriverParameters( + driver TestDriver, + f *framework.Framework, + config framework.VolumeTestConfig, +) { + dInfo := driver.GetDriverInfo() + + dInfo.Framework = f + dInfo.Config = config +} + +// GetStorageClass constructs a new StorageClass instance +// with a unique name that is based on namespace + suffix. +func GetStorageClass( + provisioner string, + parameters map[string]string, + bindingMode *storagev1.VolumeBindingMode, + ns string, + suffix string, +) *storagev1.StorageClass { + if bindingMode == nil { + defaultBindingMode := storagev1.VolumeBindingImmediate + bindingMode = &defaultBindingMode + } + return &storagev1.StorageClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "StorageClass", + }, + ObjectMeta: metav1.ObjectMeta{ + // Name must be unique, so let's base it on namespace name + Name: ns + "-" + suffix, + }, + Provisioner: provisioner, + Parameters: parameters, + VolumeBindingMode: bindingMode, + } +} + +// GetUniqueDriverName returns unique driver name that can be used parallelly in tests +func GetUniqueDriverName(driver TestDriver) string { + return fmt.Sprintf("%s-%s", driver.GetDriverInfo().Name, driver.GetDriverInfo().Framework.UniqueName) +} diff --git a/test/e2e/storage/testsuites/provisioning.go b/test/e2e/storage/testsuites/provisioning.go index 9315bbac84e..7524af9fc1c 100644 --- a/test/e2e/storage/testsuites/provisioning.go +++ b/test/e2e/storage/testsuites/provisioning.go @@ -31,7 +31,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/testpatterns" imageutils "k8s.io/kubernetes/test/utils/image" ) @@ -74,10 +73,10 @@ func (p *provisioningTestSuite) getTestSuiteInfo() TestSuiteInfo { return p.tsInfo } -func (p *provisioningTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) { +func (p *provisioningTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) { } -func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns.TestPattern) (provisioningTestResource, provisioningTestInput) { +func createProvisioningTestInput(driver TestDriver, pattern testpatterns.TestPattern) (provisioningTestResource, provisioningTestInput) { // Setup test resource for driver and testpattern resource := provisioningTestResource{} resource.setupResource(driver, pattern) @@ -100,7 +99,7 @@ func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns return resource, input } -func (p *provisioningTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (p *provisioningTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) { Context(getTestNameStr(p, pattern), func() { var ( resource provisioningTestResource @@ -132,7 +131,7 @@ func (p *provisioningTestSuite) execTest(driver drivers.TestDriver, pattern test } type provisioningTestResource struct { - driver drivers.TestDriver + driver TestDriver claimSize string sc *storage.StorageClass @@ -141,11 +140,11 @@ type provisioningTestResource struct { var _ TestResource = &provisioningTestResource{} -func (p *provisioningTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (p *provisioningTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) { // Setup provisioningTest resource switch pattern.VolType { case testpatterns.DynamicPV: - if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok { + if dDriver, ok := driver.(DynamicPVTestDriver); ok { p.sc = dDriver.GetDynamicProvisionStorageClass("") if p.sc == nil { framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", driver.GetDriverInfo().Name) @@ -161,7 +160,7 @@ func (p *provisioningTestResource) setupResource(driver drivers.TestDriver, patt } } -func (p *provisioningTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (p *provisioningTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) { } type provisioningTestInput struct { @@ -169,7 +168,7 @@ type provisioningTestInput struct { cs clientset.Interface pvc *v1.PersistentVolumeClaim sc *storage.StorageClass - dInfo *drivers.DriverInfo + dInfo *DriverInfo } func testProvisioning(input *provisioningTestInput) { @@ -187,7 +186,7 @@ func testProvisioning(input *provisioningTestInput) { }) It("should create and delete block persistent volumes", func() { - if !input.dInfo.Capabilities[drivers.CapBlock] { + if !input.dInfo.Capabilities[CapBlock] { framework.Skipf("Driver %q does not support BlockVolume - skipping", input.dInfo.Name) } block := v1.PersistentVolumeBlock diff --git a/test/e2e/storage/testsuites/subpath.go b/test/e2e/storage/testsuites/subpath.go index 66e1985c9ce..50daffeaeee 100644 --- a/test/e2e/storage/testsuites/subpath.go +++ b/test/e2e/storage/testsuites/subpath.go @@ -27,7 +27,6 @@ import ( "k8s.io/apimachinery/pkg/util/rand" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/testpatterns" "k8s.io/kubernetes/test/e2e/storage/utils" imageutils "k8s.io/kubernetes/test/utils/image" @@ -72,7 +71,7 @@ func (s *subPathTestSuite) getTestSuiteInfo() TestSuiteInfo { return s.tsInfo } -func (s *subPathTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) { +func (s *subPathTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) { } func createSubPathTestInput(pattern testpatterns.TestPattern, resource subPathTestResource) subPathTestInput { @@ -95,7 +94,7 @@ func createSubPathTestInput(pattern testpatterns.TestPattern, resource subPathTe } } -func (s *subPathTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (s *subPathTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) { Context(getTestNameStr(s, pattern), func() { var ( resource subPathTestResource @@ -137,7 +136,7 @@ type subPathTestResource struct { var _ TestResource = &subPathTestResource{} -func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (s *subPathTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) { s.driver = driver dInfo := s.driver.GetDriverInfo() f := dInfo.Framework @@ -150,7 +149,7 @@ func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern t // Setup subPath test dependent resource switch volType { case testpatterns.InlineVolume: - if iDriver, ok := driver.(drivers.InlineVolumeTestDriver); ok { + if iDriver, ok := driver.(InlineVolumeTestDriver); ok { s.roVolSource = iDriver.GetVolumeSource(true, fsType, s.genericVolumeTestResource.driverTestResource) } case testpatterns.PreprovisionedPV: @@ -182,7 +181,7 @@ func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern t s.formatPod.Spec.NodeSelector = config.NodeSelector } -func (s *subPathTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (s *subPathTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) { dInfo := driver.GetDriverInfo() f := dInfo.Framework diff --git a/test/e2e/storage/drivers/base.go b/test/e2e/storage/testsuites/testdriver.go similarity index 65% rename from test/e2e/storage/drivers/base.go rename to test/e2e/storage/testsuites/testdriver.go index b40ce8dcaa2..6af6ba70855 100644 --- a/test/e2e/storage/drivers/base.go +++ b/test/e2e/storage/testsuites/testdriver.go @@ -14,14 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -package drivers +package testsuites import ( - "fmt" - "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/storage/testpatterns" @@ -108,89 +105,3 @@ type DriverInfo struct { Framework *framework.Framework // Framework for the test Config framework.VolumeTestConfig // VolumeTestConfig for thet test } - -// GetDriverNameWithFeatureTags returns driver name with feature tags -// For example) -// - [Driver: nfs] -// - [Driver: rbd][Feature:Volumes] -func GetDriverNameWithFeatureTags(driver TestDriver) string { - dInfo := driver.GetDriverInfo() - - return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag) -} - -// CreateVolume creates volume for test unless dynamicPV test -func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} { - switch volType { - case testpatterns.InlineVolume: - fallthrough - case testpatterns.PreprovisionedPV: - if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok { - return pDriver.CreateVolume(volType) - } - case testpatterns.DynamicPV: - // No need to create volume - default: - framework.Failf("Invalid volType specified: %v", volType) - } - return nil -} - -// DeleteVolume deletes volume for test unless dynamicPV test -func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResource interface{}) { - switch volType { - case testpatterns.InlineVolume: - fallthrough - case testpatterns.PreprovisionedPV: - if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok { - pDriver.DeleteVolume(volType, testResource) - } - case testpatterns.DynamicPV: - // No need to delete volume - default: - framework.Failf("Invalid volType specified: %v", volType) - } -} - -// SetCommonDriverParameters sets a common driver parameters to TestDriver -// This function is intended to be called in BeforeEach() inside test loop. -func SetCommonDriverParameters( - driver TestDriver, - f *framework.Framework, - config framework.VolumeTestConfig, -) { - dInfo := driver.GetDriverInfo() - - dInfo.Framework = f - dInfo.Config = config -} - -func getStorageClass( - provisioner string, - parameters map[string]string, - bindingMode *storagev1.VolumeBindingMode, - ns string, - suffix string, -) *storagev1.StorageClass { - if bindingMode == nil { - defaultBindingMode := storagev1.VolumeBindingImmediate - bindingMode = &defaultBindingMode - } - return &storagev1.StorageClass{ - TypeMeta: metav1.TypeMeta{ - Kind: "StorageClass", - }, - ObjectMeta: metav1.ObjectMeta{ - // Name must be unique, so let's base it on namespace name - Name: ns + "-" + suffix, - }, - Provisioner: provisioner, - Parameters: parameters, - VolumeBindingMode: bindingMode, - } -} - -// GetUniqueDriverName returns unique driver name that can be used parallelly in tests -func GetUniqueDriverName(driver TestDriver) string { - return fmt.Sprintf("%s-%s", driver.GetDriverInfo().Name, driver.GetDriverInfo().Framework.UniqueName) -} diff --git a/test/e2e/storage/testsuites/volume_io.go b/test/e2e/storage/testsuites/volume_io.go index 3b291517778..eed39c78c97 100644 --- a/test/e2e/storage/testsuites/volume_io.go +++ b/test/e2e/storage/testsuites/volume_io.go @@ -35,7 +35,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/testpatterns" "k8s.io/kubernetes/test/e2e/storage/utils" ) @@ -75,7 +74,7 @@ func (t *volumeIOTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } -func (t *volumeIOTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) { +func (t *volumeIOTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) { } func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericVolumeTestResource) volumeIOTestInput { @@ -90,7 +89,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name) } - if dInfo.Capabilities[drivers.CapFsGroup] { + if dInfo.Capabilities[CapFsGroup] { fsGroupVal := int64(1234) fsGroup = &fsGroupVal } @@ -108,7 +107,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV } } -func (t *volumeIOTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeIOTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) { Context(getTestNameStr(t, pattern), func() { var ( resource genericVolumeTestResource diff --git a/test/e2e/storage/testsuites/volumemode.go b/test/e2e/storage/testsuites/volumemode.go index b2f113cd037..86888bd0339 100644 --- a/test/e2e/storage/testsuites/volumemode.go +++ b/test/e2e/storage/testsuites/volumemode.go @@ -27,7 +27,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/testpatterns" "k8s.io/kubernetes/test/e2e/storage/utils" ) @@ -62,7 +61,7 @@ func (t *volumeModeTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } -func (t *volumeModeTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) { +func (t *volumeModeTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) { } func createVolumeModeTestInput(pattern testpatterns.TestPattern, resource volumeModeTestResource) volumeModeTestInput { @@ -78,13 +77,13 @@ func createVolumeModeTestInput(pattern testpatterns.TestPattern, resource volume testVolType: pattern.VolType, nodeName: dInfo.Config.ClientNodeName, volMode: pattern.VolMode, - isBlockSupported: dInfo.Capabilities[drivers.CapBlock], + isBlockSupported: dInfo.Capabilities[CapBlock], } } -func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver drivers.TestDriver) func(*volumeModeTestInput) { +func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver TestDriver) func(*volumeModeTestInput) { dInfo := driver.GetDriverInfo() - isBlockSupported := dInfo.Capabilities[drivers.CapBlock] + isBlockSupported := dInfo.Capabilities[CapBlock] volMode := pattern.VolMode volType := pattern.VolType @@ -105,7 +104,7 @@ func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver drivers.Test return nil } -func (t *volumeModeTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (t *volumeModeTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) { Context(getTestNameStr(t, pattern), func() { var ( resource volumeModeTestResource @@ -141,7 +140,7 @@ func (t *volumeModeTestSuite) execTest(driver drivers.TestDriver, pattern testpa } type volumeModeTestResource struct { - driver drivers.TestDriver + driver TestDriver sc *storagev1.StorageClass pvc *v1.PersistentVolumeClaim @@ -152,7 +151,7 @@ type volumeModeTestResource struct { var _ TestResource = &volumeModeTestResource{} -func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (s *volumeModeTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) { s.driver = driver dInfo := driver.GetDriverInfo() f := dInfo.Framework @@ -168,7 +167,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter ) // Create volume for pre-provisioned volume tests - s.driverTestResource = drivers.CreateVolume(driver, volType) + s.driverTestResource = CreateVolume(driver, volType) switch volType { case testpatterns.PreprovisionedPV: @@ -177,7 +176,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter } else if volMode == v1.PersistentVolumeFilesystem { scName = fmt.Sprintf("%s-%s-sc-for-file", ns.Name, dInfo.Name) } - if pDriver, ok := driver.(drivers.PreprovisionedPVTestDriver); ok { + if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok { pvSource = pDriver.GetPersistentVolumeSource(false, fsType, s.driverTestResource) if pvSource == nil { framework.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name) @@ -189,7 +188,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter s.pvc = framework.MakePersistentVolumeClaim(pvcConfig, ns.Name) } case testpatterns.DynamicPV: - if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok { + if dDriver, ok := driver.(DynamicPVTestDriver); ok { s.sc = dDriver.GetDynamicProvisionStorageClass(fsType) if s.sc == nil { framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name) @@ -206,7 +205,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter } } -func (s *volumeModeTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (s *volumeModeTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) { dInfo := driver.GetDriverInfo() f := dInfo.Framework cs := f.ClientSet @@ -224,7 +223,7 @@ func (s *volumeModeTestResource) cleanupResource(driver drivers.TestDriver, patt } // Cleanup volume for pre-provisioned volume tests - drivers.DeleteVolume(driver, volType, s.driverTestResource) + DeleteVolume(driver, volType, s.driverTestResource) } type volumeModeTestInput struct { diff --git a/test/e2e/storage/testsuites/volumes.go b/test/e2e/storage/testsuites/volumes.go index e8bd845bcfd..8c6ef94a546 100644 --- a/test/e2e/storage/testsuites/volumes.go +++ b/test/e2e/storage/testsuites/volumes.go @@ -31,7 +31,6 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/test/e2e/framework" - "k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/testpatterns" imageutils "k8s.io/kubernetes/test/utils/image" ) @@ -73,19 +72,19 @@ func (t *volumesTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } -func (t *volumesTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) { +func (t *volumesTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) { } -func skipPersistenceTest(driver drivers.TestDriver) { +func skipPersistenceTest(driver TestDriver) { dInfo := driver.GetDriverInfo() - if !dInfo.Capabilities[drivers.CapPersistence] { + if !dInfo.Capabilities[CapPersistence] { framework.Skipf("Driver %q does not provide persistency - skipping", dInfo.Name) } } -func skipExecTest(driver drivers.TestDriver) { +func skipExecTest(driver TestDriver) { dInfo := driver.GetDriverInfo() - if !dInfo.Capabilities[drivers.CapExec] { + if !dInfo.Capabilities[CapExec] { framework.Skipf("Driver %q does not support exec - skipping", dInfo.Name) } } @@ -101,7 +100,7 @@ func createVolumesTestInput(pattern testpatterns.TestPattern, resource genericVo framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name) } - if dInfo.Capabilities[drivers.CapFsGroup] { + if dInfo.Capabilities[CapFsGroup] { fsGroupVal := int64(1234) fsGroup = &fsGroupVal } @@ -124,7 +123,7 @@ func createVolumesTestInput(pattern testpatterns.TestPattern, resource genericVo } } -func (t *volumesTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) { +func (t *volumesTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) { Context(getTestNameStr(t, pattern), func() { var ( resource genericVolumeTestResource