diff --git a/test/e2e/storage/drivers/csi.go b/test/e2e/storage/drivers/csi.go index ff985bc63a1..6d567ae3e52 100644 --- a/test/e2e/storage/drivers/csi.go +++ b/test/e2e/storage/drivers/csi.go @@ -149,6 +149,7 @@ func InitHostPathCSIDriver() storageframework.TestDriver { storageframework.CapOnlineExpansion: true, storageframework.CapSingleNodeVolume: true, storageframework.CapReadWriteOncePod: true, + storageframework.CapMultiplePVsSameID: true, // This is needed for the // testsuites/volumelimits.go `should support volume limits` @@ -487,10 +488,11 @@ func InitMockCSIDriver(driverOpts CSIMockDriverOpts) MockCSITestDriver { "", // Default fsType ), Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: false, - storageframework.CapFsGroup: false, - storageframework.CapExec: false, - storageframework.CapVolumeLimits: true, + storageframework.CapPersistence: false, + storageframework.CapFsGroup: false, + storageframework.CapExec: false, + storageframework.CapVolumeLimits: true, + storageframework.CapMultiplePVsSameID: true, }, }, manifests: driverManifests, @@ -807,6 +809,7 @@ func InitGcePDCSIDriver() storageframework.TestDriver { storageframework.CapNodeExpansion: true, storageframework.CapSnapshotDataSource: true, storageframework.CapReadWriteOncePod: true, + storageframework.CapMultiplePVsSameID: true, }, RequiredAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, TopologyKeys: []string{GCEPDCSIZoneTopologyKey}, diff --git a/test/e2e/storage/drivers/in_tree.go b/test/e2e/storage/drivers/in_tree.go index a1f2f4afc0b..7574ad30455 100644 --- a/test/e2e/storage/drivers/in_tree.go +++ b/test/e2e/storage/drivers/in_tree.go @@ -105,10 +105,11 @@ func InitNFSDriver() storageframework.TestDriver { SupportedMountOption: sets.NewString("relatime"), RequiredMountOption: sets.NewString("vers=4.1"), Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapExec: true, - storageframework.CapRWX: true, - storageframework.CapMultiPODs: true, + storageframework.CapPersistence: true, + storageframework.CapExec: true, + storageframework.CapRWX: true, + storageframework.CapMultiPODs: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -249,12 +250,13 @@ func InitISCSIDriver() storageframework.TestDriver { ), TopologyKeys: []string{v1.LabelHostname}, Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapFsGroup: true, - storageframework.CapBlock: true, - storageframework.CapExec: true, - storageframework.CapMultiPODs: true, - storageframework.CapTopology: true, + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -431,11 +433,12 @@ func InitRbdDriver() storageframework.TestDriver { "ext4", ), Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapFsGroup: true, - storageframework.CapBlock: true, - storageframework.CapExec: true, - storageframework.CapMultiPODs: true, + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -559,10 +562,11 @@ func InitCephFSDriver() storageframework.TestDriver { "", // Default fsType ), Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapExec: true, - storageframework.CapRWX: true, - storageframework.CapMultiPODs: true, + storageframework.CapPersistence: true, + storageframework.CapExec: true, + storageframework.CapRWX: true, + storageframework.CapMultiPODs: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -662,10 +666,11 @@ func InitHostPathDriver() storageframework.TestDriver { ), TopologyKeys: []string{v1.LabelHostname}, Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapMultiPODs: true, - storageframework.CapSingleNodeVolume: true, - storageframework.CapTopology: true, + storageframework.CapPersistence: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -737,10 +742,11 @@ func InitHostPathSymlinkDriver() storageframework.TestDriver { ), TopologyKeys: []string{v1.LabelHostname}, Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapMultiPODs: true, - storageframework.CapSingleNodeVolume: true, - storageframework.CapTopology: true, + storageframework.CapPersistence: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -966,8 +972,9 @@ func InitGcePdDriver() storageframework.TestDriver { storageframework.CapNodeExpansion: true, // GCE supports volume limits, but the test creates large // number of volumes and times out test suites. - storageframework.CapVolumeLimits: false, - storageframework.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -998,8 +1005,9 @@ func InitWindowsGcePdDriver() storageframework.TestDriver { storageframework.CapMultiPODs: true, // GCE supports volume limits, but the test creates large // number of volumes and times out test suites. - storageframework.CapVolumeLimits: false, - storageframework.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -1136,12 +1144,13 @@ func InitVSphereDriver() storageframework.TestDriver { ), TopologyKeys: []string{v1.LabelFailureDomainBetaZone}, Capabilities: map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapFsGroup: true, - storageframework.CapExec: true, - storageframework.CapMultiPODs: true, - storageframework.CapTopology: true, - storageframework.CapBlock: true, + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapTopology: true, + storageframework.CapBlock: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -1282,8 +1291,9 @@ func InitAzureDiskDriver() storageframework.TestDriver { storageframework.CapMultiPODs: true, // Azure supports volume limits, but the test creates large // number of volumes and times out test suites. - storageframework.CapVolumeLimits: false, - storageframework.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -1431,8 +1441,9 @@ func InitAwsDriver() storageframework.TestDriver { storageframework.CapOnlineExpansion: true, // AWS supports volume limits, but the test creates large // number of volumes and times out test suites. - storageframework.CapVolumeLimits: false, - storageframework.CapTopology: true, + storageframework.CapVolumeLimits: false, + storageframework.CapTopology: true, + storageframework.CapMultiplePVsSameID: true, }, }, } @@ -1551,21 +1562,23 @@ type localVolume struct { var ( // capabilities defaultLocalVolumeCapabilities = map[storageframework.Capability]bool{ - storageframework.CapPersistence: true, - storageframework.CapFsGroup: true, - storageframework.CapBlock: false, - storageframework.CapExec: true, - storageframework.CapMultiPODs: true, - storageframework.CapSingleNodeVolume: true, + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: false, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapMultiplePVsSameID: true, } localVolumeCapabitilies = map[utils.LocalVolumeType]map[storageframework.Capability]bool{ utils.LocalVolumeBlock: { - storageframework.CapPersistence: true, - storageframework.CapFsGroup: true, - storageframework.CapBlock: true, - storageframework.CapExec: true, - storageframework.CapMultiPODs: true, - storageframework.CapSingleNodeVolume: true, + storageframework.CapPersistence: true, + storageframework.CapFsGroup: true, + storageframework.CapBlock: true, + storageframework.CapExec: true, + storageframework.CapMultiPODs: true, + storageframework.CapSingleNodeVolume: true, + storageframework.CapMultiplePVsSameID: true, }, } // fstype @@ -1796,6 +1809,7 @@ func InitAzureFileDriver() storageframework.TestDriver { storageframework.CapMultiPODs: true, storageframework.CapControllerExpansion: true, storageframework.CapNodeExpansion: true, + storageframework.CapMultiplePVsSameID: true, }, }, } diff --git a/test/e2e/storage/framework/testdriver.go b/test/e2e/storage/framework/testdriver.go index 5429cea145f..87d0d4e2316 100644 --- a/test/e2e/storage/framework/testdriver.go +++ b/test/e2e/storage/framework/testdriver.go @@ -190,6 +190,16 @@ const ( // - csi-attacher:v3.3.0+ // - csi-resizer:v1.3.0+ CapReadWriteOncePod Capability = "readWriteOncePod" + + // The driver can handle two PersistentVolumes with the same VolumeHandle (= volume_id in CSI spec). + // This capability is highly recommended for volumes that support ReadWriteMany access mode, + // because creating multiple PVs for the same VolumeHandle is frequently used to share a single + // volume among multiple namespaces. + // Note that this capability needs to be disabled only for CSI drivers that break CSI boundary and + // inspect Kubernetes PersistentVolume objects. A CSI driver that implements only CSI and does not + // talk to Kubernetes API server in any way should keep this capability enabled, because + // they will see the same NodeStage / NodePublish requests as if only one PV existed. + CapMultiplePVsSameID Capability = "multiplePVsSameID" ) // DriverInfo represents static information about a TestDriver. diff --git a/test/e2e/storage/testsuites/provisioning.go b/test/e2e/storage/testsuites/provisioning.go index 93b4696b235..fcd9ffca269 100644 --- a/test/e2e/storage/testsuites/provisioning.go +++ b/test/e2e/storage/testsuites/provisioning.go @@ -530,6 +530,10 @@ func (p *provisioningTestSuite) DefineTests(driver storageframework.TestDriver, e2eskipper.Skipf("skipping multiple PV mount test for block mode") } + if !dInfo.Capabilities[storageframework.CapMultiplePVsSameID] { + e2eskipper.Skipf("this driver does not support multiple PVs with the same volumeHandle") + } + init() defer cleanup()