Add storage framework and address comments

This commit is contained in:
Jiawei Wang 2020-12-10 22:48:06 -08:00
parent 988563f8f5
commit 356bea6c9f
37 changed files with 941 additions and 941 deletions

View File

@ -88,8 +88,8 @@ go_library(
"//test/e2e/framework/statefulset:go_default_library", "//test/e2e/framework/statefulset:go_default_library",
"//test/e2e/framework/testfiles:go_default_library", "//test/e2e/framework/testfiles:go_default_library",
"//test/e2e/framework/volume:go_default_library", "//test/e2e/framework/volume:go_default_library",
"//test/e2e/storage/api:go_default_library",
"//test/e2e/storage/drivers:go_default_library", "//test/e2e/storage/drivers:go_default_library",
"//test/e2e/storage/framework:go_default_library",
"//test/e2e/storage/testsuites:go_default_library", "//test/e2e/storage/testsuites:go_default_library",
"//test/e2e/storage/utils:go_default_library", "//test/e2e/storage/utils:go_default_library",
"//test/utils/image:go_default_library", "//test/utils/image:go_default_library",
@ -115,9 +115,9 @@ filegroup(
name = "all-srcs", name = "all-srcs",
srcs = [ srcs = [
":package-srcs", ":package-srcs",
"//test/e2e/storage/api:all-srcs",
"//test/e2e/storage/drivers:all-srcs", "//test/e2e/storage/drivers:all-srcs",
"//test/e2e/storage/external:all-srcs", "//test/e2e/storage/external:all-srcs",
"//test/e2e/storage/framework:all-srcs",
"//test/e2e/storage/podlogs:all-srcs", "//test/e2e/storage/podlogs:all-srcs",
"//test/e2e/storage/testsuites:all-srcs", "//test/e2e/storage/testsuites:all-srcs",
"//test/e2e/storage/utils:all-srcs", "//test/e2e/storage/utils:all-srcs",

View File

@ -51,8 +51,8 @@ import (
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api"
"k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/drivers"
storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/testsuites"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
imageutils "k8s.io/kubernetes/test/utils/image" imageutils "k8s.io/kubernetes/test/utils/image"
@ -121,13 +121,13 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
type mockDriverSetup struct { type mockDriverSetup struct {
cs clientset.Interface cs clientset.Interface
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
testCleanups []func() testCleanups []func()
pods []*v1.Pod pods []*v1.Pod
pvcs []*v1.PersistentVolumeClaim pvcs []*v1.PersistentVolumeClaim
sc map[string]*storagev1.StorageClass sc map[string]*storagev1.StorageClass
vsc map[string]*unstructured.Unstructured vsc map[string]*unstructured.Unstructured
driver storageapi.TestDriver driver storageframework.TestDriver
provisioner string provisioner string
tp testParameters tp testParameters
} }
@ -189,7 +189,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
createPod := func(ephemeral bool) (class *storagev1.StorageClass, claim *v1.PersistentVolumeClaim, pod *v1.Pod) { createPod := func(ephemeral bool) (class *storagev1.StorageClass, claim *v1.PersistentVolumeClaim, pod *v1.Pod) {
ginkgo.By("Creating pod") ginkgo.By("Creating pod")
var sc *storagev1.StorageClass var sc *storagev1.StorageClass
if dDriver, ok := m.driver.(storageapi.DynamicPVTestDriver); ok { if dDriver, ok := m.driver.(storageframework.DynamicPVTestDriver); ok {
sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") sc = dDriver.GetDynamicProvisionStorageClass(m.config, "")
} }
scTest := testsuites.StorageClassTest{ scTest := testsuites.StorageClassTest{
@ -238,7 +238,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
ginkgo.By("Creating pod with fsGroup") ginkgo.By("Creating pod with fsGroup")
nodeSelection := m.config.ClientNodeSelection nodeSelection := m.config.ClientNodeSelection
var sc *storagev1.StorageClass var sc *storagev1.StorageClass
if dDriver, ok := m.driver.(storageapi.DynamicPVTestDriver); ok { if dDriver, ok := m.driver.(storageframework.DynamicPVTestDriver); ok {
sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") sc = dDriver.GetDynamicProvisionStorageClass(m.config, "")
} }
scTest := testsuites.StorageClassTest{ scTest := testsuites.StorageClassTest{
@ -1247,7 +1247,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
enableSnapshot: true, enableSnapshot: true,
javascriptHooks: scripts, javascriptHooks: scripts,
}) })
sDriver, ok := m.driver.(storageapi.SnapshottableTestDriver) sDriver, ok := m.driver.(storageframework.SnapshottableTestDriver)
if !ok { if !ok {
e2eskipper.Skipf("mock driver %s does not support snapshots -- skipping", m.driver.GetDriverInfo().Name) e2eskipper.Skipf("mock driver %s does not support snapshots -- skipping", m.driver.GetDriverInfo().Name)
@ -1257,7 +1257,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
defer cleanup() defer cleanup()
var sc *storagev1.StorageClass var sc *storagev1.StorageClass
if dDriver, ok := m.driver.(storageapi.DynamicPVTestDriver); ok { if dDriver, ok := m.driver.(storageframework.DynamicPVTestDriver); ok {
sc = dDriver.GetDynamicProvisionStorageClass(m.config, "") sc = dDriver.GetDynamicProvisionStorageClass(m.config, "")
} }
ginkgo.By("Creating storage class") ginkgo.By("Creating storage class")
@ -1272,7 +1272,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
ginkgo.By("Creating snapshot") ginkgo.By("Creating snapshot")
// TODO: Test VolumeSnapshots with Retain policy // TODO: Test VolumeSnapshots with Retain policy
snapshotClass, snapshot := storageapi.CreateSnapshot(sDriver, m.config, storageapi.DynamicSnapshotDelete, claim.Name, claim.Namespace, f.Timeouts) snapshotClass, snapshot := storageframework.CreateSnapshot(sDriver, m.config, storageframework.DynamicSnapshotDelete, claim.Name, claim.Namespace, f.Timeouts)
framework.ExpectNoError(err, "failed to create snapshot") framework.ExpectNoError(err, "failed to create snapshot")
m.vsc[snapshotClass.GetName()] = snapshotClass m.vsc[snapshotClass.GetName()] = snapshotClass
volumeSnapshotName := snapshot.GetName() volumeSnapshotName := snapshot.GetName()
@ -1306,7 +1306,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
} }
ginkgo.By(fmt.Sprintf("Get VolumeSnapshotContent bound to VolumeSnapshot %s", snapshot.GetName())) ginkgo.By(fmt.Sprintf("Get VolumeSnapshotContent bound to VolumeSnapshot %s", snapshot.GetName()))
snapshotContent := storageapi.GetSnapshotContentFromSnapshot(m.config.Framework.DynamicClient, snapshot) snapshotContent := utils.GetSnapshotContentFromSnapshot(m.config.Framework.DynamicClient, snapshot)
volumeSnapshotContentName := snapshotContent.GetName() volumeSnapshotContentName := snapshotContent.GetName()
ginkgo.By(fmt.Sprintf("Verify VolumeSnapshotContent %s contains finalizer %s", snapshot.GetName(), volumeSnapshotContentFinalizer)) ginkgo.By(fmt.Sprintf("Verify VolumeSnapshotContent %s contains finalizer %s", snapshot.GetName(), volumeSnapshotContentFinalizer))
@ -1336,7 +1336,7 @@ var _ = utils.SIGDescribe("CSI mock volume", func() {
framework.ExpectNoError(err) framework.ExpectNoError(err)
ginkgo.By("Delete VolumeSnapshot") ginkgo.By("Delete VolumeSnapshot")
err = storageapi.DeleteAndWaitSnapshot(m.config.Framework.DynamicClient, f.Namespace.Name, volumeSnapshotName, framework.Poll, framework.SnapshotDeleteTimeout) err = utils.DeleteAndWaitSnapshot(m.config.Framework.DynamicClient, f.Namespace.Name, volumeSnapshotName, framework.Poll, framework.SnapshotDeleteTimeout)
framework.ExpectNoError(err, fmt.Sprintf("failed to delete VolumeSnapshot %s", volumeSnapshotName)) framework.ExpectNoError(err, fmt.Sprintf("failed to delete VolumeSnapshot %s", volumeSnapshotName))
ginkgo.By(fmt.Sprintf("Wait for VolumeSnapshotContent %s to be deleted", volumeSnapshotContentName)) ginkgo.By(fmt.Sprintf("Wait for VolumeSnapshotContent %s to be deleted", volumeSnapshotContentName))

View File

@ -17,8 +17,8 @@ limitations under the License.
package storage package storage
import ( import (
"k8s.io/kubernetes/test/e2e/storage/api"
"k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/drivers"
storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/testsuites"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
@ -26,7 +26,7 @@ import (
) )
// List of testDrivers to be executed in below loop // List of testDrivers to be executed in below loop
var csiTestDrivers = []func() api.TestDriver{ var csiTestDrivers = []func() storageframework.TestDriver{
drivers.InitHostPathCSIDriver, drivers.InitHostPathCSIDriver,
drivers.InitGcePDCSIDriver, drivers.InitGcePDCSIDriver,
// Don't run tests with mock driver (drivers.InitMockCSIDriver), it does not provide persistent storage. // Don't run tests with mock driver (drivers.InitMockCSIDriver), it does not provide persistent storage.
@ -37,8 +37,8 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
for _, initDriver := range csiTestDrivers { for _, initDriver := range csiTestDrivers {
curDriver := initDriver() curDriver := initDriver()
ginkgo.Context(api.GetDriverNameWithFeatureTags(curDriver), func() { ginkgo.Context(storageframework.GetDriverNameWithFeatureTags(curDriver), func() {
api.DefineTestSuites(curDriver, testsuites.CSISuites) storageframework.DefineTestSuites(curDriver, testsuites.CSISuites)
}) })
} }
}) })

View File

@ -29,7 +29,7 @@ go_library(
"//test/e2e/framework/pv:go_default_library", "//test/e2e/framework/pv:go_default_library",
"//test/e2e/framework/skipper:go_default_library", "//test/e2e/framework/skipper:go_default_library",
"//test/e2e/framework/volume:go_default_library", "//test/e2e/framework/volume:go_default_library",
"//test/e2e/storage/api:go_default_library", "//test/e2e/storage/framework:go_default_library",
"//test/e2e/storage/utils:go_default_library", "//test/e2e/storage/utils:go_default_library",
"//test/e2e/storage/vsphere:go_default_library", "//test/e2e/storage/vsphere:go_default_library",
"//test/utils/image:go_default_library", "//test/utils/image:go_default_library",

View File

@ -57,7 +57,7 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -70,18 +70,18 @@ const (
// hostpathCSI // hostpathCSI
type hostpathCSIDriver struct { type hostpathCSIDriver struct {
driverInfo storageapi.DriverInfo driverInfo storageframework.DriverInfo
manifests []string manifests []string
cleanupHandle framework.CleanupActionHandle cleanupHandle framework.CleanupActionHandle
volumeAttributes []map[string]string volumeAttributes []map[string]string
} }
func initHostPathCSIDriver(name string, capabilities map[storageapi.Capability]bool, volumeAttributes []map[string]string, manifests ...string) storageapi.TestDriver { func initHostPathCSIDriver(name string, capabilities map[storageframework.Capability]bool, volumeAttributes []map[string]string, manifests ...string) storageframework.TestDriver {
return &hostpathCSIDriver{ return &hostpathCSIDriver{
driverInfo: storageapi.DriverInfo{ driverInfo: storageframework.DriverInfo{
Name: name, Name: name,
FeatureTag: "", FeatureTag: "",
MaxFileSize: storageapi.FileSizeMedium, MaxFileSize: storageframework.FileSizeMedium,
SupportedFsType: sets.NewString( SupportedFsType: sets.NewString(
"", // Default fsType "", // Default fsType
), ),
@ -89,11 +89,11 @@ func initHostPathCSIDriver(name string, capabilities map[storageapi.Capability]b
Min: "1Mi", Min: "1Mi",
}, },
Capabilities: capabilities, Capabilities: capabilities,
StressTestOptions: &storageapi.StressTestOptions{ StressTestOptions: &storageframework.StressTestOptions{
NumPods: 10, NumPods: 10,
NumRestarts: 10, NumRestarts: 10,
}, },
VolumeSnapshotStressTestOptions: &storageapi.VolumeSnapshotStressTestOptions{ VolumeSnapshotStressTestOptions: &storageframework.VolumeSnapshotStressTestOptions{
NumPods: 10, NumPods: 10,
NumSnapshots: 10, NumSnapshots: 10,
}, },
@ -103,22 +103,22 @@ func initHostPathCSIDriver(name string, capabilities map[storageapi.Capability]b
} }
} }
var _ storageapi.TestDriver = &hostpathCSIDriver{} var _ storageframework.TestDriver = &hostpathCSIDriver{}
var _ storageapi.DynamicPVTestDriver = &hostpathCSIDriver{} var _ storageframework.DynamicPVTestDriver = &hostpathCSIDriver{}
var _ storageapi.SnapshottableTestDriver = &hostpathCSIDriver{} var _ storageframework.SnapshottableTestDriver = &hostpathCSIDriver{}
var _ storageapi.EphemeralTestDriver = &hostpathCSIDriver{} var _ storageframework.EphemeralTestDriver = &hostpathCSIDriver{}
// InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface // InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface
func InitHostPathCSIDriver() storageapi.TestDriver { func InitHostPathCSIDriver() storageframework.TestDriver {
capabilities := map[storageapi.Capability]bool{ capabilities := map[storageframework.Capability]bool{
storageapi.CapPersistence: true, storageframework.CapPersistence: true,
storageapi.CapSnapshotDataSource: true, storageframework.CapSnapshotDataSource: true,
storageapi.CapMultiPODs: true, storageframework.CapMultiPODs: true,
storageapi.CapBlock: true, storageframework.CapBlock: true,
storageapi.CapPVCDataSource: true, storageframework.CapPVCDataSource: true,
storageapi.CapControllerExpansion: true, storageframework.CapControllerExpansion: true,
storageapi.CapSingleNodeVolume: true, storageframework.CapSingleNodeVolume: true,
storageapi.CapVolumeLimits: true, storageframework.CapVolumeLimits: true,
} }
return initHostPathCSIDriver("csi-hostpath", return initHostPathCSIDriver("csi-hostpath",
capabilities, capabilities,
@ -140,43 +140,43 @@ func InitHostPathCSIDriver() storageapi.TestDriver {
) )
} }
func (h *hostpathCSIDriver) GetDriverInfo() *storageapi.DriverInfo { func (h *hostpathCSIDriver) GetDriverInfo() *storageframework.DriverInfo {
return &h.driverInfo return &h.driverInfo
} }
func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern storageapi.TestPattern) { func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) {
if pattern.VolType == storageapi.CSIInlineVolume && len(h.volumeAttributes) == 0 { if pattern.VolType == storageframework.CSIInlineVolume && len(h.volumeAttributes) == 0 {
e2eskipper.Skipf("%s has no volume attributes defined, doesn't support ephemeral inline volumes", h.driverInfo.Name) e2eskipper.Skipf("%s has no volume attributes defined, doesn't support ephemeral inline volumes", h.driverInfo.Name)
} }
} }
func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(config *storageapi.PerTestConfig, fsType string) *storagev1.StorageClass { func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass {
provisioner := config.GetUniqueDriverName() provisioner := config.GetUniqueDriverName()
parameters := map[string]string{} parameters := map[string]string{}
ns := config.Framework.Namespace.Name ns := config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", provisioner) suffix := fmt.Sprintf("%s-sc", provisioner)
return storageapi.GetStorageClass(provisioner, parameters, nil, ns, suffix) return storageframework.GetStorageClass(provisioner, parameters, nil, ns, suffix)
} }
func (h *hostpathCSIDriver) GetVolume(config *storageapi.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) { func (h *hostpathCSIDriver) GetVolume(config *storageframework.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) {
return h.volumeAttributes[volumeNumber%len(h.volumeAttributes)], false /* not shared */, false /* read-write */ return h.volumeAttributes[volumeNumber%len(h.volumeAttributes)], false /* not shared */, false /* read-write */
} }
func (h *hostpathCSIDriver) GetCSIDriverName(config *storageapi.PerTestConfig) string { func (h *hostpathCSIDriver) GetCSIDriverName(config *storageframework.PerTestConfig) string {
return config.GetUniqueDriverName() return config.GetUniqueDriverName()
} }
func (h *hostpathCSIDriver) GetSnapshotClass(config *storageapi.PerTestConfig) *unstructured.Unstructured { func (h *hostpathCSIDriver) GetSnapshotClass(config *storageframework.PerTestConfig) *unstructured.Unstructured {
snapshotter := config.GetUniqueDriverName() snapshotter := config.GetUniqueDriverName()
parameters := map[string]string{} parameters := map[string]string{}
ns := config.Framework.Namespace.Name ns := config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-vsc", snapshotter) suffix := fmt.Sprintf("%s-vsc", snapshotter)
return storageapi.GetSnapshotClass(snapshotter, parameters, ns, suffix) return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix)
} }
func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTestConfig, func()) { func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) {
// Create secondary namespace which will be used for creating driver // Create secondary namespace which will be used for creating driver
driverNamespace := utils.CreateDriverNamespace(f) driverNamespace := utils.CreateDriverNamespace(f)
ns2 := driverNamespace.Name ns2 := driverNamespace.Name
@ -189,7 +189,7 @@ func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.Per
// The hostpath CSI driver only works when everything runs on the same node. // The hostpath CSI driver only works when everything runs on the same node.
node, err := e2enode.GetRandomReadySchedulableNode(cs) node, err := e2enode.GetRandomReadySchedulableNode(cs)
framework.ExpectNoError(err) framework.ExpectNoError(err)
config := &storageapi.PerTestConfig{ config := &storageframework.PerTestConfig{
Driver: h, Driver: h,
Prefix: "hostpath", Prefix: "hostpath",
Framework: f, Framework: f,
@ -242,7 +242,7 @@ func (h *hostpathCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.Per
// mockCSI // mockCSI
type mockCSIDriver struct { type mockCSIDriver struct {
driverInfo storageapi.DriverInfo driverInfo storageframework.DriverInfo
manifests []string manifests []string
podInfo *bool podInfo *bool
storageCapacity *bool storageCapacity *bool
@ -274,12 +274,12 @@ type CSIMockDriverOpts struct {
FSGroupPolicy *storagev1.FSGroupPolicy FSGroupPolicy *storagev1.FSGroupPolicy
} }
var _ storageapi.TestDriver = &mockCSIDriver{} var _ storageframework.TestDriver = &mockCSIDriver{}
var _ storageapi.DynamicPVTestDriver = &mockCSIDriver{} var _ storageframework.DynamicPVTestDriver = &mockCSIDriver{}
var _ storageapi.SnapshottableTestDriver = &mockCSIDriver{} var _ storageframework.SnapshottableTestDriver = &mockCSIDriver{}
// InitMockCSIDriver returns a mockCSIDriver that implements TestDriver interface // InitMockCSIDriver returns a mockCSIDriver that implements TestDriver interface
func InitMockCSIDriver(driverOpts CSIMockDriverOpts) storageapi.TestDriver { func InitMockCSIDriver(driverOpts CSIMockDriverOpts) storageframework.TestDriver {
driverManifests := []string{ driverManifests := []string{
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml", "test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml", "test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml",
@ -307,18 +307,18 @@ func InitMockCSIDriver(driverOpts CSIMockDriverOpts) storageapi.TestDriver {
} }
return &mockCSIDriver{ return &mockCSIDriver{
driverInfo: storageapi.DriverInfo{ driverInfo: storageframework.DriverInfo{
Name: "csi-mock", Name: "csi-mock",
FeatureTag: "", FeatureTag: "",
MaxFileSize: storageapi.FileSizeMedium, MaxFileSize: storageframework.FileSizeMedium,
SupportedFsType: sets.NewString( SupportedFsType: sets.NewString(
"", // Default fsType "", // Default fsType
), ),
Capabilities: map[storageapi.Capability]bool{ Capabilities: map[storageframework.Capability]bool{
storageapi.CapPersistence: false, storageframework.CapPersistence: false,
storageapi.CapFsGroup: false, storageframework.CapFsGroup: false,
storageapi.CapExec: false, storageframework.CapExec: false,
storageapi.CapVolumeLimits: true, storageframework.CapVolumeLimits: true,
}, },
}, },
manifests: driverManifests, manifests: driverManifests,
@ -335,32 +335,32 @@ func InitMockCSIDriver(driverOpts CSIMockDriverOpts) storageapi.TestDriver {
} }
} }
func (m *mockCSIDriver) GetDriverInfo() *storageapi.DriverInfo { func (m *mockCSIDriver) GetDriverInfo() *storageframework.DriverInfo {
return &m.driverInfo return &m.driverInfo
} }
func (m *mockCSIDriver) SkipUnsupportedTest(pattern storageapi.TestPattern) { func (m *mockCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) {
} }
func (m *mockCSIDriver) GetDynamicProvisionStorageClass(config *storageapi.PerTestConfig, fsType string) *storagev1.StorageClass { func (m *mockCSIDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass {
provisioner := config.GetUniqueDriverName() provisioner := config.GetUniqueDriverName()
parameters := map[string]string{} parameters := map[string]string{}
ns := config.Framework.Namespace.Name ns := config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", provisioner) suffix := fmt.Sprintf("%s-sc", provisioner)
return storageapi.GetStorageClass(provisioner, parameters, nil, ns, suffix) return storageframework.GetStorageClass(provisioner, parameters, nil, ns, suffix)
} }
func (m *mockCSIDriver) GetSnapshotClass(config *storageapi.PerTestConfig) *unstructured.Unstructured { func (m *mockCSIDriver) GetSnapshotClass(config *storageframework.PerTestConfig) *unstructured.Unstructured {
parameters := map[string]string{} parameters := map[string]string{}
snapshotter := m.driverInfo.Name + "-" + config.Framework.UniqueName snapshotter := m.driverInfo.Name + "-" + config.Framework.UniqueName
ns := config.Framework.Namespace.Name ns := config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-vsc", snapshotter) suffix := fmt.Sprintf("%s-vsc", snapshotter)
return storageapi.GetSnapshotClass(snapshotter, parameters, ns, suffix) return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix)
} }
func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTestConfig, func()) { func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) {
// Create secondary namespace which will be used for creating driver // Create secondary namespace which will be used for creating driver
driverNamespace := utils.CreateDriverNamespace(f) driverNamespace := utils.CreateDriverNamespace(f)
ns2 := driverNamespace.Name ns2 := driverNamespace.Name
@ -373,7 +373,7 @@ func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTest
// pods should be scheduled on the node // pods should be scheduled on the node
node, err := e2enode.GetRandomReadySchedulableNode(cs) node, err := e2enode.GetRandomReadySchedulableNode(cs)
framework.ExpectNoError(err) framework.ExpectNoError(err)
config := &storageapi.PerTestConfig{ config := &storageframework.PerTestConfig{
Driver: m, Driver: m,
Prefix: "mock", Prefix: "mock",
Framework: f, Framework: f,
@ -480,21 +480,21 @@ func (m *mockCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTest
// gce-pd // gce-pd
type gcePDCSIDriver struct { type gcePDCSIDriver struct {
driverInfo storageapi.DriverInfo driverInfo storageframework.DriverInfo
cleanupHandle framework.CleanupActionHandle cleanupHandle framework.CleanupActionHandle
} }
var _ storageapi.TestDriver = &gcePDCSIDriver{} var _ storageframework.TestDriver = &gcePDCSIDriver{}
var _ storageapi.DynamicPVTestDriver = &gcePDCSIDriver{} var _ storageframework.DynamicPVTestDriver = &gcePDCSIDriver{}
var _ storageapi.SnapshottableTestDriver = &gcePDCSIDriver{} var _ storageframework.SnapshottableTestDriver = &gcePDCSIDriver{}
// InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface // InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface
func InitGcePDCSIDriver() storageapi.TestDriver { func InitGcePDCSIDriver() storageframework.TestDriver {
return &gcePDCSIDriver{ return &gcePDCSIDriver{
driverInfo: storageapi.DriverInfo{ driverInfo: storageframework.DriverInfo{
Name: GCEPDCSIDriverName, Name: GCEPDCSIDriverName,
FeatureTag: "[Serial]", FeatureTag: "[Serial]",
MaxFileSize: storageapi.FileSizeMedium, MaxFileSize: storageframework.FileSizeMedium,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
Min: "5Gi", Min: "5Gi",
}, },
@ -506,27 +506,27 @@ func InitGcePDCSIDriver() storageapi.TestDriver {
"xfs", "xfs",
), ),
SupportedMountOption: sets.NewString("debug", "nouid32"), SupportedMountOption: sets.NewString("debug", "nouid32"),
Capabilities: map[storageapi.Capability]bool{ Capabilities: map[storageframework.Capability]bool{
storageapi.CapPersistence: true, storageframework.CapPersistence: true,
storageapi.CapBlock: true, storageframework.CapBlock: true,
storageapi.CapFsGroup: true, storageframework.CapFsGroup: true,
storageapi.CapExec: true, storageframework.CapExec: true,
storageapi.CapMultiPODs: true, storageframework.CapMultiPODs: true,
// GCE supports volume limits, but the test creates large // GCE supports volume limits, but the test creates large
// number of volumes and times out test suites. // number of volumes and times out test suites.
storageapi.CapVolumeLimits: false, storageframework.CapVolumeLimits: false,
storageapi.CapTopology: true, storageframework.CapTopology: true,
storageapi.CapControllerExpansion: true, storageframework.CapControllerExpansion: true,
storageapi.CapNodeExpansion: true, storageframework.CapNodeExpansion: true,
storageapi.CapSnapshotDataSource: true, storageframework.CapSnapshotDataSource: true,
}, },
RequiredAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}, RequiredAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
TopologyKeys: []string{GCEPDCSIZoneTopologyKey}, TopologyKeys: []string{GCEPDCSIZoneTopologyKey},
StressTestOptions: &storageapi.StressTestOptions{ StressTestOptions: &storageframework.StressTestOptions{
NumPods: 10, NumPods: 10,
NumRestarts: 10, NumRestarts: 10,
}, },
VolumeSnapshotStressTestOptions: &storageapi.VolumeSnapshotStressTestOptions{ VolumeSnapshotStressTestOptions: &storageframework.VolumeSnapshotStressTestOptions{
// GCE only allows for one snapshot per volume to be created at a time, // GCE only allows for one snapshot per volume to be created at a time,
// which can cause test timeouts. We reduce the likelihood of test timeouts // which can cause test timeouts. We reduce the likelihood of test timeouts
// by increasing the number of pods (and volumes) and reducing the number // by increasing the number of pods (and volumes) and reducing the number
@ -538,11 +538,11 @@ func InitGcePDCSIDriver() storageapi.TestDriver {
} }
} }
func (g *gcePDCSIDriver) GetDriverInfo() *storageapi.DriverInfo { func (g *gcePDCSIDriver) GetDriverInfo() *storageframework.DriverInfo {
return &g.driverInfo return &g.driverInfo
} }
func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern storageapi.TestPattern) { func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern storageframework.TestPattern) {
e2eskipper.SkipUnlessProviderIs("gce", "gke") e2eskipper.SkipUnlessProviderIs("gce", "gke")
if pattern.FsType == "xfs" { if pattern.FsType == "xfs" {
e2eskipper.SkipUnlessNodeOSDistroIs("ubuntu", "custom") e2eskipper.SkipUnlessNodeOSDistroIs("ubuntu", "custom")
@ -552,7 +552,7 @@ func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern storageapi.TestPattern) {
} }
} }
func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *storageapi.PerTestConfig, fsType string) *storagev1.StorageClass { func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass {
ns := config.Framework.Namespace.Name ns := config.Framework.Namespace.Name
provisioner := g.driverInfo.Name provisioner := g.driverInfo.Name
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name) suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
@ -563,19 +563,19 @@ func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(config *storageapi.PerT
} }
delayedBinding := storagev1.VolumeBindingWaitForFirstConsumer delayedBinding := storagev1.VolumeBindingWaitForFirstConsumer
return storageapi.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix) return storageframework.GetStorageClass(provisioner, parameters, &delayedBinding, ns, suffix)
} }
func (g *gcePDCSIDriver) GetSnapshotClass(config *storageapi.PerTestConfig) *unstructured.Unstructured { func (g *gcePDCSIDriver) GetSnapshotClass(config *storageframework.PerTestConfig) *unstructured.Unstructured {
parameters := map[string]string{} parameters := map[string]string{}
snapshotter := g.driverInfo.Name snapshotter := g.driverInfo.Name
ns := config.Framework.Namespace.Name ns := config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-vsc", snapshotter) suffix := fmt.Sprintf("%s-vsc", snapshotter)
return storageapi.GetSnapshotClass(snapshotter, parameters, ns, suffix) return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix)
} }
func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTestConfig, func()) { func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) {
ginkgo.By("deploying csi gce-pd driver") ginkgo.By("deploying csi gce-pd driver")
// Create secondary namespace which will be used for creating driver // Create secondary namespace which will be used for creating driver
driverNamespace := utils.CreateDriverNamespace(f) driverNamespace := utils.CreateDriverNamespace(f)
@ -591,7 +591,7 @@ func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTes
// These are the options which would have to be used: // These are the options which would have to be used:
// o := utils.PatchCSIOptions{ // o := utils.PatchCSIOptions{
// OldDriverName: g.driverInfo.Name, // OldDriverName: g.driverInfo.Name,
// NewDriverName: storageapi.GetUniqueDriverName(g), // NewDriverName: storageframework.GetUniqueDriverName(g),
// DriverContainerName: "gce-driver", // DriverContainerName: "gce-driver",
// ProvisionerContainerName: "csi-external-provisioner", // ProvisionerContainerName: "csi-external-provisioner",
// } // }
@ -637,7 +637,7 @@ func (g *gcePDCSIDriver) PrepareTest(f *framework.Framework) (*storageapi.PerTes
} }
g.cleanupHandle = framework.AddCleanupAction(cleanupFunc) g.cleanupHandle = framework.AddCleanupAction(cleanupFunc)
return &storageapi.PerTestConfig{ return &storageframework.PerTestConfig{
Driver: g, Driver: g,
Prefix: "gcepd", Prefix: "gcepd",
Framework: f, Framework: f,

File diff suppressed because it is too large Load Diff

View File

@ -19,7 +19,7 @@ go_library(
"//test/e2e/framework/pod:go_default_library", "//test/e2e/framework/pod:go_default_library",
"//test/e2e/framework/skipper:go_default_library", "//test/e2e/framework/skipper:go_default_library",
"//test/e2e/framework/volume:go_default_library", "//test/e2e/framework/volume:go_default_library",
"//test/e2e/storage/api:go_default_library", "//test/e2e/storage/framework:go_default_library",
"//test/e2e/storage/testsuites:go_default_library", "//test/e2e/storage/testsuites:go_default_library",
"//test/e2e/storage/utils:go_default_library", "//test/e2e/storage/utils:go_default_library",
"//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library",
@ -36,7 +36,7 @@ go_test(
deps = [ deps = [
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//test/e2e/framework/volume:go_default_library", "//test/e2e/framework/volume:go_default_library",
"//test/e2e/storage/api:go_default_library", "//test/e2e/storage/framework:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library",
], ],
) )

View File

@ -39,7 +39,7 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/testsuites"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
@ -55,7 +55,7 @@ type driverDefinition struct {
// for details. The only field with a non-zero default is the list of // for details. The only field with a non-zero default is the list of
// supported file systems (SupportedFsType): it is set so that tests using // supported file systems (SupportedFsType): it is set so that tests using
// the default file system are enabled. // the default file system are enabled.
DriverInfo storageapi.DriverInfo DriverInfo storageframework.DriverInfo
// StorageClass must be set to enable dynamic provisioning tests. // StorageClass must be set to enable dynamic provisioning tests.
// The default is to not run those tests. // The default is to not run those tests.
@ -171,9 +171,9 @@ func AddDriverDefinition(filename string) error {
return errors.Errorf("%q: DriverInfo.Name not set", filename) return errors.Errorf("%q: DriverInfo.Name not set", filename)
} }
description := "External Storage " + storageapi.GetDriverNameWithFeatureTags(driver) description := "External Storage " + storageframework.GetDriverNameWithFeatureTags(driver)
ginkgo.Describe(description, func() { ginkgo.Describe(description, func() {
storageapi.DefineTestSuites(driver, testsuites.CSISuites) storageframework.DefineTestSuites(driver, testsuites.CSISuites)
}) })
return nil return nil
@ -189,7 +189,7 @@ func loadDriverDefinition(filename string) (*driverDefinition, error) {
} }
// Some reasonable defaults follow. // Some reasonable defaults follow.
driver := &driverDefinition{ driver := &driverDefinition{
DriverInfo: storageapi.DriverInfo{ DriverInfo: storageframework.DriverInfo{
SupportedFsType: sets.NewString( SupportedFsType: sets.NewString(
"", // Default fsType "", // Default fsType
), ),
@ -206,20 +206,20 @@ func loadDriverDefinition(filename string) (*driverDefinition, error) {
return driver, nil return driver, nil
} }
var _ storageapi.TestDriver = &driverDefinition{} var _ storageframework.TestDriver = &driverDefinition{}
// We have to implement the interface because dynamic PV may or may // We have to implement the interface because dynamic PV may or may
// not be supported. driverDefinition.SkipUnsupportedTest checks that // not be supported. driverDefinition.SkipUnsupportedTest checks that
// based on the actual driver definition. // based on the actual driver definition.
var _ storageapi.DynamicPVTestDriver = &driverDefinition{} var _ storageframework.DynamicPVTestDriver = &driverDefinition{}
// Same for snapshotting. // Same for snapshotting.
var _ storageapi.SnapshottableTestDriver = &driverDefinition{} var _ storageframework.SnapshottableTestDriver = &driverDefinition{}
// And for ephemeral volumes. // And for ephemeral volumes.
var _ storageapi.EphemeralTestDriver = &driverDefinition{} var _ storageframework.EphemeralTestDriver = &driverDefinition{}
var _ storageapi.CustomTimeoutsTestDriver = &driverDefinition{} var _ storageframework.CustomTimeoutsTestDriver = &driverDefinition{}
// runtime.DecodeInto needs a runtime.Object but doesn't do any // runtime.DecodeInto needs a runtime.Object but doesn't do any
// deserialization of it and therefore none of the methods below need // deserialization of it and therefore none of the methods below need
@ -234,21 +234,21 @@ func (d *driverDefinition) GetObjectKind() schema.ObjectKind {
return nil return nil
} }
func (d *driverDefinition) GetDriverInfo() *storageapi.DriverInfo { func (d *driverDefinition) GetDriverInfo() *storageframework.DriverInfo {
return &d.DriverInfo return &d.DriverInfo
} }
func (d *driverDefinition) SkipUnsupportedTest(pattern storageapi.TestPattern) { func (d *driverDefinition) SkipUnsupportedTest(pattern storageframework.TestPattern) {
supported := false supported := false
// TODO (?): add support for more volume types // TODO (?): add support for more volume types
switch pattern.VolType { switch pattern.VolType {
case "": case "":
supported = true supported = true
case storageapi.DynamicPV: case storageframework.DynamicPV:
if d.StorageClass.FromName || d.StorageClass.FromFile != "" || d.StorageClass.FromExistingClassName != "" { if d.StorageClass.FromName || d.StorageClass.FromFile != "" || d.StorageClass.FromExistingClassName != "" {
supported = true supported = true
} }
case storageapi.CSIInlineVolume: case storageframework.CSIInlineVolume:
supported = len(d.InlineVolumes) != 0 supported = len(d.InlineVolumes) != 0
} }
if !supported { if !supported {
@ -257,7 +257,7 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern storageapi.TestPattern) {
} }
func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *storageapi.PerTestConfig, fsType string) *storagev1.StorageClass { func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *storageframework.PerTestConfig, fsType string) *storagev1.StorageClass {
var ( var (
sc *storagev1.StorageClass sc *storagev1.StorageClass
err error err error
@ -295,7 +295,7 @@ func (d *driverDefinition) GetDynamicProvisionStorageClass(e2econfig *storageapi
// reconsidered if we eventually need to move in-tree storage tests out. // reconsidered if we eventually need to move in-tree storage tests out.
sc.Parameters["csi.storage.k8s.io/fstype"] = fsType sc.Parameters["csi.storage.k8s.io/fstype"] = fsType
} }
return storageapi.CopyStorageClass(sc, f.Namespace.Name, "e2e-sc") return storageframework.CopyStorageClass(sc, f.Namespace.Name, "e2e-sc")
} }
func (d *driverDefinition) GetTimeouts() *framework.TimeoutContext { func (d *driverDefinition) GetTimeouts() *framework.TimeoutContext {
@ -348,7 +348,7 @@ func loadSnapshotClass(filename string) (*unstructured.Unstructured, error) {
return snapshotClass, nil return snapshotClass, nil
} }
func (d *driverDefinition) GetSnapshotClass(e2econfig *storageapi.PerTestConfig) *unstructured.Unstructured { func (d *driverDefinition) GetSnapshotClass(e2econfig *storageframework.PerTestConfig) *unstructured.Unstructured {
if !d.SnapshotClass.FromName && d.SnapshotClass.FromFile == "" && d.SnapshotClass.FromExistingClassName == "" { if !d.SnapshotClass.FromName && d.SnapshotClass.FromFile == "" && d.SnapshotClass.FromExistingClassName == "" {
e2eskipper.Skipf("Driver %q does not support snapshotting - skipping", d.DriverInfo.Name) e2eskipper.Skipf("Driver %q does not support snapshotting - skipping", d.DriverInfo.Name)
} }
@ -390,10 +390,10 @@ func (d *driverDefinition) GetSnapshotClass(e2econfig *storageapi.PerTestConfig)
} }
} }
return storageapi.GetSnapshotClass(snapshotter, parameters, ns, suffix) return utils.GenerateSnapshotClassSpec(snapshotter, parameters, ns, suffix)
} }
func (d *driverDefinition) GetVolume(e2econfig *storageapi.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) { func (d *driverDefinition) GetVolume(e2econfig *storageframework.PerTestConfig, volumeNumber int) (map[string]string, bool, bool) {
if len(d.InlineVolumes) == 0 { if len(d.InlineVolumes) == 0 {
e2eskipper.Skipf("%s does not have any InlineVolumeAttributes defined", d.DriverInfo.Name) e2eskipper.Skipf("%s does not have any InlineVolumeAttributes defined", d.DriverInfo.Name)
} }
@ -401,12 +401,12 @@ func (d *driverDefinition) GetVolume(e2econfig *storageapi.PerTestConfig, volume
return e2evolume.Attributes, e2evolume.Shared, e2evolume.ReadOnly return e2evolume.Attributes, e2evolume.Shared, e2evolume.ReadOnly
} }
func (d *driverDefinition) GetCSIDriverName(e2econfig *storageapi.PerTestConfig) string { func (d *driverDefinition) GetCSIDriverName(e2econfig *storageframework.PerTestConfig) string {
return d.DriverInfo.Name return d.DriverInfo.Name
} }
func (d *driverDefinition) PrepareTest(f *framework.Framework) (*storageapi.PerTestConfig, func()) { func (d *driverDefinition) PrepareTest(f *framework.Framework) (*storageframework.PerTestConfig, func()) {
e2econfig := &storageapi.PerTestConfig{ e2econfig := &storageframework.PerTestConfig{
Driver: d, Driver: d,
Prefix: "external", Prefix: "external",
Framework: f, Framework: f,

View File

@ -23,12 +23,12 @@ import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
) )
func TestDriverParameter(t *testing.T) { func TestDriverParameter(t *testing.T) {
expected := &driverDefinition{ expected := &driverDefinition{
DriverInfo: storageapi.DriverInfo{ DriverInfo: storageframework.DriverInfo{
Name: "foo.example.com", Name: "foo.example.com",
SupportedFsType: sets.NewString( SupportedFsType: sets.NewString(
"", // Default fsType "", // Default fsType

View File

@ -3,15 +3,15 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"driveroperations.go", "driver_operations.go",
"snapshotresource.go", "snapshot_resource.go",
"testconfig.go", "testconfig.go",
"testdriver.go", "testdriver.go",
"testpattern.go", "testpattern.go",
"testsuite.go", "testsuite.go",
"volumeresource.go", "volume_resource.go",
], ],
importpath = "k8s.io/kubernetes/test/e2e/storage/api", importpath = "k8s.io/kubernetes/test/e2e/storage/framework",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
@ -25,7 +25,6 @@ go_library(
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
"//staging/src/k8s.io/client-go/dynamic:go_default_library",
"//test/e2e/framework:go_default_library", "//test/e2e/framework:go_default_library",
"//test/e2e/framework/pod:go_default_library", "//test/e2e/framework/pod:go_default_library",
"//test/e2e/framework/pv:go_default_library", "//test/e2e/framework/pv:go_default_library",

View File

@ -14,17 +14,15 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
"fmt" "fmt"
storagev1 "k8s.io/api/storage/v1" storagev1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apiserver/pkg/storage/names" "k8s.io/apiserver/pkg/storage/names"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/utils"
) )
// GetDriverNameWithFeatureTags returns driver name with feature tags // GetDriverNameWithFeatureTags returns driver name with feature tags
@ -89,29 +87,3 @@ func GetStorageClass(
VolumeBindingMode: bindingMode, VolumeBindingMode: bindingMode,
} }
} }
// GetSnapshotClass constructs a new SnapshotClass instance
// with a unique name that is based on namespace + suffix.
func GetSnapshotClass(
snapshotter string,
parameters map[string]string,
ns string,
suffix string,
) *unstructured.Unstructured {
snapshotClass := &unstructured.Unstructured{
Object: map[string]interface{}{
"kind": "VolumeSnapshotClass",
"apiVersion": utils.SnapshotAPIVersion,
"metadata": map[string]interface{}{
// Name must be unique, so let's base it on namespace name and use GenerateName
// TODO(#96234): Remove unnecessary suffix.
"name": names.SimpleNameGenerator.GenerateName(ns + "-" + suffix),
},
"driver": snapshotter,
"parameters": parameters,
"deletionPolicy": "Delete",
},
}
return snapshotClass
}

View File

@ -14,12 +14,11 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
"context" "context"
"fmt" "fmt"
"time"
"github.com/onsi/ginkgo" "github.com/onsi/ginkgo"
@ -29,7 +28,6 @@ import (
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/uuid"
"k8s.io/client-go/dynamic"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -79,28 +77,6 @@ func CreateSnapshot(sDriver SnapshottableTestDriver, config *PerTestConfig, patt
return sclass, snapshot return sclass, snapshot
} }
// GetSnapshotContentFromSnapshot returns the VolumeSnapshotContent object Bound to a
// given VolumeSnapshot
func GetSnapshotContentFromSnapshot(dc dynamic.Interface, snapshot *unstructured.Unstructured) *unstructured.Unstructured {
defer ginkgo.GinkgoRecover()
err := utils.WaitForSnapshotReady(dc, snapshot.GetNamespace(), snapshot.GetName(), framework.Poll, framework.SnapshotCreateTimeout)
framework.ExpectNoError(err)
vs, err := dc.Resource(utils.SnapshotGVR).Namespace(snapshot.GetNamespace()).Get(context.TODO(), snapshot.GetName(), metav1.GetOptions{})
snapshotStatus := vs.Object["status"].(map[string]interface{})
snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string)
framework.Logf("received snapshotStatus %v", snapshotStatus)
framework.Logf("snapshotContentName %s", snapshotContentName)
framework.ExpectNoError(err)
vscontent, err := dc.Resource(utils.SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{})
framework.ExpectNoError(err)
return vscontent
}
// CreateSnapshotResource creates a snapshot resource for the current test. It knows how to deal with // CreateSnapshotResource creates a snapshot resource for the current test. It knows how to deal with
// different test pattern snapshot provisioning and deletion policy // different test pattern snapshot provisioning and deletion policy
func CreateSnapshotResource(sDriver SnapshottableTestDriver, config *PerTestConfig, pattern TestPattern, pvcName string, pvcNamespace string, timeouts *framework.TimeoutContext) *SnapshotResource { func CreateSnapshotResource(sDriver SnapshottableTestDriver, config *PerTestConfig, pattern TestPattern, pvcName string, pvcNamespace string, timeouts *framework.TimeoutContext) *SnapshotResource {
@ -113,7 +89,7 @@ func CreateSnapshotResource(sDriver SnapshottableTestDriver, config *PerTestConf
dc := r.Config.Framework.DynamicClient dc := r.Config.Framework.DynamicClient
r.Vscontent = GetSnapshotContentFromSnapshot(dc, r.Vs) r.Vscontent = utils.GetSnapshotContentFromSnapshot(dc, r.Vs)
if pattern.SnapshotType == PreprovisionedCreatedSnapshot { if pattern.SnapshotType == PreprovisionedCreatedSnapshot {
// prepare a pre-provisioned VolumeSnapshotContent with certain data // prepare a pre-provisioned VolumeSnapshotContent with certain data
@ -284,21 +260,6 @@ func (sr *SnapshotResource) CleanupResource(timeouts *framework.TimeoutContext)
return utilerrors.NewAggregate(cleanupErrs) return utilerrors.NewAggregate(cleanupErrs)
} }
// DeleteAndWaitSnapshot deletes a VolumeSnapshot and waits for it to be deleted or until timeout occurs, whichever comes first
func DeleteAndWaitSnapshot(dc dynamic.Interface, ns string, snapshotName string, poll, timeout time.Duration) error {
var err error
ginkgo.By("deleting the snapshot")
err = dc.Resource(utils.SnapshotGVR).Namespace(ns).Delete(context.TODO(), snapshotName, metav1.DeleteOptions{})
if err != nil && !apierrors.IsNotFound(err) {
return err
}
ginkgo.By("checking the Snapshot has been deleted")
err = utils.WaitForNamespacedGVRDeletion(dc, utils.SnapshotGVR, ns, snapshotName, poll, timeout)
return err
}
func getSnapshot(claimName string, ns, snapshotClassName string) *unstructured.Unstructured { func getSnapshot(claimName string, ns, snapshotClassName string) *unstructured.Unstructured {
snapshot := &unstructured.Unstructured{ snapshot := &unstructured.Unstructured{
Object: map[string]interface{}{ Object: map[string]interface{}{

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
"fmt" "fmt"

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package framework
import ( import (
"context" "context"

View File

@ -18,14 +18,14 @@ package storage
import ( import (
"github.com/onsi/ginkgo" "github.com/onsi/ginkgo"
"k8s.io/kubernetes/test/e2e/storage/api"
"k8s.io/kubernetes/test/e2e/storage/drivers" "k8s.io/kubernetes/test/e2e/storage/drivers"
storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/testsuites"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
) )
// List of testDrivers to be executed in below loop // List of testDrivers to be executed in below loop
var testDrivers = []func() api.TestDriver{ var testDrivers = []func() storageframework.TestDriver{
drivers.InitNFSDriver, drivers.InitNFSDriver,
drivers.InitGlusterFSDriver, drivers.InitGlusterFSDriver,
drivers.InitISCSIDriver, drivers.InitISCSIDriver,
@ -55,8 +55,8 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() {
for _, initDriver := range testDrivers { for _, initDriver := range testDrivers {
curDriver := initDriver() curDriver := initDriver()
ginkgo.Context(api.GetDriverNameWithFeatureTags(curDriver), func() { ginkgo.Context(storageframework.GetDriverNameWithFeatureTags(curDriver), func() {
api.DefineTestSuites(curDriver, testsuites.BaseSuites) storageframework.DefineTestSuites(curDriver, testsuites.BaseSuites)
}) })
} }
}) })

View File

@ -51,7 +51,7 @@ go_library(
"//test/e2e/framework/pv:go_default_library", "//test/e2e/framework/pv:go_default_library",
"//test/e2e/framework/skipper:go_default_library", "//test/e2e/framework/skipper:go_default_library",
"//test/e2e/framework/volume:go_default_library", "//test/e2e/framework/volume:go_default_library",
"//test/e2e/storage/api:go_default_library", "//test/e2e/storage/framework:go_default_library",
"//test/e2e/storage/utils:go_default_library", "//test/e2e/storage/utils:go_default_library",
"//test/utils/image:go_default_library", "//test/utils/image:go_default_library",
"//vendor/github.com/onsi/ginkgo:go_default_library", "//vendor/github.com/onsi/ginkgo:go_default_library",

View File

@ -29,7 +29,7 @@ import (
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
e2emetrics "k8s.io/kubernetes/test/e2e/framework/metrics" e2emetrics "k8s.io/kubernetes/test/e2e/framework/metrics"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
) )
var migratedPlugins *string var migratedPlugins *string
@ -52,7 +52,7 @@ type migrationOpCheck struct {
} }
// BaseSuites is a list of storage test suites that work for in-tree and CSI drivers // BaseSuites is a list of storage test suites that work for in-tree and CSI drivers
var BaseSuites = []func() storageapi.TestSuite{ var BaseSuites = []func() storageframework.TestSuite{
InitVolumesTestSuite, InitVolumesTestSuite,
InitVolumeIOTestSuite, InitVolumeIOTestSuite,
InitVolumeModeTestSuite, InitVolumeModeTestSuite,
@ -225,8 +225,8 @@ func (moc *migrationOpCheck) validateMigrationVolumeOpCounts() {
} }
// Skip skipVolTypes patterns if the driver supports dynamic provisioning // Skip skipVolTypes patterns if the driver supports dynamic provisioning
func skipVolTypePatterns(pattern storageapi.TestPattern, driver storageapi.TestDriver, skipVolTypes map[storageapi.TestVolType]bool) { func skipVolTypePatterns(pattern storageframework.TestPattern, driver storageframework.TestDriver, skipVolTypes map[storageframework.TestVolType]bool) {
_, supportsProvisioning := driver.(storageapi.DynamicPVTestDriver) _, supportsProvisioning := driver.(storageframework.DynamicPVTestDriver)
if supportsProvisioning && skipVolTypes[pattern.VolType] { if supportsProvisioning && skipVolTypes[pattern.VolType] {
e2eskipper.Skipf("Driver supports dynamic provisioning, skipping %s pattern", pattern.VolType) e2eskipper.Skipf("Driver supports dynamic provisioning, skipping %s pattern", pattern.VolType)
} }

View File

@ -26,20 +26,20 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
type disruptiveTestSuite struct { type disruptiveTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
// InitCustomDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface // InitCustomDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomDisruptiveTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomDisruptiveTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &disruptiveTestSuite{ return &disruptiveTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "disruptive", Name: "disruptive",
FeatureTag: "[Disruptive][LinuxOnly]", FeatureTag: "[Disruptive][LinuxOnly]",
TestPatterns: patterns, TestPatterns: patterns,
@ -49,43 +49,43 @@ func InitCustomDisruptiveTestSuite(patterns []storageapi.TestPattern) storageapi
// InitDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface // InitDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface
// using test suite default patterns // using test suite default patterns
func InitDisruptiveTestSuite() storageapi.TestSuite { func InitDisruptiveTestSuite() storageframework.TestSuite {
testPatterns := []storageapi.TestPattern{ testPatterns := []storageframework.TestPattern{
// FSVolMode is already covered in subpath testsuite // FSVolMode is already covered in subpath testsuite
storageapi.DefaultFsInlineVolume, storageframework.DefaultFsInlineVolume,
storageapi.FsVolModePreprovisionedPV, storageframework.FsVolModePreprovisionedPV,
storageapi.FsVolModeDynamicPV, storageframework.FsVolModeDynamicPV,
storageapi.BlockVolModePreprovisionedPV, storageframework.BlockVolModePreprovisionedPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
} }
return InitCustomDisruptiveTestSuite(testPatterns) return InitCustomDisruptiveTestSuite(testPatterns)
} }
func (s *disruptiveTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (s *disruptiveTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return s.tsInfo return s.tsInfo
} }
func (s *disruptiveTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *disruptiveTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
skipVolTypePatterns(pattern, driver, storageapi.NewVolTypeMap(storageapi.PreprovisionedPV)) skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(storageframework.PreprovisionedPV))
} }
func (s *disruptiveTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *disruptiveTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
cs clientset.Interface cs clientset.Interface
ns *v1.Namespace ns *v1.Namespace
// VolumeResource contains pv, pvc, sc, etc., owns cleaning that up // VolumeResource contains pv, pvc, sc, etc., owns cleaning that up
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
pod *v1.Pod pod *v1.Pod
} }
var l local var l local
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("disruptive", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("disruptive", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -96,7 +96,7 @@ func (s *disruptiveTestSuite) DefineTests(driver storageapi.TestDriver, pattern
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
} }
cleanup := func() { cleanup := func() {
@ -154,7 +154,7 @@ func (s *disruptiveTestSuite) DefineTests(driver storageapi.TestDriver, pattern
var err error var err error
var pvcs []*v1.PersistentVolumeClaim var pvcs []*v1.PersistentVolumeClaim
var inlineSources []*v1.VolumeSource var inlineSources []*v1.VolumeSource
if pattern.VolType == storageapi.InlineVolume { if pattern.VolType == storageframework.InlineVolume {
inlineSources = append(inlineSources, l.resource.VolSource) inlineSources = append(inlineSources, l.resource.VolSource)
} else { } else {
pvcs = append(pvcs, l.resource.Pvc) pvcs = append(pvcs, l.resource.Pvc)

View File

@ -34,19 +34,19 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
type ephemeralTestSuite struct { type ephemeralTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
// InitCustomEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface // InitCustomEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomEphemeralTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomEphemeralTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &ephemeralTestSuite{ return &ephemeralTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "ephemeral", Name: "ephemeral",
TestPatterns: patterns, TestPatterns: patterns,
}, },
@ -55,17 +55,17 @@ func InitCustomEphemeralTestSuite(patterns []storageapi.TestPattern) storageapi.
// InitEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface // InitEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface
// using test suite default patterns // using test suite default patterns
func InitEphemeralTestSuite() storageapi.TestSuite { func InitEphemeralTestSuite() storageframework.TestSuite {
genericLateBinding := storageapi.DefaultFsGenericEphemeralVolume genericLateBinding := storageframework.DefaultFsGenericEphemeralVolume
genericLateBinding.Name += " (late-binding)" genericLateBinding.Name += " (late-binding)"
genericLateBinding.BindingMode = storagev1.VolumeBindingWaitForFirstConsumer genericLateBinding.BindingMode = storagev1.VolumeBindingWaitForFirstConsumer
genericImmediateBinding := storageapi.DefaultFsGenericEphemeralVolume genericImmediateBinding := storageframework.DefaultFsGenericEphemeralVolume
genericImmediateBinding.Name += " (immediate-binding)" genericImmediateBinding.Name += " (immediate-binding)"
genericImmediateBinding.BindingMode = storagev1.VolumeBindingImmediate genericImmediateBinding.BindingMode = storagev1.VolumeBindingImmediate
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsCSIEphemeralVolume, storageframework.DefaultFsCSIEphemeralVolume,
genericLateBinding, genericLateBinding,
genericImmediateBinding, genericImmediateBinding,
} }
@ -73,35 +73,35 @@ func InitEphemeralTestSuite() storageapi.TestSuite {
return InitCustomEphemeralTestSuite(patterns) return InitCustomEphemeralTestSuite(patterns)
} }
func (p *ephemeralTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (p *ephemeralTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return p.tsInfo return p.tsInfo
} }
func (p *ephemeralTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (p *ephemeralTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
} }
func (p *ephemeralTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (p *ephemeralTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
testCase *EphemeralTest testCase *EphemeralTest
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
} }
var ( var (
eDriver storageapi.EphemeralTestDriver eDriver storageframework.EphemeralTestDriver
l local l local
) )
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("ephemeral", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("ephemeral", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
if pattern.VolType == storageapi.CSIInlineVolume { if pattern.VolType == storageframework.CSIInlineVolume {
eDriver, _ = driver.(storageapi.EphemeralTestDriver) eDriver, _ = driver.(storageframework.EphemeralTestDriver)
} }
if pattern.VolType == storageapi.GenericEphemeralVolume { if pattern.VolType == storageframework.GenericEphemeralVolume {
enabled, err := GenericEphemeralVolumesEnabled(f.ClientSet, f.Timeouts, f.Namespace.Name) enabled, err := GenericEphemeralVolumesEnabled(f.ClientSet, f.Timeouts, f.Namespace.Name)
framework.ExpectNoError(err, "check GenericEphemeralVolume feature") framework.ExpectNoError(err, "check GenericEphemeralVolume feature")
if !enabled { if !enabled {
@ -113,10 +113,10 @@ func (p *ephemeralTestSuite) DefineTests(driver storageapi.TestDriver, pattern s
// Now do the more expensive test initialization. // Now do the more expensive test initialization.
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, e2evolume.SizeRange{}) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, e2evolume.SizeRange{})
switch pattern.VolType { switch pattern.VolType {
case storageapi.CSIInlineVolume: case storageframework.CSIInlineVolume:
l.testCase = &EphemeralTest{ l.testCase = &EphemeralTest{
Client: l.config.Framework.ClientSet, Client: l.config.Framework.ClientSet,
Timeouts: f.Timeouts, Timeouts: f.Timeouts,
@ -127,7 +127,7 @@ func (p *ephemeralTestSuite) DefineTests(driver storageapi.TestDriver, pattern s
return eDriver.GetVolume(l.config, volumeNumber) return eDriver.GetVolume(l.config, volumeNumber)
}, },
} }
case storageapi.GenericEphemeralVolume: case storageframework.GenericEphemeralVolume:
l.testCase = &EphemeralTest{ l.testCase = &EphemeralTest{
Client: l.config.Framework.ClientSet, Client: l.config.Framework.ClientSet,
Timeouts: f.Timeouts, Timeouts: f.Timeouts,
@ -210,7 +210,7 @@ func (p *ephemeralTestSuite) DefineTests(driver storageapi.TestDriver, pattern s
ginkgo.It("should support multiple inline ephemeral volumes", func() { ginkgo.It("should support multiple inline ephemeral volumes", func() {
if pattern.BindingMode == storagev1.VolumeBindingImmediate && if pattern.BindingMode == storagev1.VolumeBindingImmediate &&
pattern.VolType == storageapi.GenericEphemeralVolume { pattern.VolType == storageframework.GenericEphemeralVolume {
e2eskipper.Skipf("Multiple generic ephemeral volumes with immediate binding may cause pod startup failures when the volumes get created in separate topology segments.") e2eskipper.Skipf("Multiple generic ephemeral volumes with immediate binding may cause pod startup failures when the volumes get created in separate topology segments.")
} }

View File

@ -27,7 +27,7 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
utilpointer "k8s.io/utils/pointer" utilpointer "k8s.io/utils/pointer"
) )
@ -42,15 +42,15 @@ const (
) )
type fsGroupChangePolicyTestSuite struct { type fsGroupChangePolicyTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
var _ storageapi.TestSuite = &fsGroupChangePolicyTestSuite{} var _ storageframework.TestSuite = &fsGroupChangePolicyTestSuite{}
// InitCustomFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface // InitCustomFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface
func InitCustomFsGroupChangePolicyTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomFsGroupChangePolicyTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &fsGroupChangePolicyTestSuite{ return &fsGroupChangePolicyTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "fsgroupchangepolicy", Name: "fsgroupchangepolicy",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -61,21 +61,21 @@ func InitCustomFsGroupChangePolicyTestSuite(patterns []storageapi.TestPattern) s
} }
// InitFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface // InitFsGroupChangePolicyTestSuite returns fsGroupChangePolicyTestSuite that implements TestSuite interface
func InitFsGroupChangePolicyTestSuite() storageapi.TestSuite { func InitFsGroupChangePolicyTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
} }
return InitCustomFsGroupChangePolicyTestSuite(patterns) return InitCustomFsGroupChangePolicyTestSuite(patterns)
} }
func (s *fsGroupChangePolicyTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (s *fsGroupChangePolicyTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return s.tsInfo return s.tsInfo
} }
func (s *fsGroupChangePolicyTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *fsGroupChangePolicyTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
skipVolTypePatterns(pattern, driver, storageapi.NewVolTypeMap(storageapi.CSIInlineVolume, storageapi.GenericEphemeralVolume)) skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(storageframework.CSIInlineVolume, storageframework.GenericEphemeralVolume))
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
if !dInfo.Capabilities[storageapi.CapFsGroup] { if !dInfo.Capabilities[storageframework.CapFsGroup] {
e2eskipper.Skipf("Driver %q does not support FsGroup - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support FsGroup - skipping", dInfo.Name)
} }
@ -83,28 +83,28 @@ func (s *fsGroupChangePolicyTestSuite) SkipUnsupportedTests(driver storageapi.Te
e2eskipper.Skipf("Test does not support non-filesystem volume mode - skipping") e2eskipper.Skipf("Test does not support non-filesystem volume mode - skipping")
} }
if pattern.VolType != storageapi.DynamicPV { if pattern.VolType != storageframework.DynamicPV {
e2eskipper.Skipf("Suite %q does not support %v", s.tsInfo.Name, pattern.VolType) e2eskipper.Skipf("Suite %q does not support %v", s.tsInfo.Name, pattern.VolType)
} }
_, ok := driver.(storageapi.DynamicPVTestDriver) _, ok := driver.(storageframework.DynamicPVTestDriver)
if !ok { if !ok {
e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType)
} }
} }
func (s *fsGroupChangePolicyTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *fsGroupChangePolicyTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
driver storageapi.TestDriver driver storageframework.TestDriver
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
} }
var l local var l local
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("fsgroupchangepolicy", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("fsgroupchangepolicy", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
e2eskipper.SkipIfNodeOSDistroIs("windows") e2eskipper.SkipIfNodeOSDistroIs("windows")
@ -112,7 +112,7 @@ func (s *fsGroupChangePolicyTestSuite) DefineTests(driver storageapi.TestDriver,
l.driver = driver l.driver = driver
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
l.resource = storageapi.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange)
} }
cleanup := func() { cleanup := func() {

View File

@ -32,23 +32,23 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
imageutils "k8s.io/kubernetes/test/utils/image" imageutils "k8s.io/kubernetes/test/utils/image"
) )
type multiVolumeTestSuite struct { type multiVolumeTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
var _ storageapi.TestSuite = &multiVolumeTestSuite{} var _ storageframework.TestSuite = &multiVolumeTestSuite{}
// InitCustomMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface // InitCustomMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomMultiVolumeTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomMultiVolumeTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &multiVolumeTestSuite{ return &multiVolumeTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "multiVolume [Slow]", Name: "multiVolume [Slow]",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -60,37 +60,37 @@ func InitCustomMultiVolumeTestSuite(patterns []storageapi.TestPattern) storageap
// InitMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface // InitMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface
// using test suite default patterns // using test suite default patterns
func InitMultiVolumeTestSuite() storageapi.TestSuite { func InitMultiVolumeTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.FsVolModePreprovisionedPV, storageframework.FsVolModePreprovisionedPV,
storageapi.FsVolModeDynamicPV, storageframework.FsVolModeDynamicPV,
storageapi.BlockVolModePreprovisionedPV, storageframework.BlockVolModePreprovisionedPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
} }
return InitCustomMultiVolumeTestSuite(patterns) return InitCustomMultiVolumeTestSuite(patterns)
} }
func (t *multiVolumeTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *multiVolumeTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *multiVolumeTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *multiVolumeTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
skipVolTypePatterns(pattern, driver, storageapi.NewVolTypeMap(storageapi.PreprovisionedPV)) skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(storageframework.PreprovisionedPV))
if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageapi.CapBlock] { if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageframework.CapBlock] {
e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode) e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode)
} }
} }
func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *multiVolumeTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
cs clientset.Interface cs clientset.Interface
ns *v1.Namespace ns *v1.Namespace
driver storageapi.TestDriver driver storageframework.TestDriver
resources []*storageapi.VolumeResource resources []*storageframework.VolumeResource
migrationCheck *migrationOpCheck migrationCheck *migrationOpCheck
} }
@ -101,7 +101,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("multivolume", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("multivolume", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -135,7 +135,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Currently, multiple volumes are not generally available for pre-provisoined volume, // Currently, multiple volumes are not generally available for pre-provisoined volume,
// because containerized storage servers, such as iSCSI and rbd, are just returning // because containerized storage servers, such as iSCSI and rbd, are just returning
// a static volume inside container, not actually creating a new volume per request. // a static volume inside container, not actually creating a new volume per request.
if pattern.VolType == storageapi.PreprovisionedPV { if pattern.VolType == storageframework.PreprovisionedPV {
e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping")
} }
@ -147,7 +147,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
for i := 0; i < numVols; i++ { for i := 0; i < numVols; i++ {
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
pvcs = append(pvcs, resource.Pvc) pvcs = append(pvcs, resource.Pvc)
} }
@ -165,7 +165,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Currently, multiple volumes are not generally available for pre-provisoined volume, // Currently, multiple volumes are not generally available for pre-provisoined volume,
// because containerized storage servers, such as iSCSI and rbd, are just returning // because containerized storage servers, such as iSCSI and rbd, are just returning
// a static volume inside container, not actually creating a new volume per request. // a static volume inside container, not actually creating a new volume per request.
if pattern.VolType == storageapi.PreprovisionedPV { if pattern.VolType == storageframework.PreprovisionedPV {
e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping")
} }
@ -173,8 +173,8 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
defer cleanup() defer cleanup()
// Check different-node test requirement // Check different-node test requirement
if l.driver.GetDriverInfo().Capabilities[storageapi.CapSingleNodeVolume] { if l.driver.GetDriverInfo().Capabilities[storageframework.CapSingleNodeVolume] {
e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, storageapi.CapSingleNodeVolume) e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, storageframework.CapSingleNodeVolume)
} }
nodes, err := e2enode.GetReadySchedulableNodes(l.cs) nodes, err := e2enode.GetReadySchedulableNodes(l.cs)
framework.ExpectNoError(err) framework.ExpectNoError(err)
@ -197,7 +197,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
for i := 0; i < numVols; i++ { for i := 0; i < numVols; i++ {
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
pvcs = append(pvcs, resource.Pvc) pvcs = append(pvcs, resource.Pvc)
} }
@ -219,7 +219,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Currently, multiple volumes are not generally available for pre-provisoined volume, // Currently, multiple volumes are not generally available for pre-provisoined volume,
// because containerized storage servers, such as iSCSI and rbd, are just returning // because containerized storage servers, such as iSCSI and rbd, are just returning
// a static volume inside container, not actually creating a new volume per request. // a static volume inside container, not actually creating a new volume per request.
if pattern.VolType == storageapi.PreprovisionedPV { if pattern.VolType == storageframework.PreprovisionedPV {
e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping")
} }
@ -236,7 +236,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
curPattern.VolMode = v1.PersistentVolumeFilesystem curPattern.VolMode = v1.PersistentVolumeFilesystem
} }
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
pvcs = append(pvcs, resource.Pvc) pvcs = append(pvcs, resource.Pvc)
} }
@ -258,7 +258,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Currently, multiple volumes are not generally available for pre-provisoined volume, // Currently, multiple volumes are not generally available for pre-provisoined volume,
// because containerized storage servers, such as iSCSI and rbd, are just returning // because containerized storage servers, such as iSCSI and rbd, are just returning
// a static volume inside container, not actually creating a new volume per request. // a static volume inside container, not actually creating a new volume per request.
if pattern.VolType == storageapi.PreprovisionedPV { if pattern.VolType == storageframework.PreprovisionedPV {
e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping") e2eskipper.Skipf("This test doesn't work with pre-provisioned volume -- skipping")
} }
@ -266,8 +266,8 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
defer cleanup() defer cleanup()
// Check different-node test requirement // Check different-node test requirement
if l.driver.GetDriverInfo().Capabilities[storageapi.CapSingleNodeVolume] { if l.driver.GetDriverInfo().Capabilities[storageframework.CapSingleNodeVolume] {
e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, storageapi.CapSingleNodeVolume) e2eskipper.Skipf("Driver %s only supports %v -- skipping", l.driver.GetDriverInfo().Name, storageframework.CapSingleNodeVolume)
} }
nodes, err := e2enode.GetReadySchedulableNodes(l.cs) nodes, err := e2enode.GetReadySchedulableNodes(l.cs)
framework.ExpectNoError(err) framework.ExpectNoError(err)
@ -295,7 +295,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
curPattern.VolMode = v1.PersistentVolumeFilesystem curPattern.VolMode = v1.PersistentVolumeFilesystem
} }
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(driver, l.config, curPattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
pvcs = append(pvcs, resource.Pvc) pvcs = append(pvcs, resource.Pvc)
} }
@ -315,13 +315,13 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
numPods := 2 numPods := 2
if !l.driver.GetDriverInfo().Capabilities[storageapi.CapMultiPODs] { if !l.driver.GetDriverInfo().Capabilities[storageframework.CapMultiPODs] {
e2eskipper.Skipf("Driver %q does not support multiple concurrent pods - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support multiple concurrent pods - skipping", dInfo.Name)
} }
// Create volume // Create volume
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
// Test access to the volume from pods on different node // Test access to the volume from pods on different node
@ -340,13 +340,13 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
numPods := 2 numPods := 2
if !l.driver.GetDriverInfo().Capabilities[storageapi.CapMultiPODs] { if !l.driver.GetDriverInfo().Capabilities[storageframework.CapMultiPODs] {
e2eskipper.Skipf("Driver %q does not support multiple concurrent pods - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support multiple concurrent pods - skipping", dInfo.Name)
} }
// Create volume // Create volume
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
// Initialize the volume with a filesystem - it's going to be mounted as read-only below. // Initialize the volume with a filesystem - it's going to be mounted as read-only below.
@ -368,8 +368,8 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
numPods := 2 numPods := 2
if !l.driver.GetDriverInfo().Capabilities[storageapi.CapRWX] { if !l.driver.GetDriverInfo().Capabilities[storageframework.CapRWX] {
e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", l.driver.GetDriverInfo().Name, storageapi.CapRWX) e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", l.driver.GetDriverInfo().Name, storageframework.CapRWX)
} }
// Check different-node test requirement // Check different-node test requirement
@ -391,7 +391,7 @@ func (t *multiVolumeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Create volume // Create volume
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
resource := storageapi.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange) resource := storageframework.CreateVolumeResource(l.driver, l.config, pattern, testVolumeSizeRange)
l.resources = append(l.resources, resource) l.resources = append(l.resources, resource)
// Test access to the volume from pods on different node // Test access to the volume from pods on different node

View File

@ -38,7 +38,7 @@ import (
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -63,14 +63,14 @@ type StorageClassTest struct {
} }
type provisioningTestSuite struct { type provisioningTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
// InitCustomProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface // InitCustomProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomProvisioningTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomProvisioningTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &provisioningTestSuite{ return &provisioningTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "provisioning", Name: "provisioning",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -82,33 +82,33 @@ func InitCustomProvisioningTestSuite(patterns []storageapi.TestPattern) storagea
// InitProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface\ // InitProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface\
// using test suite default patterns // using test suite default patterns
func InitProvisioningTestSuite() storageapi.TestSuite { func InitProvisioningTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
storageapi.NtfsDynamicPV, storageframework.NtfsDynamicPV,
} }
return InitCustomProvisioningTestSuite(patterns) return InitCustomProvisioningTestSuite(patterns)
} }
func (p *provisioningTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (p *provisioningTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return p.tsInfo return p.tsInfo
} }
func (p *provisioningTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (p *provisioningTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
// Check preconditions. // Check preconditions.
if pattern.VolType != storageapi.DynamicPV { if pattern.VolType != storageframework.DynamicPV {
e2eskipper.Skipf("Suite %q does not support %v", p.tsInfo.Name, pattern.VolType) e2eskipper.Skipf("Suite %q does not support %v", p.tsInfo.Name, pattern.VolType)
} }
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageapi.CapBlock] { if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageframework.CapBlock] {
e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode) e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolMode)
} }
} }
func (p *provisioningTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (p *provisioningTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
testCase *StorageClassTest testCase *StorageClassTest
@ -121,17 +121,17 @@ func (p *provisioningTestSuite) DefineTests(driver storageapi.TestDriver, patter
} }
var ( var (
dInfo = driver.GetDriverInfo() dInfo = driver.GetDriverInfo()
dDriver storageapi.DynamicPVTestDriver dDriver storageframework.DynamicPVTestDriver
l local l local
) )
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("provisioning", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("provisioning", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
dDriver, _ = driver.(storageapi.DynamicPVTestDriver) dDriver, _ = driver.(storageframework.DynamicPVTestDriver)
// Now do the more expensive test initialization. // Now do the more expensive test initialization.
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName)
@ -195,14 +195,14 @@ func (p *provisioningTestSuite) DefineTests(driver storageapi.TestDriver, patter
}) })
ginkgo.It("should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]", func() { ginkgo.It("should provision storage with snapshot data source [Feature:VolumeSnapshotDataSource]", func() {
if !dInfo.Capabilities[storageapi.CapSnapshotDataSource] { if !dInfo.Capabilities[storageframework.CapSnapshotDataSource] {
e2eskipper.Skipf("Driver %q does not support populate data from snapshot - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support populate data from snapshot - skipping", dInfo.Name)
} }
if !dInfo.SupportedFsType.Has(pattern.FsType) { if !dInfo.SupportedFsType.Has(pattern.FsType) {
e2eskipper.Skipf("Driver %q does not support %q fs type - skipping", dInfo.Name, pattern.FsType) e2eskipper.Skipf("Driver %q does not support %q fs type - skipping", dInfo.Name, pattern.FsType)
} }
sDriver, ok := driver.(storageapi.SnapshottableTestDriver) sDriver, ok := driver.(storageframework.SnapshottableTestDriver)
if !ok { if !ok {
framework.Failf("Driver %q has CapSnapshotDataSource but does not implement SnapshottableTestDriver", dInfo.Name) framework.Failf("Driver %q has CapSnapshotDataSource but does not implement SnapshottableTestDriver", dInfo.Name)
} }
@ -211,7 +211,7 @@ func (p *provisioningTestSuite) DefineTests(driver storageapi.TestDriver, patter
defer cleanup() defer cleanup()
dc := l.config.Framework.DynamicClient dc := l.config.Framework.DynamicClient
testConfig := storageapi.ConvertTestConfig(l.config) testConfig := storageframework.ConvertTestConfig(l.config)
expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name) expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name)
dataSource, cleanupFunc := prepareSnapshotDataSourceForProvisioning(f, testConfig, l.config, pattern, l.cs, dc, l.pvc, l.sc, sDriver, pattern.VolMode, expectedContent) dataSource, cleanupFunc := prepareSnapshotDataSourceForProvisioning(f, testConfig, l.config, pattern, l.cs, dc, l.pvc, l.sc, sDriver, pattern.VolMode, expectedContent)
defer cleanupFunc() defer cleanupFunc()
@ -233,13 +233,13 @@ func (p *provisioningTestSuite) DefineTests(driver storageapi.TestDriver, patter
}) })
ginkgo.It("should provision storage with pvc data source", func() { ginkgo.It("should provision storage with pvc data source", func() {
if !dInfo.Capabilities[storageapi.CapPVCDataSource] { if !dInfo.Capabilities[storageframework.CapPVCDataSource] {
e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name)
} }
init() init()
defer cleanup() defer cleanup()
testConfig := storageapi.ConvertTestConfig(l.config) testConfig := storageframework.ConvertTestConfig(l.config)
expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name) expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name)
dataSource, dataSourceCleanup := preparePVCDataSourceForProvisioning(f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent) dataSource, dataSourceCleanup := preparePVCDataSourceForProvisioning(f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent)
defer dataSourceCleanup() defer dataSourceCleanup()
@ -262,17 +262,17 @@ func (p *provisioningTestSuite) DefineTests(driver storageapi.TestDriver, patter
ginkgo.It("should provision storage with pvc data source in parallel [Slow]", func() { ginkgo.It("should provision storage with pvc data source in parallel [Slow]", func() {
// Test cloning a single volume multiple times. // Test cloning a single volume multiple times.
if !dInfo.Capabilities[storageapi.CapPVCDataSource] { if !dInfo.Capabilities[storageframework.CapPVCDataSource] {
e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name)
} }
if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageapi.CapBlock] { if pattern.VolMode == v1.PersistentVolumeBlock && !dInfo.Capabilities[storageframework.CapBlock] {
e2eskipper.Skipf("Driver %q does not support block volumes - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support block volumes - skipping", dInfo.Name)
} }
init() init()
defer cleanup() defer cleanup()
testConfig := storageapi.ConvertTestConfig(l.config) testConfig := storageframework.ConvertTestConfig(l.config)
expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name) expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name)
dataSource, dataSourceCleanup := preparePVCDataSourceForProvisioning(f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent) dataSource, dataSourceCleanup := preparePVCDataSourceForProvisioning(f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent)
defer dataSourceCleanup() defer dataSourceCleanup()
@ -785,13 +785,13 @@ func verifyPVCsPending(client clientset.Interface, pvcs []*v1.PersistentVolumeCl
func prepareSnapshotDataSourceForProvisioning( func prepareSnapshotDataSourceForProvisioning(
f *framework.Framework, f *framework.Framework,
config e2evolume.TestConfig, config e2evolume.TestConfig,
perTestConfig *storageapi.PerTestConfig, perTestConfig *storageframework.PerTestConfig,
pattern storageapi.TestPattern, pattern storageframework.TestPattern,
client clientset.Interface, client clientset.Interface,
dynamicClient dynamic.Interface, dynamicClient dynamic.Interface,
initClaim *v1.PersistentVolumeClaim, initClaim *v1.PersistentVolumeClaim,
class *storagev1.StorageClass, class *storagev1.StorageClass,
sDriver storageapi.SnapshottableTestDriver, sDriver storageframework.SnapshottableTestDriver,
mode v1.PersistentVolumeMode, mode v1.PersistentVolumeMode,
injectContent string, injectContent string,
) (*v1.TypedLocalObjectReference, func()) { ) (*v1.TypedLocalObjectReference, func()) {
@ -817,7 +817,7 @@ func prepareSnapshotDataSourceForProvisioning(
} }
e2evolume.InjectContent(f, config, nil, "", tests) e2evolume.InjectContent(f, config, nil, "", tests)
snapshotResource := storageapi.CreateSnapshotResource(sDriver, perTestConfig, pattern, updatedClaim.GetName(), updatedClaim.GetNamespace(), f.Timeouts) snapshotResource := storageframework.CreateSnapshotResource(sDriver, perTestConfig, pattern, updatedClaim.GetName(), updatedClaim.GetNamespace(), f.Timeouts)
group := "snapshot.storage.k8s.io" group := "snapshot.storage.k8s.io"
dataSourceRef := &v1.TypedLocalObjectReference{ dataSourceRef := &v1.TypedLocalObjectReference{

View File

@ -35,7 +35,7 @@ import (
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -44,19 +44,19 @@ import (
const datapath = "/mnt/test/data" const datapath = "/mnt/test/data"
type snapshottableTestSuite struct { type snapshottableTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
var ( var (
sDriver storageapi.SnapshottableTestDriver sDriver storageframework.SnapshottableTestDriver
dDriver storageapi.DynamicPVTestDriver dDriver storageframework.DynamicPVTestDriver
) )
// InitCustomSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface // InitCustomSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomSnapshottableTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomSnapshottableTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &snapshottableTestSuite{ return &snapshottableTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "snapshottable", Name: "snapshottable",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -69,35 +69,35 @@ func InitCustomSnapshottableTestSuite(patterns []storageapi.TestPattern) storage
// InitSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface // InitSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitSnapshottableTestSuite() storageapi.TestSuite { func InitSnapshottableTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DynamicSnapshotDelete, storageframework.DynamicSnapshotDelete,
storageapi.DynamicSnapshotRetain, storageframework.DynamicSnapshotRetain,
storageapi.PreprovisionedSnapshotDelete, storageframework.PreprovisionedSnapshotDelete,
storageapi.PreprovisionedSnapshotRetain, storageframework.PreprovisionedSnapshotRetain,
} }
return InitCustomSnapshottableTestSuite(patterns) return InitCustomSnapshottableTestSuite(patterns)
} }
func (s *snapshottableTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (s *snapshottableTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return s.tsInfo return s.tsInfo
} }
func (s *snapshottableTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *snapshottableTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
// Check preconditions. // Check preconditions.
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
ok := false ok := false
_, ok = driver.(storageapi.SnapshottableTestDriver) _, ok = driver.(storageframework.SnapshottableTestDriver)
if !dInfo.Capabilities[storageapi.CapSnapshotDataSource] || !ok { if !dInfo.Capabilities[storageframework.CapSnapshotDataSource] || !ok {
e2eskipper.Skipf("Driver %q does not support snapshots - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support snapshots - skipping", dInfo.Name)
} }
_, ok = driver.(storageapi.DynamicPVTestDriver) _, ok = driver.(storageframework.DynamicPVTestDriver)
if !ok { if !ok {
e2eskipper.Skipf("Driver %q does not support dynamic provisioning - skipping", driver.GetDriverInfo().Name) e2eskipper.Skipf("Driver %q does not support dynamic provisioning - skipping", driver.GetDriverInfo().Name)
} }
} }
func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *snapshottableTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
@ -106,7 +106,7 @@ func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, patte
ginkgo.Describe("volume snapshot controller", func() { ginkgo.Describe("volume snapshot controller", func() {
var ( var (
err error err error
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
cleanupSteps []func() cleanupSteps []func()
@ -118,8 +118,8 @@ func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, patte
originalMntTestData string originalMntTestData string
) )
init := func() { init := func() {
sDriver, _ = driver.(storageapi.SnapshottableTestDriver) sDriver, _ = driver.(storageframework.SnapshottableTestDriver)
dDriver, _ = driver.(storageapi.DynamicPVTestDriver) dDriver, _ = driver.(storageframework.DynamicPVTestDriver)
cleanupSteps = make([]func(), 0) cleanupSteps = make([]func(), 0)
// init snap class, create a source PV, PVC, Pod // init snap class, create a source PV, PVC, Pod
cs = f.ClientSet cs = f.ClientSet
@ -129,11 +129,11 @@ func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, patte
config, driverCleanup = driver.PrepareTest(f) config, driverCleanup = driver.PrepareTest(f)
cleanupSteps = append(cleanupSteps, driverCleanup) cleanupSteps = append(cleanupSteps, driverCleanup)
var volumeResource *storageapi.VolumeResource var volumeResource *storageframework.VolumeResource
cleanupSteps = append(cleanupSteps, func() { cleanupSteps = append(cleanupSteps, func() {
framework.ExpectNoError(volumeResource.CleanupResource()) framework.ExpectNoError(volumeResource.CleanupResource())
}) })
volumeResource = storageapi.CreateVolumeResource(dDriver, config, pattern, s.GetTestSuiteInfo().SupportedSizeRange) volumeResource = storageframework.CreateVolumeResource(dDriver, config, pattern, s.GetTestSuiteInfo().SupportedSizeRange)
pvc = volumeResource.Pvc pvc = volumeResource.Pvc
sc = volumeResource.Sc sc = volumeResource.Sc
@ -188,11 +188,11 @@ func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, patte
) )
ginkgo.BeforeEach(func() { ginkgo.BeforeEach(func() {
var sr *storageapi.SnapshotResource var sr *storageframework.SnapshotResource
cleanupSteps = append(cleanupSteps, func() { cleanupSteps = append(cleanupSteps, func() {
framework.ExpectNoError(sr.CleanupResource(f.Timeouts)) framework.ExpectNoError(sr.CleanupResource(f.Timeouts))
}) })
sr = storageapi.CreateSnapshotResource(sDriver, config, pattern, pvc.GetName(), pvc.GetNamespace(), f.Timeouts) sr = storageframework.CreateSnapshotResource(sDriver, config, pattern, pvc.GetName(), pvc.GetNamespace(), f.Timeouts)
vs = sr.Vs vs = sr.Vs
vscontent = sr.Vscontent vscontent = sr.Vscontent
vsc = sr.Vsclass vsc = sr.Vsclass
@ -215,7 +215,7 @@ func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, patte
// Check SnapshotContent properties // Check SnapshotContent properties
ginkgo.By("checking the SnapshotContent") ginkgo.By("checking the SnapshotContent")
// PreprovisionedCreatedSnapshot do not need to set volume snapshot class name // PreprovisionedCreatedSnapshot do not need to set volume snapshot class name
if pattern.SnapshotType != storageapi.PreprovisionedCreatedSnapshot { if pattern.SnapshotType != storageframework.PreprovisionedCreatedSnapshot {
framework.ExpectEqual(snapshotContentSpec["volumeSnapshotClassName"], vsc.GetName()) framework.ExpectEqual(snapshotContentSpec["volumeSnapshotClassName"], vsc.GetName())
} }
framework.ExpectEqual(volumeSnapshotRef["name"], vs.GetName()) framework.ExpectEqual(volumeSnapshotRef["name"], vs.GetName())
@ -268,15 +268,15 @@ func (s *snapshottableTestSuite) DefineTests(driver storageapi.TestDriver, patte
framework.ExpectNoError(err) framework.ExpectNoError(err)
ginkgo.By("should delete the VolumeSnapshotContent according to its deletion policy") ginkgo.By("should delete the VolumeSnapshotContent according to its deletion policy")
err = storageapi.DeleteAndWaitSnapshot(dc, vs.GetNamespace(), vs.GetName(), framework.Poll, f.Timeouts.SnapshotDelete) err = storageutils.DeleteAndWaitSnapshot(dc, vs.GetNamespace(), vs.GetName(), framework.Poll, f.Timeouts.SnapshotDelete)
framework.ExpectNoError(err) framework.ExpectNoError(err)
switch pattern.SnapshotDeletionPolicy { switch pattern.SnapshotDeletionPolicy {
case storageapi.DeleteSnapshot: case storageframework.DeleteSnapshot:
ginkgo.By("checking the SnapshotContent has been deleted") ginkgo.By("checking the SnapshotContent has been deleted")
err = utils.WaitForGVRDeletion(dc, storageutils.SnapshotContentGVR, vscontent.GetName(), framework.Poll, f.Timeouts.SnapshotDelete) err = utils.WaitForGVRDeletion(dc, storageutils.SnapshotContentGVR, vscontent.GetName(), framework.Poll, f.Timeouts.SnapshotDelete)
framework.ExpectNoError(err) framework.ExpectNoError(err)
case storageapi.RetainSnapshot: case storageframework.RetainSnapshot:
ginkgo.By("checking the SnapshotContent has not been deleted") ginkgo.By("checking the SnapshotContent has not been deleted")
err = utils.WaitForGVRDeletion(dc, storageutils.SnapshotContentGVR, vscontent.GetName(), 1*time.Second /* poll */, 30*time.Second /* timeout */) err = utils.WaitForGVRDeletion(dc, storageutils.SnapshotContentGVR, vscontent.GetName(), 1*time.Second /* poll */, 30*time.Second /* timeout */)
framework.ExpectError(err) framework.ExpectError(err)

View File

@ -33,22 +33,22 @@ import (
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
type snapshottableStressTestSuite struct { type snapshottableStressTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
type snapshottableStressTest struct { type snapshottableStressTest struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
testOptions storageapi.VolumeSnapshotStressTestOptions testOptions storageframework.VolumeSnapshotStressTestOptions
driverCleanup func() driverCleanup func()
pods []*v1.Pod pods []*v1.Pod
volumes []*storageapi.VolumeResource volumes []*storageframework.VolumeResource
snapshots []*storageapi.SnapshotResource snapshots []*storageframework.SnapshotResource
// Because we are appending snapshot resources in parallel goroutines. // Because we are appending snapshot resources in parallel goroutines.
snapshotsMutex sync.Mutex snapshotsMutex sync.Mutex
@ -60,9 +60,9 @@ type snapshottableStressTest struct {
// InitCustomSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface // InitCustomSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomSnapshottableStressTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomSnapshottableStressTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &snapshottableStressTestSuite{ return &snapshottableStressTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "snapshottable-stress", Name: "snapshottable-stress",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -75,19 +75,19 @@ func InitCustomSnapshottableStressTestSuite(patterns []storageapi.TestPattern) s
// InitSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface // InitSnapshottableStressTestSuite returns snapshottableStressTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitSnapshottableStressTestSuite() storageapi.TestSuite { func InitSnapshottableStressTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DynamicSnapshotDelete, storageframework.DynamicSnapshotDelete,
storageapi.DynamicSnapshotRetain, storageframework.DynamicSnapshotRetain,
} }
return InitCustomSnapshottableStressTestSuite(patterns) return InitCustomSnapshottableStressTestSuite(patterns)
} }
func (t *snapshottableStressTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *snapshottableStressTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *snapshottableStressTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *snapshottableStressTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
driverInfo := driver.GetDriverInfo() driverInfo := driver.GetDriverInfo()
var ok bool var ok bool
if driverInfo.VolumeSnapshotStressTestOptions == nil { if driverInfo.VolumeSnapshotStressTestOptions == nil {
@ -99,21 +99,21 @@ func (t *snapshottableStressTestSuite) SkipUnsupportedTests(driver storageapi.Te
if driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots <= 0 { if driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots <= 0 {
framework.Failf("NumSnapshots in snapshot stress test options must be a positive integer, received: %d", driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots) framework.Failf("NumSnapshots in snapshot stress test options must be a positive integer, received: %d", driverInfo.VolumeSnapshotStressTestOptions.NumSnapshots)
} }
_, ok = driver.(storageapi.SnapshottableTestDriver) _, ok = driver.(storageframework.SnapshottableTestDriver)
if !driverInfo.Capabilities[storageapi.CapSnapshotDataSource] || !ok { if !driverInfo.Capabilities[storageframework.CapSnapshotDataSource] || !ok {
e2eskipper.Skipf("Driver %q doesn't implement SnapshottableTestDriver - skipping", driverInfo.Name) e2eskipper.Skipf("Driver %q doesn't implement SnapshottableTestDriver - skipping", driverInfo.Name)
} }
_, ok = driver.(storageapi.DynamicPVTestDriver) _, ok = driver.(storageframework.DynamicPVTestDriver)
if !ok { if !ok {
e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", driverInfo.Name) e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", driverInfo.Name)
} }
} }
func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *snapshottableStressTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
var ( var (
driverInfo *storageapi.DriverInfo driverInfo *storageframework.DriverInfo
snapshottableDriver storageapi.SnapshottableTestDriver snapshottableDriver storageframework.SnapshottableTestDriver
cs clientset.Interface cs clientset.Interface
stressTest *snapshottableStressTest stressTest *snapshottableStressTest
) )
@ -124,7 +124,7 @@ func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver,
init := func() { init := func() {
driverInfo = driver.GetDriverInfo() driverInfo = driver.GetDriverInfo()
snapshottableDriver, _ = driver.(storageapi.SnapshottableTestDriver) snapshottableDriver, _ = driver.(storageframework.SnapshottableTestDriver)
cs = f.ClientSet cs = f.ClientSet
config, driverCleanup := driver.PrepareTest(f) config, driverCleanup := driver.PrepareTest(f)
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
@ -132,8 +132,8 @@ func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver,
stressTest = &snapshottableStressTest{ stressTest = &snapshottableStressTest{
config: config, config: config,
driverCleanup: driverCleanup, driverCleanup: driverCleanup,
volumes: []*storageapi.VolumeResource{}, volumes: []*storageframework.VolumeResource{},
snapshots: []*storageapi.SnapshotResource{}, snapshots: []*storageframework.SnapshotResource{},
pods: []*v1.Pod{}, pods: []*v1.Pod{},
testOptions: *driverInfo.VolumeSnapshotStressTestOptions, testOptions: *driverInfo.VolumeSnapshotStressTestOptions,
ctx: ctx, ctx: ctx,
@ -145,7 +145,7 @@ func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver,
for i := 0; i < stressTest.testOptions.NumPods; i++ { for i := 0; i < stressTest.testOptions.NumPods; i++ {
framework.Logf("Creating resources for pod %d/%d", i, stressTest.testOptions.NumPods-1) framework.Logf("Creating resources for pod %d/%d", i, stressTest.testOptions.NumPods-1)
volume := storageapi.CreateVolumeResource(driver, stressTest.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange) volume := storageframework.CreateVolumeResource(driver, stressTest.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange)
stressTest.volumes = append(stressTest.volumes, volume) stressTest.volumes = append(stressTest.volumes, volume)
podConfig := e2epod.Config{ podConfig := e2epod.Config{
@ -197,7 +197,7 @@ func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver,
for i, snapshot := range stressTest.snapshots { for i, snapshot := range stressTest.snapshots {
wg.Add(1) wg.Add(1)
go func(i int, snapshot *storageapi.SnapshotResource) { go func(i int, snapshot *storageframework.SnapshotResource) {
defer ginkgo.GinkgoRecover() defer ginkgo.GinkgoRecover()
defer wg.Done() defer wg.Done()
@ -229,7 +229,7 @@ func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver,
for i, volume := range stressTest.volumes { for i, volume := range stressTest.volumes {
wg.Add(1) wg.Add(1)
go func(i int, volume *storageapi.VolumeResource) { go func(i int, volume *storageframework.VolumeResource) {
defer ginkgo.GinkgoRecover() defer ginkgo.GinkgoRecover()
defer wg.Done() defer wg.Done()
@ -275,7 +275,7 @@ func (t *snapshottableStressTestSuite) DefineTests(driver storageapi.TestDriver,
return return
default: default:
framework.Logf("Pod-%d [%s], Iteration %d/%d", podIndex, pod.Name, snapshotIndex, stressTest.testOptions.NumSnapshots-1) framework.Logf("Pod-%d [%s], Iteration %d/%d", podIndex, pod.Name, snapshotIndex, stressTest.testOptions.NumSnapshots-1)
snapshot := storageapi.CreateSnapshotResource(snapshottableDriver, stressTest.config, pattern, volume.Pvc.GetName(), volume.Pvc.GetNamespace(), f.Timeouts) snapshot := storageframework.CreateSnapshotResource(snapshottableDriver, stressTest.config, pattern, volume.Pvc.GetName(), volume.Pvc.GetNamespace(), f.Timeouts)
stressTest.snapshotsMutex.Lock() stressTest.snapshotsMutex.Lock()
defer stressTest.snapshotsMutex.Unlock() defer stressTest.snapshotsMutex.Unlock()
stressTest.snapshots = append(stressTest.snapshots, snapshot) stressTest.snapshots = append(stressTest.snapshots, snapshot)

View File

@ -39,7 +39,7 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
"k8s.io/kubernetes/test/e2e/storage/utils" "k8s.io/kubernetes/test/e2e/storage/utils"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
imageutils "k8s.io/kubernetes/test/utils/image" imageutils "k8s.io/kubernetes/test/utils/image"
@ -56,14 +56,14 @@ var (
) )
type subPathTestSuite struct { type subPathTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
// InitCustomSubPathTestSuite returns subPathTestSuite that implements TestSuite interface // InitCustomSubPathTestSuite returns subPathTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomSubPathTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomSubPathTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &subPathTestSuite{ return &subPathTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "subPath", Name: "subPath",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -75,33 +75,33 @@ func InitCustomSubPathTestSuite(patterns []storageapi.TestPattern) storageapi.Te
// InitSubPathTestSuite returns subPathTestSuite that implements TestSuite interface // InitSubPathTestSuite returns subPathTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitSubPathTestSuite() storageapi.TestSuite { func InitSubPathTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsInlineVolume, storageframework.DefaultFsInlineVolume,
storageapi.DefaultFsPreprovisionedPV, storageframework.DefaultFsPreprovisionedPV,
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
storageapi.NtfsDynamicPV, storageframework.NtfsDynamicPV,
} }
return InitCustomSubPathTestSuite(patterns) return InitCustomSubPathTestSuite(patterns)
} }
func (s *subPathTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (s *subPathTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return s.tsInfo return s.tsInfo
} }
func (s *subPathTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *subPathTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
skipVolTypePatterns(pattern, driver, storageapi.NewVolTypeMap( skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(
storageapi.PreprovisionedPV, storageframework.PreprovisionedPV,
storageapi.InlineVolume)) storageframework.InlineVolume))
} }
func (s *subPathTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (s *subPathTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
hostExec utils.HostExec hostExec utils.HostExec
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
roVolSource *v1.VolumeSource roVolSource *v1.VolumeSource
pod *v1.Pod pod *v1.Pod
formatPod *v1.Pod formatPod *v1.Pod
@ -115,7 +115,7 @@ func (s *subPathTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("provisioning", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("provisioning", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -124,24 +124,24 @@ func (s *subPathTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.migrationCheck = newMigrationOpCheck(f.ClientSet, driver.GetDriverInfo().InTreePluginName) l.migrationCheck = newMigrationOpCheck(f.ClientSet, driver.GetDriverInfo().InTreePluginName)
testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
l.hostExec = utils.NewHostExec(f) l.hostExec = utils.NewHostExec(f)
// Setup subPath test dependent resource // Setup subPath test dependent resource
volType := pattern.VolType volType := pattern.VolType
switch volType { switch volType {
case storageapi.InlineVolume: case storageframework.InlineVolume:
if iDriver, ok := driver.(storageapi.InlineVolumeTestDriver); ok { if iDriver, ok := driver.(storageframework.InlineVolumeTestDriver); ok {
l.roVolSource = iDriver.GetVolumeSource(true, pattern.FsType, l.resource.Volume) l.roVolSource = iDriver.GetVolumeSource(true, pattern.FsType, l.resource.Volume)
} }
case storageapi.PreprovisionedPV: case storageframework.PreprovisionedPV:
l.roVolSource = &v1.VolumeSource{ l.roVolSource = &v1.VolumeSource{
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
ClaimName: l.resource.Pvc.Name, ClaimName: l.resource.Pvc.Name,
ReadOnly: true, ReadOnly: true,
}, },
} }
case storageapi.DynamicPV: case storageframework.DynamicPV:
l.roVolSource = &v1.VolumeSource{ l.roVolSource = &v1.VolumeSource{
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{ PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
ClaimName: l.resource.Pvc.Name, ClaimName: l.resource.Pvc.Name,

View File

@ -35,21 +35,21 @@ import (
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
type topologyTestSuite struct { type topologyTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
type topologyTest struct { type topologyTest struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
migrationCheck *migrationOpCheck migrationCheck *migrationOpCheck
resource storageapi.VolumeResource resource storageframework.VolumeResource
pod *v1.Pod pod *v1.Pod
allTopologies []topology allTopologies []topology
} }
@ -58,9 +58,9 @@ type topology map[string]string
// InitCustomTopologyTestSuite returns topologyTestSuite that implements TestSuite interface // InitCustomTopologyTestSuite returns topologyTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomTopologyTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomTopologyTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &topologyTestSuite{ return &topologyTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "topology", Name: "topology",
TestPatterns: patterns, TestPatterns: patterns,
}, },
@ -69,51 +69,51 @@ func InitCustomTopologyTestSuite(patterns []storageapi.TestPattern) storageapi.T
// InitTopologyTestSuite returns topologyTestSuite that implements TestSuite interface // InitTopologyTestSuite returns topologyTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitTopologyTestSuite() storageapi.TestSuite { func InitTopologyTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.TopologyImmediate, storageframework.TopologyImmediate,
storageapi.TopologyDelayed, storageframework.TopologyDelayed,
} }
return InitCustomTopologyTestSuite(patterns) return InitCustomTopologyTestSuite(patterns)
} }
func (t *topologyTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *topologyTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *topologyTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *topologyTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
var ok bool var ok bool
_, ok = driver.(storageapi.DynamicPVTestDriver) _, ok = driver.(storageframework.DynamicPVTestDriver)
if !ok { if !ok {
e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType) e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType)
} }
if !dInfo.Capabilities[storageapi.CapTopology] { if !dInfo.Capabilities[storageframework.CapTopology] {
e2eskipper.Skipf("Driver %q does not support topology - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support topology - skipping", dInfo.Name)
} }
} }
func (t *topologyTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *topologyTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
var ( var (
dInfo = driver.GetDriverInfo() dInfo = driver.GetDriverInfo()
dDriver storageapi.DynamicPVTestDriver dDriver storageframework.DynamicPVTestDriver
cs clientset.Interface cs clientset.Interface
err error err error
) )
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("topology", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("topology", storageframework.GetDriverTimeouts(driver))
init := func() topologyTest { init := func() topologyTest {
dDriver, _ = driver.(storageapi.DynamicPVTestDriver) dDriver, _ = driver.(storageframework.DynamicPVTestDriver)
l := topologyTest{} l := topologyTest{}
// Now do the more expensive test initialization. // Now do the more expensive test initialization.
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.resource = storageapi.VolumeResource{ l.resource = storageframework.VolumeResource{
Config: l.config, Config: l.config,
Pattern: pattern, Pattern: pattern,
} }

View File

@ -34,7 +34,7 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -53,14 +53,14 @@ const (
) )
type volumeExpandTestSuite struct { type volumeExpandTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
// InitCustomVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface // InitCustomVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomVolumeExpandTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomVolumeExpandTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &volumeExpandTestSuite{ return &volumeExpandTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "volume-expand", Name: "volume-expand",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -72,39 +72,39 @@ func InitCustomVolumeExpandTestSuite(patterns []storageapi.TestPattern) storagea
// InitVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface // InitVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitVolumeExpandTestSuite() storageapi.TestSuite { func InitVolumeExpandTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
storageapi.DefaultFsDynamicPVAllowExpansion, storageframework.DefaultFsDynamicPVAllowExpansion,
storageapi.BlockVolModeDynamicPVAllowExpansion, storageframework.BlockVolModeDynamicPVAllowExpansion,
storageapi.NtfsDynamicPV, storageframework.NtfsDynamicPV,
storageapi.NtfsDynamicPVAllowExpansion, storageframework.NtfsDynamicPVAllowExpansion,
} }
return InitCustomVolumeExpandTestSuite(patterns) return InitCustomVolumeExpandTestSuite(patterns)
} }
func (v *volumeExpandTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (v *volumeExpandTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return v.tsInfo return v.tsInfo
} }
func (v *volumeExpandTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (v *volumeExpandTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
// Check preconditions. // Check preconditions.
if !driver.GetDriverInfo().Capabilities[storageapi.CapControllerExpansion] { if !driver.GetDriverInfo().Capabilities[storageframework.CapControllerExpansion] {
e2eskipper.Skipf("Driver %q does not support volume expansion - skipping", driver.GetDriverInfo().Name) e2eskipper.Skipf("Driver %q does not support volume expansion - skipping", driver.GetDriverInfo().Name)
} }
// Check preconditions. // Check preconditions.
if !driver.GetDriverInfo().Capabilities[storageapi.CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock { if !driver.GetDriverInfo().Capabilities[storageframework.CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock {
e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", driver.GetDriverInfo().Name) e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", driver.GetDriverInfo().Name)
} }
} }
func (v *volumeExpandTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (v *volumeExpandTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
pod *v1.Pod pod *v1.Pod
pod2 *v1.Pod pod2 *v1.Pod
@ -114,7 +114,7 @@ func (v *volumeExpandTestSuite) DefineTests(driver storageapi.TestDriver, patter
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("volume-expand", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("volume-expand", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -123,7 +123,7 @@ func (v *volumeExpandTestSuite) DefineTests(driver storageapi.TestDriver, patter
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.migrationCheck = newMigrationOpCheck(f.ClientSet, driver.GetDriverInfo().InTreePluginName) l.migrationCheck = newMigrationOpCheck(f.ClientSet, driver.GetDriverInfo().InTreePluginName)
testVolumeSizeRange := v.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := v.GetTestSuiteInfo().SupportedSizeRange
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
} }
cleanup := func() { cleanup := func() {

View File

@ -40,7 +40,7 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -48,22 +48,22 @@ import (
// Test files are generated in testVolumeIO() // Test files are generated in testVolumeIO()
// If test file generation algorithm changes, these must be recomputed. // If test file generation algorithm changes, these must be recomputed.
var md5hashes = map[int64]string{ var md5hashes = map[int64]string{
storageapi.FileSizeSmall: "5c34c2813223a7ca05a3c2f38c0d1710", storageframework.FileSizeSmall: "5c34c2813223a7ca05a3c2f38c0d1710",
storageapi.FileSizeMedium: "f2fa202b1ffeedda5f3a58bd1ae81104", storageframework.FileSizeMedium: "f2fa202b1ffeedda5f3a58bd1ae81104",
storageapi.FileSizeLarge: "8d763edc71bd16217664793b5a15e403", storageframework.FileSizeLarge: "8d763edc71bd16217664793b5a15e403",
} }
const mountPath = "/opt" const mountPath = "/opt"
type volumeIOTestSuite struct { type volumeIOTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
// InitCustomVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface // InitCustomVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomVolumeIOTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomVolumeIOTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &volumeIOTestSuite{ return &volumeIOTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "volumeIO", Name: "volumeIO",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -75,31 +75,31 @@ func InitCustomVolumeIOTestSuite(patterns []storageapi.TestPattern) storageapi.T
// InitVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface // InitVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitVolumeIOTestSuite() storageapi.TestSuite { func InitVolumeIOTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsInlineVolume, storageframework.DefaultFsInlineVolume,
storageapi.DefaultFsPreprovisionedPV, storageframework.DefaultFsPreprovisionedPV,
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
} }
return InitCustomVolumeIOTestSuite(patterns) return InitCustomVolumeIOTestSuite(patterns)
} }
func (t *volumeIOTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *volumeIOTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *volumeIOTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeIOTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
skipVolTypePatterns(pattern, driver, storageapi.NewVolTypeMap( skipVolTypePatterns(pattern, driver, storageframework.NewVolTypeMap(
storageapi.PreprovisionedPV, storageframework.PreprovisionedPV,
storageapi.InlineVolume)) storageframework.InlineVolume))
} }
func (t *volumeIOTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeIOTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
migrationCheck *migrationOpCheck migrationCheck *migrationOpCheck
} }
@ -110,7 +110,7 @@ func (t *volumeIOTestSuite) DefineTests(driver storageapi.TestDriver, pattern st
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("volumeio", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("volumeio", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -120,7 +120,7 @@ func (t *volumeIOTestSuite) DefineTests(driver storageapi.TestDriver, pattern st
l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName)
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
if l.resource.VolSource == nil { if l.resource.VolSource == nil {
e2eskipper.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
} }
@ -151,23 +151,23 @@ func (t *volumeIOTestSuite) DefineTests(driver storageapi.TestDriver, pattern st
fileSizes := createFileSizes(dInfo.MaxFileSize) fileSizes := createFileSizes(dInfo.MaxFileSize)
testFile := fmt.Sprintf("%s_io_test_%s", dInfo.Name, f.Namespace.Name) testFile := fmt.Sprintf("%s_io_test_%s", dInfo.Name, f.Namespace.Name)
var fsGroup *int64 var fsGroup *int64
if !framework.NodeOSDistroIs("windows") && dInfo.Capabilities[storageapi.CapFsGroup] { if !framework.NodeOSDistroIs("windows") && dInfo.Capabilities[storageframework.CapFsGroup] {
fsGroupVal := int64(1234) fsGroupVal := int64(1234)
fsGroup = &fsGroupVal fsGroup = &fsGroupVal
} }
podSec := v1.PodSecurityContext{ podSec := v1.PodSecurityContext{
FSGroup: fsGroup, FSGroup: fsGroup,
} }
err := testVolumeIO(f, cs, storageapi.ConvertTestConfig(l.config), *l.resource.VolSource, &podSec, testFile, fileSizes) err := testVolumeIO(f, cs, storageframework.ConvertTestConfig(l.config), *l.resource.VolSource, &podSec, testFile, fileSizes)
framework.ExpectNoError(err) framework.ExpectNoError(err)
}) })
} }
func createFileSizes(maxFileSize int64) []int64 { func createFileSizes(maxFileSize int64) []int64 {
allFileSizes := []int64{ allFileSizes := []int64{
storageapi.FileSizeSmall, storageframework.FileSizeSmall,
storageapi.FileSizeMedium, storageframework.FileSizeMedium,
storageapi.FileSizeLarge, storageframework.FileSizeLarge,
} }
fileSizes := []int64{} fileSizes := []int64{}
@ -249,8 +249,8 @@ func makePodSpec(config e2evolume.TestConfig, initCmd string, volsrc v1.VolumeSo
// Write `fsize` bytes to `fpath` in the pod, using dd and the `ddInput` file. // Write `fsize` bytes to `fpath` in the pod, using dd and the `ddInput` file.
func writeToFile(f *framework.Framework, pod *v1.Pod, fpath, ddInput string, fsize int64) error { func writeToFile(f *framework.Framework, pod *v1.Pod, fpath, ddInput string, fsize int64) error {
ginkgo.By(fmt.Sprintf("writing %d bytes to test file %s", fsize, fpath)) ginkgo.By(fmt.Sprintf("writing %d bytes to test file %s", fsize, fpath))
loopCnt := fsize / storageapi.MinFileSize loopCnt := fsize / storageframework.MinFileSize
writeCmd := fmt.Sprintf("i=0; while [ $i -lt %d ]; do dd if=%s bs=%d >>%s 2>/dev/null; let i+=1; done", loopCnt, ddInput, storageapi.MinFileSize, fpath) writeCmd := fmt.Sprintf("i=0; while [ $i -lt %d ]; do dd if=%s bs=%d >>%s 2>/dev/null; let i+=1; done", loopCnt, ddInput, storageframework.MinFileSize, fpath)
stdout, stderr, err := e2evolume.PodExec(f, pod, writeCmd) stdout, stderr, err := e2evolume.PodExec(f, pod, writeCmd)
if err != nil { if err != nil {
return fmt.Errorf("error writing to volume using %q: %s\nstdout: %s\nstderr: %s", writeCmd, err, stdout, stderr) return fmt.Errorf("error writing to volume using %q: %s\nstdout: %s\nstderr: %s", writeCmd, err, stdout, stderr)
@ -311,7 +311,7 @@ func deleteFile(f *framework.Framework, pod *v1.Pod, fpath string) {
func testVolumeIO(f *framework.Framework, cs clientset.Interface, config e2evolume.TestConfig, volsrc v1.VolumeSource, podSecContext *v1.PodSecurityContext, file string, fsizes []int64) (err error) { func testVolumeIO(f *framework.Framework, cs clientset.Interface, config e2evolume.TestConfig, volsrc v1.VolumeSource, podSecContext *v1.PodSecurityContext, file string, fsizes []int64) (err error) {
ddInput := filepath.Join(mountPath, fmt.Sprintf("%s-%s-dd_if", config.Prefix, config.Namespace)) ddInput := filepath.Join(mountPath, fmt.Sprintf("%s-%s-dd_if", config.Prefix, config.Namespace))
writeBlk := strings.Repeat("abcdefghijklmnopqrstuvwxyz123456", 32) // 1KiB value writeBlk := strings.Repeat("abcdefghijklmnopqrstuvwxyz123456", 32) // 1KiB value
loopCnt := storageapi.MinFileSize / int64(len(writeBlk)) loopCnt := storageframework.MinFileSize / int64(len(writeBlk))
// initContainer cmd to create and fill dd's input file. The initContainer is used to create // initContainer cmd to create and fill dd's input file. The initContainer is used to create
// the `dd` input file which is currently 1MiB. Rather than store a 1MiB go value, a loop is // the `dd` input file which is currently 1MiB. Rather than store a 1MiB go value, a loop is
// used to create a 1MiB file in the target directory. // used to create a 1MiB file in the target directory.
@ -348,8 +348,8 @@ func testVolumeIO(f *framework.Framework, cs clientset.Interface, config e2evolu
// create files of the passed-in file sizes and verify test file size and content // create files of the passed-in file sizes and verify test file size and content
for _, fsize := range fsizes { for _, fsize := range fsizes {
// file sizes must be a multiple of `MinFileSize` // file sizes must be a multiple of `MinFileSize`
if math.Mod(float64(fsize), float64(storageapi.MinFileSize)) != 0 { if math.Mod(float64(fsize), float64(storageframework.MinFileSize)) != 0 {
fsize = fsize/storageapi.MinFileSize + storageapi.MinFileSize fsize = fsize/storageframework.MinFileSize + storageframework.MinFileSize
} }
fpath := filepath.Join(mountPath, fmt.Sprintf("%s-%d", file, fsize)) fpath := filepath.Join(mountPath, fmt.Sprintf("%s-%d", file, fsize))
defer func() { defer func() {

View File

@ -32,37 +32,37 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
type volumeStressTestSuite struct { type volumeStressTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
type volumeStressTest struct { type volumeStressTest struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
migrationCheck *migrationOpCheck migrationCheck *migrationOpCheck
resources []*storageapi.VolumeResource resources []*storageframework.VolumeResource
pods []*v1.Pod pods []*v1.Pod
// stop and wait for any async routines // stop and wait for any async routines
wg sync.WaitGroup wg sync.WaitGroup
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
testOptions storageapi.StressTestOptions testOptions storageframework.StressTestOptions
} }
var _ storageapi.TestSuite = &volumeStressTestSuite{} var _ storageframework.TestSuite = &volumeStressTestSuite{}
// InitCustomVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface // InitCustomVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomVolumeStressTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomVolumeStressTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &volumeStressTestSuite{ return &volumeStressTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "volume-stress", Name: "volume-stress",
TestPatterns: patterns, TestPatterns: patterns,
}, },
@ -71,19 +71,19 @@ func InitCustomVolumeStressTestSuite(patterns []storageapi.TestPattern) storagea
// InitVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface // InitVolumeStressTestSuite returns volumeStressTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitVolumeStressTestSuite() storageapi.TestSuite { func InitVolumeStressTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
} }
return InitCustomVolumeStressTestSuite(patterns) return InitCustomVolumeStressTestSuite(patterns)
} }
func (t *volumeStressTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *volumeStressTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *volumeStressTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeStressTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
if dInfo.StressTestOptions == nil { if dInfo.StressTestOptions == nil {
e2eskipper.Skipf("Driver %s doesn't specify stress test options -- skipping", dInfo.Name) e2eskipper.Skipf("Driver %s doesn't specify stress test options -- skipping", dInfo.Name)
@ -95,15 +95,15 @@ func (t *volumeStressTestSuite) SkipUnsupportedTests(driver storageapi.TestDrive
framework.Failf("NumRestarts in stress test options must be a positive integer, received: %d", dInfo.StressTestOptions.NumRestarts) framework.Failf("NumRestarts in stress test options must be a positive integer, received: %d", dInfo.StressTestOptions.NumRestarts)
} }
if _, ok := driver.(storageapi.DynamicPVTestDriver); !ok { if _, ok := driver.(storageframework.DynamicPVTestDriver); !ok {
e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", dInfo.Name) e2eskipper.Skipf("Driver %s doesn't implement DynamicPVTestDriver -- skipping", dInfo.Name)
} }
if !driver.GetDriverInfo().Capabilities[storageapi.CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock { if !driver.GetDriverInfo().Capabilities[storageframework.CapBlock] && pattern.VolMode == v1.PersistentVolumeBlock {
e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support block volume mode - skipping", dInfo.Name)
} }
} }
func (t *volumeStressTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeStressTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
var ( var (
dInfo = driver.GetDriverInfo() dInfo = driver.GetDriverInfo()
cs clientset.Interface cs clientset.Interface
@ -112,7 +112,7 @@ func (t *volumeStressTestSuite) DefineTests(driver storageapi.TestDriver, patter
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("stress", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("stress", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
cs = f.ClientSet cs = f.ClientSet
@ -121,7 +121,7 @@ func (t *volumeStressTestSuite) DefineTests(driver storageapi.TestDriver, patter
// Now do the more expensive test initialization. // Now do the more expensive test initialization.
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName)
l.resources = []*storageapi.VolumeResource{} l.resources = []*storageframework.VolumeResource{}
l.pods = []*v1.Pod{} l.pods = []*v1.Pod{}
l.testOptions = *dInfo.StressTestOptions l.testOptions = *dInfo.StressTestOptions
l.ctx, l.cancel = context.WithCancel(context.Background()) l.ctx, l.cancel = context.WithCancel(context.Background())
@ -130,7 +130,7 @@ func (t *volumeStressTestSuite) DefineTests(driver storageapi.TestDriver, patter
createPodsAndVolumes := func() { createPodsAndVolumes := func() {
for i := 0; i < l.testOptions.NumPods; i++ { for i := 0; i < l.testOptions.NumPods; i++ {
framework.Logf("Creating resources for pod %v/%v", i, l.testOptions.NumPods-1) framework.Logf("Creating resources for pod %v/%v", i, l.testOptions.NumPods-1)
r := storageapi.CreateVolumeResource(driver, l.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange) r := storageframework.CreateVolumeResource(driver, l.config, pattern, t.GetTestSuiteInfo().SupportedSizeRange)
l.resources = append(l.resources, r) l.resources = append(l.resources, r)
podConfig := e2epod.Config{ podConfig := e2epod.Config{
NS: f.Namespace.Name, NS: f.Namespace.Name,

View File

@ -38,12 +38,12 @@ import (
e2enode "k8s.io/kubernetes/test/e2e/framework/node" e2enode "k8s.io/kubernetes/test/e2e/framework/node"
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
type volumeLimitsTestSuite struct { type volumeLimitsTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
const ( const (
@ -56,13 +56,13 @@ const (
csiNodeInfoTimeout = 1 * time.Minute csiNodeInfoTimeout = 1 * time.Minute
) )
var _ storageapi.TestSuite = &volumeLimitsTestSuite{} var _ storageframework.TestSuite = &volumeLimitsTestSuite{}
// InitCustomVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface // InitCustomVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomVolumeLimitsTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomVolumeLimitsTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &volumeLimitsTestSuite{ return &volumeLimitsTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "volumeLimits", Name: "volumeLimits",
TestPatterns: patterns, TestPatterns: patterns,
}, },
@ -71,29 +71,29 @@ func InitCustomVolumeLimitsTestSuite(patterns []storageapi.TestPattern) storagea
// InitVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface // InitVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitVolumeLimitsTestSuite() storageapi.TestSuite { func InitVolumeLimitsTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.FsVolModeDynamicPV, storageframework.FsVolModeDynamicPV,
} }
return InitCustomVolumeLimitsTestSuite(patterns) return InitCustomVolumeLimitsTestSuite(patterns)
} }
func (t *volumeLimitsTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *volumeLimitsTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *volumeLimitsTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeLimitsTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
} }
func (t *volumeLimitsTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeLimitsTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
testCleanup func() testCleanup func()
cs clientset.Interface cs clientset.Interface
ns *v1.Namespace ns *v1.Namespace
// VolumeResource contains pv, pvc, sc, etc. of the first pod created // VolumeResource contains pv, pvc, sc, etc. of the first pod created
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
// All created PVCs, incl. the one in resource // All created PVCs, incl. the one in resource
pvcs []*v1.PersistentVolumeClaim pvcs []*v1.PersistentVolumeClaim
@ -110,7 +110,7 @@ func (t *volumeLimitsTestSuite) DefineTests(driver storageapi.TestDriver, patter
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("volumelimits", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("volumelimits", storageframework.GetDriverTimeouts(driver))
// This checks that CSIMaxVolumeLimitChecker works as expected. // This checks that CSIMaxVolumeLimitChecker works as expected.
// A randomly chosen node should be able to handle as many CSI volumes as // A randomly chosen node should be able to handle as many CSI volumes as
@ -122,11 +122,11 @@ func (t *volumeLimitsTestSuite) DefineTests(driver storageapi.TestDriver, patter
// BEWARE: the test may create lot of volumes and it's really slow. // BEWARE: the test may create lot of volumes and it's really slow.
ginkgo.It("should support volume limits [Serial]", func() { ginkgo.It("should support volume limits [Serial]", func() {
driverInfo := driver.GetDriverInfo() driverInfo := driver.GetDriverInfo()
if !driverInfo.Capabilities[storageapi.CapVolumeLimits] { if !driverInfo.Capabilities[storageframework.CapVolumeLimits] {
ginkgo.Skip(fmt.Sprintf("driver %s does not support volume limits", driverInfo.Name)) ginkgo.Skip(fmt.Sprintf("driver %s does not support volume limits", driverInfo.Name))
} }
var dDriver storageapi.DynamicPVTestDriver var dDriver storageframework.DynamicPVTestDriver
if dDriver = driver.(storageapi.DynamicPVTestDriver); dDriver == nil { if dDriver = driver.(storageframework.DynamicPVTestDriver); dDriver == nil {
framework.Failf("Test driver does not provide dynamically created volumes") framework.Failf("Test driver does not provide dynamically created volumes")
} }
@ -158,7 +158,7 @@ func (t *volumeLimitsTestSuite) DefineTests(driver storageapi.TestDriver, patter
claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange) claimSize, err := storageutils.GetSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, dDriver) framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, dDriver)
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
defer func() { defer func() {
err := l.resource.CleanupResource() err := l.resource.CleanupResource()
framework.ExpectNoError(err, "while cleaning up resource") framework.ExpectNoError(err, "while cleaning up resource")
@ -316,14 +316,14 @@ func waitForAllPVCsBound(cs clientset.Interface, timeout time.Duration, pvcs []*
return pvNames, nil return pvNames, nil
} }
func getNodeLimits(cs clientset.Interface, config *storageapi.PerTestConfig, nodeName string, driverInfo *storageapi.DriverInfo) (int, error) { func getNodeLimits(cs clientset.Interface, config *storageframework.PerTestConfig, nodeName string, driverInfo *storageframework.DriverInfo) (int, error) {
if len(driverInfo.InTreePluginName) == 0 { if len(driverInfo.InTreePluginName) == 0 {
return getCSINodeLimits(cs, config, nodeName, driverInfo) return getCSINodeLimits(cs, config, nodeName, driverInfo)
} }
return getInTreeNodeLimits(cs, nodeName, driverInfo) return getInTreeNodeLimits(cs, nodeName, driverInfo)
} }
func getInTreeNodeLimits(cs clientset.Interface, nodeName string, driverInfo *storageapi.DriverInfo) (int, error) { func getInTreeNodeLimits(cs clientset.Interface, nodeName string, driverInfo *storageframework.DriverInfo) (int, error) {
node, err := cs.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) node, err := cs.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
if err != nil { if err != nil {
return 0, err return 0, err
@ -350,7 +350,7 @@ func getInTreeNodeLimits(cs clientset.Interface, nodeName string, driverInfo *st
return int(limit.Value()), nil return int(limit.Value()), nil
} }
func getCSINodeLimits(cs clientset.Interface, config *storageapi.PerTestConfig, nodeName string, driverInfo *storageapi.DriverInfo) (int, error) { func getCSINodeLimits(cs clientset.Interface, config *storageframework.PerTestConfig, nodeName string, driverInfo *storageframework.DriverInfo) (int, error) {
// Retry with a timeout, the driver might just have been installed and kubelet takes a while to publish everything. // Retry with a timeout, the driver might just have been installed and kubelet takes a while to publish everything.
var limit int var limit int
err := wait.PollImmediate(2*time.Second, csiNodeInfoTimeout, func() (bool, error) { err := wait.PollImmediate(2*time.Second, csiNodeInfoTimeout, func() (bool, error) {

View File

@ -39,7 +39,7 @@ import (
e2epv "k8s.io/kubernetes/test/e2e/framework/pv" e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
) )
@ -49,16 +49,16 @@ const (
) )
type volumeModeTestSuite struct { type volumeModeTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
var _ storageapi.TestSuite = &volumeModeTestSuite{} var _ storageframework.TestSuite = &volumeModeTestSuite{}
// InitCustomVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface // InitCustomVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomVolumeModeTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomVolumeModeTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &volumeModeTestSuite{ return &volumeModeTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "volumeMode", Name: "volumeMode",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -70,32 +70,32 @@ func InitCustomVolumeModeTestSuite(patterns []storageapi.TestPattern) storageapi
// InitVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface // InitVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitVolumeModeTestSuite() storageapi.TestSuite { func InitVolumeModeTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
storageapi.FsVolModePreprovisionedPV, storageframework.FsVolModePreprovisionedPV,
storageapi.FsVolModeDynamicPV, storageframework.FsVolModeDynamicPV,
storageapi.BlockVolModePreprovisionedPV, storageframework.BlockVolModePreprovisionedPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
} }
return InitCustomVolumeModeTestSuite(patterns) return InitCustomVolumeModeTestSuite(patterns)
} }
func (t *volumeModeTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *volumeModeTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *volumeModeTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeModeTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
} }
func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumeModeTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
cs clientset.Interface cs clientset.Interface
ns *v1.Namespace ns *v1.Namespace
// VolumeResource contains pv, pvc, sc, etc., owns cleaning that up // VolumeResource contains pv, pvc, sc, etc., owns cleaning that up
storageapi.VolumeResource storageframework.VolumeResource
migrationCheck *migrationOpCheck migrationCheck *migrationOpCheck
} }
@ -106,7 +106,7 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("volumemode", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("volumemode", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -131,22 +131,22 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
volumeNodeAffinity *v1.VolumeNodeAffinity volumeNodeAffinity *v1.VolumeNodeAffinity
) )
l.VolumeResource = storageapi.VolumeResource{ l.VolumeResource = storageframework.VolumeResource{
Config: l.config, Config: l.config,
Pattern: pattern, Pattern: pattern,
} }
// Create volume for pre-provisioned volume tests // Create volume for pre-provisioned volume tests
l.Volume = storageapi.CreateVolume(driver, l.config, pattern.VolType) l.Volume = storageframework.CreateVolume(driver, l.config, pattern.VolType)
switch pattern.VolType { switch pattern.VolType {
case storageapi.PreprovisionedPV: case storageframework.PreprovisionedPV:
if pattern.VolMode == v1.PersistentVolumeBlock { if pattern.VolMode == v1.PersistentVolumeBlock {
scName = fmt.Sprintf("%s-%s-sc-for-block", l.ns.Name, dInfo.Name) scName = fmt.Sprintf("%s-%s-sc-for-block", l.ns.Name, dInfo.Name)
} else if pattern.VolMode == v1.PersistentVolumeFilesystem { } else if pattern.VolMode == v1.PersistentVolumeFilesystem {
scName = fmt.Sprintf("%s-%s-sc-for-file", l.ns.Name, dInfo.Name) scName = fmt.Sprintf("%s-%s-sc-for-file", l.ns.Name, dInfo.Name)
} }
if pDriver, ok := driver.(storageapi.PreprovisionedPVTestDriver); ok { if pDriver, ok := driver.(storageframework.PreprovisionedPVTestDriver); ok {
pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, l.Volume) pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, l.Volume)
if pvSource == nil { if pvSource == nil {
e2eskipper.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name)
@ -157,8 +157,8 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
l.Pv = e2epv.MakePersistentVolume(pvConfig) l.Pv = e2epv.MakePersistentVolume(pvConfig)
l.Pvc = e2epv.MakePersistentVolumeClaim(pvcConfig, l.ns.Name) l.Pvc = e2epv.MakePersistentVolumeClaim(pvcConfig, l.ns.Name)
} }
case storageapi.DynamicPV: case storageframework.DynamicPV:
if dDriver, ok := driver.(storageapi.DynamicPVTestDriver); ok { if dDriver, ok := driver.(storageframework.DynamicPVTestDriver); ok {
l.Sc = dDriver.GetDynamicProvisionStorageClass(l.config, fsType) l.Sc = dDriver.GetDynamicProvisionStorageClass(l.config, fsType)
if l.Sc == nil { if l.Sc == nil {
e2eskipper.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name)
@ -190,9 +190,9 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
} }
// We register different tests depending on the drive // We register different tests depending on the drive
isBlockSupported := dInfo.Capabilities[storageapi.CapBlock] isBlockSupported := dInfo.Capabilities[storageframework.CapBlock]
switch pattern.VolType { switch pattern.VolType {
case storageapi.PreprovisionedPV: case storageframework.PreprovisionedPV:
if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported { if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported {
ginkgo.It("should fail to create pod by failing to mount volume [Slow]", func() { ginkgo.It("should fail to create pod by failing to mount volume [Slow]", func() {
manualInit() manualInit()
@ -253,7 +253,7 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
}) })
} }
case storageapi.DynamicPV: case storageframework.DynamicPV:
if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported { if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported {
ginkgo.It("should fail in binding dynamic provisioned PV to PVC [Slow][LinuxOnly]", func() { ginkgo.It("should fail in binding dynamic provisioned PV to PVC [Slow][LinuxOnly]", func() {
manualInit() manualInit()
@ -297,7 +297,7 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
skipTestIfBlockNotSupported(driver) skipTestIfBlockNotSupported(driver)
init() init()
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
l.VolumeResource = *storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.VolumeResource = *storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
defer cleanup() defer cleanup()
ginkgo.By("Creating pod") ginkgo.By("Creating pod")
@ -354,7 +354,7 @@ func (t *volumeModeTestSuite) DefineTests(driver storageapi.TestDriver, pattern
} }
init() init()
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
l.VolumeResource = *storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.VolumeResource = *storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
defer cleanup() defer cleanup()
ginkgo.By("Creating pod") ginkgo.By("Creating pod")

View File

@ -34,22 +34,22 @@ import (
e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
e2evolume "k8s.io/kubernetes/test/e2e/framework/volume" e2evolume "k8s.io/kubernetes/test/e2e/framework/volume"
storageapi "k8s.io/kubernetes/test/e2e/storage/api" storageframework "k8s.io/kubernetes/test/e2e/storage/framework"
storageutils "k8s.io/kubernetes/test/e2e/storage/utils" storageutils "k8s.io/kubernetes/test/e2e/storage/utils"
imageutils "k8s.io/kubernetes/test/utils/image" imageutils "k8s.io/kubernetes/test/utils/image"
) )
type volumesTestSuite struct { type volumesTestSuite struct {
tsInfo storageapi.TestSuiteInfo tsInfo storageframework.TestSuiteInfo
} }
var _ storageapi.TestSuite = &volumesTestSuite{} var _ storageframework.TestSuite = &volumesTestSuite{}
// InitCustomVolumesTestSuite returns volumesTestSuite that implements TestSuite interface // InitCustomVolumesTestSuite returns volumesTestSuite that implements TestSuite interface
// using custom test patterns // using custom test patterns
func InitCustomVolumesTestSuite(patterns []storageapi.TestPattern) storageapi.TestSuite { func InitCustomVolumesTestSuite(patterns []storageframework.TestPattern) storageframework.TestSuite {
return &volumesTestSuite{ return &volumesTestSuite{
tsInfo: storageapi.TestSuiteInfo{ tsInfo: storageframework.TestSuiteInfo{
Name: "volumes", Name: "volumes",
TestPatterns: patterns, TestPatterns: patterns,
SupportedSizeRange: e2evolume.SizeRange{ SupportedSizeRange: e2evolume.SizeRange{
@ -61,65 +61,65 @@ func InitCustomVolumesTestSuite(patterns []storageapi.TestPattern) storageapi.Te
// InitVolumesTestSuite returns volumesTestSuite that implements TestSuite interface // InitVolumesTestSuite returns volumesTestSuite that implements TestSuite interface
// using testsuite default patterns // using testsuite default patterns
func InitVolumesTestSuite() storageapi.TestSuite { func InitVolumesTestSuite() storageframework.TestSuite {
patterns := []storageapi.TestPattern{ patterns := []storageframework.TestPattern{
// Default fsType // Default fsType
storageapi.DefaultFsInlineVolume, storageframework.DefaultFsInlineVolume,
storageapi.DefaultFsPreprovisionedPV, storageframework.DefaultFsPreprovisionedPV,
storageapi.DefaultFsDynamicPV, storageframework.DefaultFsDynamicPV,
// ext3 // ext3
storageapi.Ext3InlineVolume, storageframework.Ext3InlineVolume,
storageapi.Ext3PreprovisionedPV, storageframework.Ext3PreprovisionedPV,
storageapi.Ext3DynamicPV, storageframework.Ext3DynamicPV,
// ext4 // ext4
storageapi.Ext4InlineVolume, storageframework.Ext4InlineVolume,
storageapi.Ext4PreprovisionedPV, storageframework.Ext4PreprovisionedPV,
storageapi.Ext4DynamicPV, storageframework.Ext4DynamicPV,
// xfs // xfs
storageapi.XfsInlineVolume, storageframework.XfsInlineVolume,
storageapi.XfsPreprovisionedPV, storageframework.XfsPreprovisionedPV,
storageapi.XfsDynamicPV, storageframework.XfsDynamicPV,
// ntfs // ntfs
storageapi.NtfsInlineVolume, storageframework.NtfsInlineVolume,
storageapi.NtfsPreprovisionedPV, storageframework.NtfsPreprovisionedPV,
storageapi.NtfsDynamicPV, storageframework.NtfsDynamicPV,
// block volumes // block volumes
storageapi.BlockVolModePreprovisionedPV, storageframework.BlockVolModePreprovisionedPV,
storageapi.BlockVolModeDynamicPV, storageframework.BlockVolModeDynamicPV,
} }
return InitCustomVolumesTestSuite(patterns) return InitCustomVolumesTestSuite(patterns)
} }
func (t *volumesTestSuite) GetTestSuiteInfo() storageapi.TestSuiteInfo { func (t *volumesTestSuite) GetTestSuiteInfo() storageframework.TestSuiteInfo {
return t.tsInfo return t.tsInfo
} }
func (t *volumesTestSuite) SkipUnsupportedTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumesTestSuite) SkipUnsupportedTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
if pattern.VolMode == v1.PersistentVolumeBlock { if pattern.VolMode == v1.PersistentVolumeBlock {
skipTestIfBlockNotSupported(driver) skipTestIfBlockNotSupported(driver)
} }
} }
func skipExecTest(driver storageapi.TestDriver) { func skipExecTest(driver storageframework.TestDriver) {
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
if !dInfo.Capabilities[storageapi.CapExec] { if !dInfo.Capabilities[storageframework.CapExec] {
e2eskipper.Skipf("Driver %q does not support exec - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not support exec - skipping", dInfo.Name)
} }
} }
func skipTestIfBlockNotSupported(driver storageapi.TestDriver) { func skipTestIfBlockNotSupported(driver storageframework.TestDriver) {
dInfo := driver.GetDriverInfo() dInfo := driver.GetDriverInfo()
if !dInfo.Capabilities[storageapi.CapBlock] { if !dInfo.Capabilities[storageframework.CapBlock] {
e2eskipper.Skipf("Driver %q does not provide raw block - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not provide raw block - skipping", dInfo.Name)
} }
} }
func (t *volumesTestSuite) DefineTests(driver storageapi.TestDriver, pattern storageapi.TestPattern) { func (t *volumesTestSuite) DefineTests(driver storageframework.TestDriver, pattern storageframework.TestPattern) {
type local struct { type local struct {
config *storageapi.PerTestConfig config *storageframework.PerTestConfig
driverCleanup func() driverCleanup func()
resource *storageapi.VolumeResource resource *storageframework.VolumeResource
migrationCheck *migrationOpCheck migrationCheck *migrationOpCheck
} }
@ -128,7 +128,7 @@ func (t *volumesTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
// Beware that it also registers an AfterEach which renders f unusable. Any code using // Beware that it also registers an AfterEach which renders f unusable. Any code using
// f must run inside an It or Context callback. // f must run inside an It or Context callback.
f := framework.NewFrameworkWithCustomTimeouts("volume", storageapi.GetDriverTimeouts(driver)) f := framework.NewFrameworkWithCustomTimeouts("volume", storageframework.GetDriverTimeouts(driver))
init := func() { init := func() {
l = local{} l = local{}
@ -137,7 +137,7 @@ func (t *volumesTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
l.config, l.driverCleanup = driver.PrepareTest(f) l.config, l.driverCleanup = driver.PrepareTest(f)
l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName) l.migrationCheck = newMigrationOpCheck(f.ClientSet, dInfo.InTreePluginName)
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
l.resource = storageapi.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange) l.resource = storageframework.CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
if l.resource.VolSource == nil { if l.resource.VolSource == nil {
e2eskipper.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name) e2eskipper.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
} }
@ -159,7 +159,7 @@ func (t *volumesTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
ginkgo.It("should store data", func() { ginkgo.It("should store data", func() {
init() init()
defer func() { defer func() {
e2evolume.TestServerCleanup(f, storageapi.ConvertTestConfig(l.config)) e2evolume.TestServerCleanup(f, storageframework.ConvertTestConfig(l.config))
cleanup() cleanup()
}() }()
@ -173,9 +173,9 @@ func (t *volumesTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
dInfo.Name, f.Namespace.Name), dInfo.Name, f.Namespace.Name),
}, },
} }
config := storageapi.ConvertTestConfig(l.config) config := storageframework.ConvertTestConfig(l.config)
var fsGroup *int64 var fsGroup *int64
if framework.NodeOSDistroIs("windows") && dInfo.Capabilities[storageapi.CapFsGroup] { if framework.NodeOSDistroIs("windows") && dInfo.Capabilities[storageframework.CapFsGroup] {
fsGroupVal := int64(1234) fsGroupVal := int64(1234)
fsGroup = &fsGroupVal fsGroup = &fsGroupVal
} }
@ -184,7 +184,7 @@ func (t *volumesTestSuite) DefineTests(driver storageapi.TestDriver, pattern sto
// and we don't have reliable way to detect volumes are unmounted or // and we don't have reliable way to detect volumes are unmounted or
// not before starting the second pod. // not before starting the second pod.
e2evolume.InjectContent(f, config, fsGroup, pattern.FsType, tests) e2evolume.InjectContent(f, config, fsGroup, pattern.FsType, tests)
if driver.GetDriverInfo().Capabilities[storageapi.CapPersistence] { if driver.GetDriverInfo().Capabilities[storageframework.CapPersistence] {
e2evolume.TestVolumeClient(f, config, fsGroup, pattern.FsType, tests) e2evolume.TestVolumeClient(f, config, fsGroup, pattern.FsType, tests)
} else { } else {
ginkgo.By("Skipping persistence check for non-persistent volume") ginkgo.By("Skipping persistence check for non-persistent volume")
@ -207,7 +207,7 @@ func testScriptInPod(
f *framework.Framework, f *framework.Framework,
volumeType string, volumeType string,
source *v1.VolumeSource, source *v1.VolumeSource,
config *storageapi.PerTestConfig) { config *storageframework.PerTestConfig) {
const ( const (
volPath = "/vol1" volPath = "/vol1"

View File

@ -30,6 +30,7 @@ go_library(
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
"//staging/src/k8s.io/client-go/dynamic:go_default_library", "//staging/src/k8s.io/client-go/dynamic:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",

View File

@ -21,8 +21,12 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/onsi/ginkgo"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/storage/names"
"k8s.io/client-go/dynamic" "k8s.io/client-go/dynamic"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
) )
@ -73,3 +77,66 @@ func WaitForSnapshotReady(c dynamic.Interface, ns string, snapshotName string, p
return fmt.Errorf("VolumeSnapshot %s is not ready within %v", snapshotName, timeout) return fmt.Errorf("VolumeSnapshot %s is not ready within %v", snapshotName, timeout)
} }
// GetSnapshotContentFromSnapshot returns the VolumeSnapshotContent object Bound to a
// given VolumeSnapshot
func GetSnapshotContentFromSnapshot(dc dynamic.Interface, snapshot *unstructured.Unstructured) *unstructured.Unstructured {
defer ginkgo.GinkgoRecover()
err := WaitForSnapshotReady(dc, snapshot.GetNamespace(), snapshot.GetName(), framework.Poll, framework.SnapshotCreateTimeout)
framework.ExpectNoError(err)
vs, err := dc.Resource(SnapshotGVR).Namespace(snapshot.GetNamespace()).Get(context.TODO(), snapshot.GetName(), metav1.GetOptions{})
snapshotStatus := vs.Object["status"].(map[string]interface{})
snapshotContentName := snapshotStatus["boundVolumeSnapshotContentName"].(string)
framework.Logf("received snapshotStatus %v", snapshotStatus)
framework.Logf("snapshotContentName %s", snapshotContentName)
framework.ExpectNoError(err)
vscontent, err := dc.Resource(SnapshotContentGVR).Get(context.TODO(), snapshotContentName, metav1.GetOptions{})
framework.ExpectNoError(err)
return vscontent
}
// DeleteAndWaitSnapshot deletes a VolumeSnapshot and waits for it to be deleted or until timeout occurs, whichever comes first
func DeleteAndWaitSnapshot(dc dynamic.Interface, ns string, snapshotName string, poll, timeout time.Duration) error {
var err error
ginkgo.By("deleting the snapshot")
err = dc.Resource(SnapshotGVR).Namespace(ns).Delete(context.TODO(), snapshotName, metav1.DeleteOptions{})
if err != nil && !apierrors.IsNotFound(err) {
return err
}
ginkgo.By("checking the Snapshot has been deleted")
err = WaitForNamespacedGVRDeletion(dc, SnapshotGVR, ns, snapshotName, poll, timeout)
return err
}
// GenerateSnapshotClassSpec constructs a new SnapshotClass instance spec
// with a unique name that is based on namespace + suffix.
func GenerateSnapshotClassSpec(
snapshotter string,
parameters map[string]string,
ns string,
suffix string,
) *unstructured.Unstructured {
snapshotClass := &unstructured.Unstructured{
Object: map[string]interface{}{
"kind": "VolumeSnapshotClass",
"apiVersion": SnapshotAPIVersion,
"metadata": map[string]interface{}{
// Name must be unique, so let's base it on namespace name and use GenerateName
// TODO(#96234): Remove unnecessary suffix.
"name": names.SimpleNameGenerator.GenerateName(ns + "-" + suffix),
},
"driver": snapshotter,
"parameters": parameters,
"deletionPolicy": "Delete",
},
}
return snapshotClass
}