mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 09:22:44 +00:00
e2e storage: public API for testsuites, support CSIInlineVolume type for generic resource
Implementing a test suite was impossible outside of the k8s.io/kubernetes/test/e2e/storage/testsuites package because all interfaces and structs used by them were private. As part of revamping the API, genericVolumeTestResource also gets exported because it is useful for other test suites. Because the TestResource interface became obsolete a while ago and isn't used anymore, the new name is just testsuites.VolumeResource. testpatterns.CSIInlineVolume needs special handling in a few places. It can now be used in a test pattern for a test suite that uses a VolumeResource instance.
This commit is contained in:
parent
bea2ca73f3
commit
160da35b23
@ -76,6 +76,11 @@ var (
|
|||||||
Name: "Inline-volume (default fs)",
|
Name: "Inline-volume (default fs)",
|
||||||
VolType: InlineVolume,
|
VolType: InlineVolume,
|
||||||
}
|
}
|
||||||
|
// DefaultFsEphemeralVolume is TestPattern for "Ephemeral-volume (default fs)"
|
||||||
|
DefaultFsEphemeralVolume = TestPattern{
|
||||||
|
Name: "Ephemeral-volume (default fs)",
|
||||||
|
VolType: CSIInlineVolume,
|
||||||
|
}
|
||||||
// DefaultFsPreprovisionedPV is TestPattern for "Pre-provisioned PV (default fs)"
|
// DefaultFsPreprovisionedPV is TestPattern for "Pre-provisioned PV (default fs)"
|
||||||
DefaultFsPreprovisionedPV = TestPattern{
|
DefaultFsPreprovisionedPV = TestPattern{
|
||||||
Name: "Pre-provisioned PV (default fs)",
|
Name: "Pre-provisioned PV (default fs)",
|
||||||
@ -95,6 +100,12 @@ var (
|
|||||||
VolType: InlineVolume,
|
VolType: InlineVolume,
|
||||||
FsType: "ext3",
|
FsType: "ext3",
|
||||||
}
|
}
|
||||||
|
// Ext3EphemeralVolume is TestPattern for "Ephemeral-volume (ext3)"
|
||||||
|
Ext3EphemeralVolume = TestPattern{
|
||||||
|
Name: "Ephemeral-volume (ext3)",
|
||||||
|
VolType: InlineVolume,
|
||||||
|
FsType: "ext3",
|
||||||
|
}
|
||||||
// Ext3PreprovisionedPV is TestPattern for "Pre-provisioned PV (ext3)"
|
// Ext3PreprovisionedPV is TestPattern for "Pre-provisioned PV (ext3)"
|
||||||
Ext3PreprovisionedPV = TestPattern{
|
Ext3PreprovisionedPV = TestPattern{
|
||||||
Name: "Pre-provisioned PV (ext3)",
|
Name: "Pre-provisioned PV (ext3)",
|
||||||
@ -116,6 +127,12 @@ var (
|
|||||||
VolType: InlineVolume,
|
VolType: InlineVolume,
|
||||||
FsType: "ext4",
|
FsType: "ext4",
|
||||||
}
|
}
|
||||||
|
// Ext4EphemeralVolume is TestPattern for "Ephemeral-volume (ext4)"
|
||||||
|
Ext4EphemeralVolume = TestPattern{
|
||||||
|
Name: "Ephemeral-volume (ext4)",
|
||||||
|
VolType: CSIInlineVolume,
|
||||||
|
FsType: "ext4",
|
||||||
|
}
|
||||||
// Ext4PreprovisionedPV is TestPattern for "Pre-provisioned PV (ext4)"
|
// Ext4PreprovisionedPV is TestPattern for "Pre-provisioned PV (ext4)"
|
||||||
Ext4PreprovisionedPV = TestPattern{
|
Ext4PreprovisionedPV = TestPattern{
|
||||||
Name: "Pre-provisioned PV (ext4)",
|
Name: "Pre-provisioned PV (ext4)",
|
||||||
@ -138,6 +155,13 @@ var (
|
|||||||
FsType: "xfs",
|
FsType: "xfs",
|
||||||
FeatureTag: "[Slow]",
|
FeatureTag: "[Slow]",
|
||||||
}
|
}
|
||||||
|
// XfsEphemeralVolume is TestPattern for "Ephemeral-volume (xfs)"
|
||||||
|
XfsEphemeralVolume = TestPattern{
|
||||||
|
Name: "Ephemeral-volume (xfs)",
|
||||||
|
VolType: CSIInlineVolume,
|
||||||
|
FsType: "xfs",
|
||||||
|
FeatureTag: "[Slow]",
|
||||||
|
}
|
||||||
// XfsPreprovisionedPV is TestPattern for "Pre-provisioned PV (xfs)"
|
// XfsPreprovisionedPV is TestPattern for "Pre-provisioned PV (xfs)"
|
||||||
XfsPreprovisionedPV = TestPattern{
|
XfsPreprovisionedPV = TestPattern{
|
||||||
Name: "Pre-provisioned PV (xfs)",
|
Name: "Pre-provisioned PV (xfs)",
|
||||||
@ -162,6 +186,13 @@ var (
|
|||||||
FsType: "ntfs",
|
FsType: "ntfs",
|
||||||
FeatureTag: "[sig-windows]",
|
FeatureTag: "[sig-windows]",
|
||||||
}
|
}
|
||||||
|
// NtfsEphemeralVolume is TestPattern for "Ephemeral-volume (ntfs)"
|
||||||
|
NtfsEphemeralVolume = TestPattern{
|
||||||
|
Name: "Ephemeral-volume (ntfs)",
|
||||||
|
VolType: CSIInlineVolume,
|
||||||
|
FsType: "ntfs",
|
||||||
|
FeatureTag: "[sig-windows]",
|
||||||
|
}
|
||||||
// NtfsPreprovisionedPV is TestPattern for "Pre-provisioned PV (ntfs)"
|
// NtfsPreprovisionedPV is TestPattern for "Pre-provisioned PV (ntfs)"
|
||||||
NtfsPreprovisionedPV = TestPattern{
|
NtfsPreprovisionedPV = TestPattern{
|
||||||
Name: "Pre-provisioned PV (ntfs)",
|
Name: "Pre-provisioned PV (ntfs)",
|
||||||
|
@ -62,48 +62,42 @@ type opCounts map[string]int64
|
|||||||
|
|
||||||
// TestSuite represents an interface for a set of tests which works with TestDriver
|
// TestSuite represents an interface for a set of tests which works with TestDriver
|
||||||
type TestSuite interface {
|
type TestSuite interface {
|
||||||
// getTestSuiteInfo returns the TestSuiteInfo for this TestSuite
|
// GetTestSuiteInfo returns the TestSuiteInfo for this TestSuite
|
||||||
getTestSuiteInfo() TestSuiteInfo
|
GetTestSuiteInfo() TestSuiteInfo
|
||||||
// defineTest defines tests of the testpattern for the driver.
|
// DefineTests defines tests of the testpattern for the driver.
|
||||||
// Called inside a Ginkgo context that reflects the current driver and test pattern,
|
// Called inside a Ginkgo context that reflects the current driver and test pattern,
|
||||||
// so the test suite can define tests directly with ginkgo.It.
|
// so the test suite can define tests directly with ginkgo.It.
|
||||||
defineTests(TestDriver, testpatterns.TestPattern)
|
DefineTests(TestDriver, testpatterns.TestPattern)
|
||||||
// skipRedundantSuite will skip the test suite based on the given TestPattern and TestDriver
|
// SkipRedundantSuite will skip the test suite based on the given TestPattern and TestDriver
|
||||||
skipRedundantSuite(TestDriver, testpatterns.TestPattern)
|
SkipRedundantSuite(TestDriver, testpatterns.TestPattern)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestSuiteInfo represents a set of parameters for TestSuite
|
// TestSuiteInfo represents a set of parameters for TestSuite
|
||||||
type TestSuiteInfo struct {
|
type TestSuiteInfo struct {
|
||||||
name string // name of the TestSuite
|
Name string // name of the TestSuite
|
||||||
featureTag string // featureTag for the TestSuite
|
FeatureTag string // featureTag for the TestSuite
|
||||||
testPatterns []testpatterns.TestPattern // Slice of TestPattern for the TestSuite
|
TestPatterns []testpatterns.TestPattern // Slice of TestPattern for the TestSuite
|
||||||
supportedSizeRange volume.SizeRange // Size range supported by the test suite
|
SupportedSizeRange volume.SizeRange // Size range supported by the test suite
|
||||||
}
|
|
||||||
|
|
||||||
// TestResource represents an interface for resources that is used by TestSuite
|
|
||||||
type TestResource interface {
|
|
||||||
// cleanupResource cleans up the test resources created when setting up the resource
|
|
||||||
cleanupResource() error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string {
|
func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string {
|
||||||
tsInfo := suite.getTestSuiteInfo()
|
tsInfo := suite.GetTestSuiteInfo()
|
||||||
return fmt.Sprintf("[Testpattern: %s]%s %s%s", pattern.Name, pattern.FeatureTag, tsInfo.name, tsInfo.featureTag)
|
return fmt.Sprintf("[Testpattern: %s]%s %s%s", pattern.Name, pattern.FeatureTag, tsInfo.Name, tsInfo.FeatureTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefineTestSuite defines tests for all testpatterns and all testSuites for a driver
|
// DefineTestSuite defines tests for all testpatterns and all testSuites for a driver
|
||||||
func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite) {
|
func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite) {
|
||||||
for _, testSuiteInit := range tsInits {
|
for _, testSuiteInit := range tsInits {
|
||||||
suite := testSuiteInit()
|
suite := testSuiteInit()
|
||||||
for _, pattern := range suite.getTestSuiteInfo().testPatterns {
|
for _, pattern := range suite.GetTestSuiteInfo().TestPatterns {
|
||||||
p := pattern
|
p := pattern
|
||||||
ginkgo.Context(getTestNameStr(suite, p), func() {
|
ginkgo.Context(getTestNameStr(suite, p), func() {
|
||||||
ginkgo.BeforeEach(func() {
|
ginkgo.BeforeEach(func() {
|
||||||
// Skip unsupported tests to avoid unnecessary resource initialization
|
// Skip unsupported tests to avoid unnecessary resource initialization
|
||||||
suite.skipRedundantSuite(driver, p)
|
suite.SkipRedundantSuite(driver, p)
|
||||||
skipUnsupportedTest(driver, p)
|
skipUnsupportedTest(driver, p)
|
||||||
})
|
})
|
||||||
suite.defineTests(driver, p)
|
suite.DefineTests(driver, p)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -117,7 +111,7 @@ func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite) {
|
|||||||
// 3. Check if fsType is supported
|
// 3. Check if fsType is supported
|
||||||
// 4. Check with driver specific logic
|
// 4. Check with driver specific logic
|
||||||
//
|
//
|
||||||
// Test suites can also skip tests inside their own defineTests function or in
|
// Test suites can also skip tests inside their own DefineTests function or in
|
||||||
// individual tests.
|
// individual tests.
|
||||||
func skipUnsupportedTest(driver TestDriver, pattern testpatterns.TestPattern) {
|
func skipUnsupportedTest(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
@ -170,54 +164,52 @@ func skipUnsupportedTest(driver TestDriver, pattern testpatterns.TestPattern) {
|
|||||||
driver.SkipUnsupportedTest(pattern)
|
driver.SkipUnsupportedTest(pattern)
|
||||||
}
|
}
|
||||||
|
|
||||||
// genericVolumeTestResource is a generic implementation of TestResource that wil be able to
|
// VolumeResource is a generic implementation of TestResource that wil be able to
|
||||||
// be used in most of TestSuites.
|
// be used in most of TestSuites.
|
||||||
// See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource.
|
// See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource.
|
||||||
// Also, see subpath.go in the same directory for how to extend and use it.
|
// Also, see subpath.go in the same directory for how to extend and use it.
|
||||||
type genericVolumeTestResource struct {
|
type VolumeResource struct {
|
||||||
driver TestDriver
|
Config *PerTestConfig
|
||||||
config *PerTestConfig
|
Pattern testpatterns.TestPattern
|
||||||
pattern testpatterns.TestPattern
|
VolType string
|
||||||
volType string
|
VolSource *v1.VolumeSource
|
||||||
volSource *v1.VolumeSource
|
Pvc *v1.PersistentVolumeClaim
|
||||||
pvc *v1.PersistentVolumeClaim
|
Pv *v1.PersistentVolume
|
||||||
pv *v1.PersistentVolume
|
Sc *storagev1.StorageClass
|
||||||
sc *storagev1.StorageClass
|
|
||||||
|
|
||||||
volume TestVolume
|
Volume TestVolume
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestResource = &genericVolumeTestResource{}
|
// CreateVolumeResource constructs a VolumeResource for the current test. It knows how to deal with
|
||||||
|
// different test pattern volume types.
|
||||||
func createGenericVolumeTestResource(driver TestDriver, config *PerTestConfig, pattern testpatterns.TestPattern, testVolumeSizeRange volume.SizeRange) *genericVolumeTestResource {
|
func CreateVolumeResource(driver TestDriver, config *PerTestConfig, pattern testpatterns.TestPattern, testVolumeSizeRange volume.SizeRange) *VolumeResource {
|
||||||
r := genericVolumeTestResource{
|
r := VolumeResource{
|
||||||
driver: driver,
|
Config: config,
|
||||||
config: config,
|
Pattern: pattern,
|
||||||
pattern: pattern,
|
|
||||||
}
|
}
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := config.Framework
|
f := config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
|
|
||||||
// Create volume for pre-provisioned volume tests
|
// Create volume for pre-provisioned volume tests
|
||||||
r.volume = CreateVolume(driver, config, pattern.VolType)
|
r.Volume = CreateVolume(driver, config, pattern.VolType)
|
||||||
|
|
||||||
switch pattern.VolType {
|
switch pattern.VolType {
|
||||||
case testpatterns.InlineVolume:
|
case testpatterns.InlineVolume:
|
||||||
framework.Logf("Creating resource for inline volume")
|
framework.Logf("Creating resource for inline volume")
|
||||||
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
|
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
|
||||||
r.volSource = iDriver.GetVolumeSource(false, pattern.FsType, r.volume)
|
r.VolSource = iDriver.GetVolumeSource(false, pattern.FsType, r.Volume)
|
||||||
r.volType = dInfo.Name
|
r.VolType = dInfo.Name
|
||||||
}
|
}
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
framework.Logf("Creating resource for pre-provisioned PV")
|
framework.Logf("Creating resource for pre-provisioned PV")
|
||||||
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
|
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
|
||||||
pvSource, volumeNodeAffinity := pDriver.GetPersistentVolumeSource(false, pattern.FsType, r.volume)
|
pvSource, volumeNodeAffinity := pDriver.GetPersistentVolumeSource(false, pattern.FsType, r.Volume)
|
||||||
if pvSource != nil {
|
if pvSource != nil {
|
||||||
r.pv, r.pvc = createPVCPV(f, dInfo.Name, pvSource, volumeNodeAffinity, pattern.VolMode, dInfo.RequiredAccessModes)
|
r.Pv, r.Pvc = createPVCPV(f, dInfo.Name, pvSource, volumeNodeAffinity, pattern.VolMode, dInfo.RequiredAccessModes)
|
||||||
r.volSource = createVolumeSource(r.pvc.Name, false /* readOnly */)
|
r.VolSource = createVolumeSource(r.Pvc.Name, false /* readOnly */)
|
||||||
}
|
}
|
||||||
r.volType = fmt.Sprintf("%s-preprovisionedPV", dInfo.Name)
|
r.VolType = fmt.Sprintf("%s-preprovisionedPV", dInfo.Name)
|
||||||
}
|
}
|
||||||
case testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
framework.Logf("Creating resource for dynamic PV")
|
framework.Logf("Creating resource for dynamic PV")
|
||||||
@ -227,32 +219,44 @@ func createGenericVolumeTestResource(driver TestDriver, config *PerTestConfig, p
|
|||||||
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
framework.Logf("Using claimSize:%s, test suite supported size:%v, driver(%s) supported size:%v ", claimSize, testVolumeSizeRange, dDriver.GetDriverInfo().Name, testVolumeSizeRange)
|
framework.Logf("Using claimSize:%s, test suite supported size:%v, driver(%s) supported size:%v ", claimSize, testVolumeSizeRange, dDriver.GetDriverInfo().Name, testVolumeSizeRange)
|
||||||
r.sc = dDriver.GetDynamicProvisionStorageClass(r.config, pattern.FsType)
|
r.Sc = dDriver.GetDynamicProvisionStorageClass(r.Config, pattern.FsType)
|
||||||
|
|
||||||
if pattern.BindingMode != "" {
|
if pattern.BindingMode != "" {
|
||||||
r.sc.VolumeBindingMode = &pattern.BindingMode
|
r.Sc.VolumeBindingMode = &pattern.BindingMode
|
||||||
}
|
}
|
||||||
if pattern.AllowExpansion != false {
|
if pattern.AllowExpansion != false {
|
||||||
r.sc.AllowVolumeExpansion = &pattern.AllowExpansion
|
r.Sc.AllowVolumeExpansion = &pattern.AllowExpansion
|
||||||
}
|
}
|
||||||
|
|
||||||
ginkgo.By("creating a StorageClass " + r.sc.Name)
|
ginkgo.By("creating a StorageClass " + r.Sc.Name)
|
||||||
|
|
||||||
r.sc, err = cs.StorageV1().StorageClasses().Create(r.sc)
|
r.Sc, err = cs.StorageV1().StorageClasses().Create(r.Sc)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
if r.sc != nil {
|
if r.Sc != nil {
|
||||||
r.pv, r.pvc = createPVCPVFromDynamicProvisionSC(
|
r.Pv, r.Pvc = createPVCPVFromDynamicProvisionSC(
|
||||||
f, dInfo.Name, claimSize, r.sc, pattern.VolMode, dInfo.RequiredAccessModes)
|
f, dInfo.Name, claimSize, r.Sc, pattern.VolMode, dInfo.RequiredAccessModes)
|
||||||
r.volSource = createVolumeSource(r.pvc.Name, false /* readOnly */)
|
r.VolSource = createVolumeSource(r.Pvc.Name, false /* readOnly */)
|
||||||
|
}
|
||||||
|
r.VolType = fmt.Sprintf("%s-dynamicPV", dInfo.Name)
|
||||||
|
}
|
||||||
|
case testpatterns.CSIInlineVolume:
|
||||||
|
framework.Logf("Creating resource for CSI ephemeral inline volume")
|
||||||
|
if eDriver, ok := driver.(EphemeralTestDriver); ok {
|
||||||
|
r.VolType = fmt.Sprintf("%s-ephemeral", dInfo.Name)
|
||||||
|
attributes, _, _ := eDriver.GetVolume(config, 0)
|
||||||
|
r.VolSource = &v1.VolumeSource{
|
||||||
|
CSI: &v1.CSIVolumeSource{
|
||||||
|
Driver: eDriver.GetCSIDriverName(config),
|
||||||
|
VolumeAttributes: attributes,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
r.volType = fmt.Sprintf("%s-dynamicPV", dInfo.Name)
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
framework.Failf("genericVolumeTestResource doesn't support: %s", pattern.VolType)
|
framework.Failf("VolumeResource doesn't support: %s", pattern.VolType)
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.volSource == nil {
|
if r.VolSource == nil {
|
||||||
framework.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType)
|
framework.Skipf("Driver %s doesn't support %v -- skipping", dInfo.Name, pattern.VolType)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,52 +273,52 @@ func createVolumeSource(pvcName string, readOnly bool) *v1.VolumeSource {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// cleanupResource cleans up genericVolumeTestResource
|
// CleanupResource cleans up VolumeResource
|
||||||
func (r *genericVolumeTestResource) cleanupResource() error {
|
func (r *VolumeResource) CleanupResource() error {
|
||||||
f := r.config.Framework
|
f := r.Config.Framework
|
||||||
var cleanUpErrs []error
|
var cleanUpErrs []error
|
||||||
if r.pvc != nil || r.pv != nil {
|
if r.Pvc != nil || r.Pv != nil {
|
||||||
switch r.pattern.VolType {
|
switch r.Pattern.VolType {
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
ginkgo.By("Deleting pv and pvc")
|
ginkgo.By("Deleting pv and pvc")
|
||||||
if errs := e2epv.PVPVCCleanup(f.ClientSet, f.Namespace.Name, r.pv, r.pvc); len(errs) != 0 {
|
if errs := e2epv.PVPVCCleanup(f.ClientSet, f.Namespace.Name, r.Pv, r.Pvc); len(errs) != 0 {
|
||||||
framework.Failf("Failed to delete PVC or PV: %v", utilerrors.NewAggregate(errs))
|
framework.Failf("Failed to delete PVC or PV: %v", utilerrors.NewAggregate(errs))
|
||||||
}
|
}
|
||||||
case testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
ginkgo.By("Deleting pvc")
|
ginkgo.By("Deleting pvc")
|
||||||
// We only delete the PVC so that PV (and disk) can be cleaned up by dynamic provisioner
|
// We only delete the PVC so that PV (and disk) can be cleaned up by dynamic provisioner
|
||||||
if r.pv != nil && r.pv.Spec.PersistentVolumeReclaimPolicy != v1.PersistentVolumeReclaimDelete {
|
if r.Pv != nil && r.Pv.Spec.PersistentVolumeReclaimPolicy != v1.PersistentVolumeReclaimDelete {
|
||||||
framework.Failf("Test framework does not currently support Dynamically Provisioned Persistent Volume %v specified with reclaim policy that isnt %v",
|
framework.Failf("Test framework does not currently support Dynamically Provisioned Persistent Volume %v specified with reclaim policy that isnt %v",
|
||||||
r.pv.Name, v1.PersistentVolumeReclaimDelete)
|
r.Pv.Name, v1.PersistentVolumeReclaimDelete)
|
||||||
}
|
}
|
||||||
if r.pvc != nil {
|
if r.Pvc != nil {
|
||||||
err := e2epv.DeletePersistentVolumeClaim(f.ClientSet, r.pvc.Name, f.Namespace.Name)
|
err := e2epv.DeletePersistentVolumeClaim(f.ClientSet, r.Pvc.Name, f.Namespace.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete PVC %v", r.pvc.Name))
|
cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete PVC %v", r.Pvc.Name))
|
||||||
}
|
}
|
||||||
if r.pv != nil {
|
if r.Pv != nil {
|
||||||
err = framework.WaitForPersistentVolumeDeleted(f.ClientSet, r.pv.Name, 5*time.Second, 5*time.Minute)
|
err = framework.WaitForPersistentVolumeDeleted(f.ClientSet, r.Pv.Name, 5*time.Second, 5*time.Minute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err,
|
cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err,
|
||||||
"Persistent Volume %v not deleted by dynamic provisioner", r.pv.Name))
|
"Persistent Volume %v not deleted by dynamic provisioner", r.Pv.Name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
framework.Failf("Found PVC (%v) or PV (%v) but not running Preprovisioned or Dynamic test pattern", r.pvc, r.pv)
|
framework.Failf("Found PVC (%v) or PV (%v) but not running Preprovisioned or Dynamic test pattern", r.Pvc, r.Pv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.sc != nil {
|
if r.Sc != nil {
|
||||||
ginkgo.By("Deleting sc")
|
ginkgo.By("Deleting sc")
|
||||||
if err := deleteStorageClass(f.ClientSet, r.sc.Name); err != nil {
|
if err := deleteStorageClass(f.ClientSet, r.Sc.Name); err != nil {
|
||||||
cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete StorageClass %v", r.sc.Name))
|
cleanUpErrs = append(cleanUpErrs, errors.Wrapf(err, "Failed to delete StorageClass %v", r.Sc.Name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup volume for pre-provisioned volume tests
|
// Cleanup volume for pre-provisioned volume tests
|
||||||
if r.volume != nil {
|
if r.Volume != nil {
|
||||||
if err := tryFunc(r.volume.DeleteVolume); err != nil {
|
if err := tryFunc(r.Volume.DeleteVolume); err != nil {
|
||||||
cleanUpErrs = append(cleanUpErrs, errors.Wrap(err, "Failed to delete Volume"))
|
cleanUpErrs = append(cleanUpErrs, errors.Wrap(err, "Failed to delete Volume"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,9 +39,9 @@ var _ TestSuite = &disruptiveTestSuite{}
|
|||||||
func InitDisruptiveTestSuite() TestSuite {
|
func InitDisruptiveTestSuite() TestSuite {
|
||||||
return &disruptiveTestSuite{
|
return &disruptiveTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "disruptive",
|
Name: "disruptive",
|
||||||
featureTag: "[Disruptive]",
|
FeatureTag: "[Disruptive]",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
// FSVolMode is already covered in subpath testsuite
|
// FSVolMode is already covered in subpath testsuite
|
||||||
testpatterns.DefaultFsInlineVolume,
|
testpatterns.DefaultFsInlineVolume,
|
||||||
testpatterns.FsVolModePreprovisionedPV,
|
testpatterns.FsVolModePreprovisionedPV,
|
||||||
@ -52,15 +52,15 @@ func InitDisruptiveTestSuite() TestSuite {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (s *disruptiveTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (s *disruptiveTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return s.tsInfo
|
return s.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *disruptiveTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (s *disruptiveTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV))
|
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (s *disruptiveTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
@ -68,8 +68,8 @@ func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
ns *v1.Namespace
|
ns *v1.Namespace
|
||||||
|
|
||||||
// genericVolumeTestResource contains pv, pvc, sc, etc., owns cleaning that up
|
// VolumeResource contains pv, pvc, sc, etc., owns cleaning that up
|
||||||
resource *genericVolumeTestResource
|
resource *VolumeResource
|
||||||
pod *v1.Pod
|
pod *v1.Pod
|
||||||
}
|
}
|
||||||
var l local
|
var l local
|
||||||
@ -94,8 +94,8 @@ func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
framework.Skipf("Driver %s doesn't support %v -- skipping", driver.GetDriverInfo().Name, pattern.VolMode)
|
framework.Skipf("Driver %s doesn't support %v -- skipping", driver.GetDriverInfo().Name, pattern.VolMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
testVolumeSizeRange := s.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.resource = createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup := func() {
|
cleanup := func() {
|
||||||
@ -108,7 +108,7 @@ func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
}
|
}
|
||||||
|
|
||||||
if l.resource != nil {
|
if l.resource != nil {
|
||||||
err := l.resource.cleanupResource()
|
err := l.resource.CleanupResource()
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
l.resource = nil
|
l.resource = nil
|
||||||
}
|
}
|
||||||
@ -154,9 +154,9 @@ func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
var pvcs []*v1.PersistentVolumeClaim
|
var pvcs []*v1.PersistentVolumeClaim
|
||||||
var inlineSources []*v1.VolumeSource
|
var inlineSources []*v1.VolumeSource
|
||||||
if pattern.VolType == testpatterns.InlineVolume {
|
if pattern.VolType == testpatterns.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)
|
||||||
}
|
}
|
||||||
ginkgo.By("Creating a pod with pvc")
|
ginkgo.By("Creating a pod with pvc")
|
||||||
l.pod, err = e2epod.CreateSecPodWithNodeSelection(l.cs, l.ns.Name, pvcs, inlineSources, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
l.pod, err = e2epod.CreateSecPodWithNodeSelection(l.cs, l.ns.Name, pvcs, inlineSources, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
||||||
|
@ -37,7 +37,7 @@ func GetDriverNameWithFeatureTags(driver TestDriver) string {
|
|||||||
return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag)
|
return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateVolume creates volume for test unless dynamicPV test
|
// CreateVolume creates volume for test unless dynamicPV or CSI ephemeral inline volume test
|
||||||
func CreateVolume(driver TestDriver, config *PerTestConfig, volType testpatterns.TestVolType) TestVolume {
|
func CreateVolume(driver TestDriver, config *PerTestConfig, volType testpatterns.TestVolType) TestVolume {
|
||||||
switch volType {
|
switch volType {
|
||||||
case testpatterns.InlineVolume:
|
case testpatterns.InlineVolume:
|
||||||
@ -46,6 +46,8 @@ func CreateVolume(driver TestDriver, config *PerTestConfig, volType testpatterns
|
|||||||
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
|
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
|
||||||
return pDriver.CreateVolume(config, volType)
|
return pDriver.CreateVolume(config, volType)
|
||||||
}
|
}
|
||||||
|
case testpatterns.CSIInlineVolume:
|
||||||
|
fallthrough
|
||||||
case testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
// No need to create volume
|
// No need to create volume
|
||||||
default:
|
default:
|
||||||
|
@ -45,8 +45,8 @@ var _ TestSuite = &ephemeralTestSuite{}
|
|||||||
func InitEphemeralTestSuite() TestSuite {
|
func InitEphemeralTestSuite() TestSuite {
|
||||||
return &ephemeralTestSuite{
|
return &ephemeralTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "ephemeral",
|
Name: "ephemeral",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
{
|
{
|
||||||
Name: "inline ephemeral CSI volume",
|
Name: "inline ephemeral CSI volume",
|
||||||
VolType: testpatterns.CSIInlineVolume,
|
VolType: testpatterns.CSIInlineVolume,
|
||||||
@ -56,14 +56,14 @@ func InitEphemeralTestSuite() TestSuite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ephemeralTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (p *ephemeralTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return p.tsInfo
|
return p.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ephemeralTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (p *ephemeralTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *ephemeralTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (p *ephemeralTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
|
@ -45,29 +45,29 @@ var _ TestSuite = &multiVolumeTestSuite{}
|
|||||||
func InitMultiVolumeTestSuite() TestSuite {
|
func InitMultiVolumeTestSuite() TestSuite {
|
||||||
return &multiVolumeTestSuite{
|
return &multiVolumeTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "multiVolume [Slow]",
|
Name: "multiVolume [Slow]",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.FsVolModePreprovisionedPV,
|
testpatterns.FsVolModePreprovisionedPV,
|
||||||
testpatterns.FsVolModeDynamicPV,
|
testpatterns.FsVolModeDynamicPV,
|
||||||
testpatterns.BlockVolModePreprovisionedPV,
|
testpatterns.BlockVolModePreprovisionedPV,
|
||||||
testpatterns.BlockVolModeDynamicPV,
|
testpatterns.BlockVolModeDynamicPV,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *multiVolumeTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (t *multiVolumeTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return t.tsInfo
|
return t.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *multiVolumeTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *multiVolumeTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV))
|
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *multiVolumeTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
@ -75,7 +75,7 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
ns *v1.Namespace
|
ns *v1.Namespace
|
||||||
driver TestDriver
|
driver TestDriver
|
||||||
resources []*genericVolumeTestResource
|
resources []*VolumeResource
|
||||||
|
|
||||||
intreeOps opCounts
|
intreeOps opCounts
|
||||||
migratedOps opCounts
|
migratedOps opCounts
|
||||||
@ -112,7 +112,7 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
cleanup := func() {
|
cleanup := func() {
|
||||||
var errs []error
|
var errs []error
|
||||||
for _, resource := range l.resources {
|
for _, resource := range l.resources {
|
||||||
errs = append(errs, resource.cleanupResource())
|
errs = append(errs, resource.CleanupResource())
|
||||||
}
|
}
|
||||||
|
|
||||||
errs = append(errs, tryFunc(l.driverCleanup))
|
errs = append(errs, tryFunc(l.driverCleanup))
|
||||||
@ -141,10 +141,10 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
numVols := 2
|
numVols := 2
|
||||||
|
|
||||||
for i := 0; i < numVols; i++ {
|
for i := 0; i < numVols; i++ {
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
resource := createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
resource := 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
||||||
@ -184,10 +184,10 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
numVols := 2
|
numVols := 2
|
||||||
|
|
||||||
for i := 0; i < numVols; i++ {
|
for i := 0; i < numVols; i++ {
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
resource := createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
resource := 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
||||||
@ -223,10 +223,10 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
// 1st volume should be block and set filesystem for 2nd and later volumes
|
// 1st volume should be block and set filesystem for 2nd and later volumes
|
||||||
curPattern.VolMode = v1.PersistentVolumeFilesystem
|
curPattern.VolMode = v1.PersistentVolumeFilesystem
|
||||||
}
|
}
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
resource := createGenericVolumeTestResource(driver, l.config, curPattern, testVolumeSizeRange)
|
resource := 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
||||||
@ -275,10 +275,10 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
// 1st volume should be block and set filesystem for 2nd and later volumes
|
// 1st volume should be block and set filesystem for 2nd and later volumes
|
||||||
curPattern.VolMode = v1.PersistentVolumeFilesystem
|
curPattern.VolMode = v1.PersistentVolumeFilesystem
|
||||||
}
|
}
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
resource := createGenericVolumeTestResource(driver, l.config, curPattern, testVolumeSizeRange)
|
resource := 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
TestAccessMultipleVolumesAcrossPodRecreation(l.config.Framework, l.cs, l.ns.Name,
|
||||||
@ -301,13 +301,13 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create volume
|
// Create volume
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
resource := createGenericVolumeTestResource(l.driver, l.config, pattern, testVolumeSizeRange)
|
resource := 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
|
||||||
TestConcurrentAccessToSingleVolume(l.config.Framework, l.cs, l.ns.Name,
|
TestConcurrentAccessToSingleVolume(l.config.Framework, l.cs, l.ns.Name,
|
||||||
e2epod.NodeSelection{Name: l.config.ClientNodeName}, resource.pvc, numPods, true /* sameNode */)
|
e2epod.NodeSelection{Name: l.config.ClientNodeName}, resource.Pvc, numPods, true /* sameNode */)
|
||||||
})
|
})
|
||||||
|
|
||||||
// This tests below configuration:
|
// This tests below configuration:
|
||||||
@ -336,13 +336,13 @@ func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatter
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create volume
|
// Create volume
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
resource := createGenericVolumeTestResource(l.driver, l.config, pattern, testVolumeSizeRange)
|
resource := 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
|
||||||
TestConcurrentAccessToSingleVolume(l.config.Framework, l.cs, l.ns.Name,
|
TestConcurrentAccessToSingleVolume(l.config.Framework, l.cs, l.ns.Name,
|
||||||
e2epod.NodeSelection{Name: l.config.ClientNodeName}, resource.pvc, numPods, false /* sameNode */)
|
e2epod.NodeSelection{Name: l.config.ClientNodeName}, resource.Pvc, numPods, false /* sameNode */)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,26 +69,26 @@ var _ TestSuite = &provisioningTestSuite{}
|
|||||||
func InitProvisioningTestSuite() TestSuite {
|
func InitProvisioningTestSuite() TestSuite {
|
||||||
return &provisioningTestSuite{
|
return &provisioningTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "provisioning",
|
Name: "provisioning",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.DefaultFsDynamicPV,
|
testpatterns.DefaultFsDynamicPV,
|
||||||
testpatterns.NtfsDynamicPV,
|
testpatterns.NtfsDynamicPV,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *provisioningTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (p *provisioningTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return p.tsInfo
|
return p.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *provisioningTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (p *provisioningTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *provisioningTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (p *provisioningTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
@ -111,7 +111,7 @@ func (p *provisioningTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
ginkgo.BeforeEach(func() {
|
ginkgo.BeforeEach(func() {
|
||||||
// Check preconditions.
|
// Check preconditions.
|
||||||
if pattern.VolType != testpatterns.DynamicPV {
|
if pattern.VolType != testpatterns.DynamicPV {
|
||||||
framework.Skipf("Suite %q does not support %v", p.tsInfo.name, pattern.VolType)
|
framework.Skipf("Suite %q does not support %v", p.tsInfo.Name, pattern.VolType)
|
||||||
}
|
}
|
||||||
ok := false
|
ok := false
|
||||||
dDriver, ok = driver.(DynamicPVTestDriver)
|
dDriver, ok = driver.(DynamicPVTestDriver)
|
||||||
@ -133,7 +133,7 @@ func (p *provisioningTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
l.config, l.driverCleanup = driver.PrepareTest(f)
|
l.config, l.driverCleanup = driver.PrepareTest(f)
|
||||||
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
||||||
l.cs = l.config.Framework.ClientSet
|
l.cs = l.config.Framework.ClientSet
|
||||||
testVolumeSizeRange := p.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := p.GetTestSuiteInfo().SupportedSizeRange
|
||||||
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
||||||
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
|
@ -56,25 +56,25 @@ var _ TestSuite = &snapshottableTestSuite{}
|
|||||||
func InitSnapshottableTestSuite() TestSuite {
|
func InitSnapshottableTestSuite() TestSuite {
|
||||||
return &snapshottableTestSuite{
|
return &snapshottableTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "snapshottable",
|
Name: "snapshottable",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.DynamicSnapshot,
|
testpatterns.DynamicSnapshot,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *snapshottableTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (s *snapshottableTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return s.tsInfo
|
return s.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *snapshottableTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (s *snapshottableTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *snapshottableTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (s *snapshottableTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
var (
|
var (
|
||||||
sDriver SnapshottableTestDriver
|
sDriver SnapshottableTestDriver
|
||||||
dDriver DynamicPVTestDriver
|
dDriver DynamicPVTestDriver
|
||||||
@ -117,7 +117,7 @@ func (s *snapshottableTestSuite) defineTests(driver TestDriver, pattern testpatt
|
|||||||
if class == nil {
|
if class == nil {
|
||||||
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", driver.GetDriverInfo().Name)
|
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", driver.GetDriverInfo().Name)
|
||||||
}
|
}
|
||||||
testVolumeSizeRange := s.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
|
||||||
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
||||||
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
|
@ -61,37 +61,37 @@ var _ TestSuite = &subPathTestSuite{}
|
|||||||
func InitSubPathTestSuite() TestSuite {
|
func InitSubPathTestSuite() TestSuite {
|
||||||
return &subPathTestSuite{
|
return &subPathTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "subPath",
|
Name: "subPath",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.DefaultFsInlineVolume,
|
testpatterns.DefaultFsInlineVolume,
|
||||||
testpatterns.DefaultFsPreprovisionedPV,
|
testpatterns.DefaultFsPreprovisionedPV,
|
||||||
testpatterns.DefaultFsDynamicPV,
|
testpatterns.DefaultFsDynamicPV,
|
||||||
testpatterns.NtfsDynamicPV,
|
testpatterns.NtfsDynamicPV,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *subPathTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (s *subPathTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return s.tsInfo
|
return s.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *subPathTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (s *subPathTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(
|
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(
|
||||||
testpatterns.PreprovisionedPV,
|
testpatterns.PreprovisionedPV,
|
||||||
testpatterns.InlineVolume))
|
testpatterns.InlineVolume))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (s *subPathTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
|
|
||||||
hostExec utils.HostExec
|
hostExec utils.HostExec
|
||||||
resource *genericVolumeTestResource
|
resource *VolumeResource
|
||||||
roVolSource *v1.VolumeSource
|
roVolSource *v1.VolumeSource
|
||||||
pod *v1.Pod
|
pod *v1.Pod
|
||||||
formatPod *v1.Pod
|
formatPod *v1.Pod
|
||||||
@ -118,8 +118,8 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
// 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.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, driver.GetDriverInfo().InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, driver.GetDriverInfo().InTreePluginName)
|
||||||
testVolumeSizeRange := s.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.resource = createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.resource = 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
|
||||||
@ -127,19 +127,19 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
switch volType {
|
switch volType {
|
||||||
case testpatterns.InlineVolume:
|
case testpatterns.InlineVolume:
|
||||||
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
|
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
|
||||||
l.roVolSource = iDriver.GetVolumeSource(true, pattern.FsType, l.resource.volume)
|
l.roVolSource = iDriver.GetVolumeSource(true, pattern.FsType, l.resource.Volume)
|
||||||
}
|
}
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.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 testpatterns.DynamicPV:
|
case testpatterns.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,
|
||||||
ReadOnly: true,
|
ReadOnly: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -148,11 +148,11 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
}
|
}
|
||||||
|
|
||||||
subPath := f.Namespace.Name
|
subPath := f.Namespace.Name
|
||||||
l.pod = SubpathTestPod(f, subPath, l.resource.volType, l.resource.volSource, true)
|
l.pod = SubpathTestPod(f, subPath, l.resource.VolType, l.resource.VolSource, true)
|
||||||
l.pod.Spec.NodeName = l.config.ClientNodeName
|
l.pod.Spec.NodeName = l.config.ClientNodeName
|
||||||
l.pod.Spec.NodeSelector = l.config.ClientNodeSelector
|
l.pod.Spec.NodeSelector = l.config.ClientNodeSelector
|
||||||
|
|
||||||
l.formatPod = volumeFormatPod(f, l.resource.volSource)
|
l.formatPod = volumeFormatPod(f, l.resource.VolSource)
|
||||||
l.formatPod.Spec.NodeName = l.config.ClientNodeName
|
l.formatPod.Spec.NodeName = l.config.ClientNodeName
|
||||||
l.formatPod.Spec.NodeSelector = l.config.ClientNodeSelector
|
l.formatPod.Spec.NodeSelector = l.config.ClientNodeSelector
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
}
|
}
|
||||||
|
|
||||||
if l.resource != nil {
|
if l.resource != nil {
|
||||||
errs = append(errs, l.resource.cleanupResource())
|
errs = append(errs, l.resource.CleanupResource())
|
||||||
l.resource = nil
|
l.resource = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,9 +348,9 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
init()
|
init()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
if strings.HasPrefix(l.resource.volType, "hostPath") || strings.HasPrefix(l.resource.volType, "csi-hostpath") {
|
if strings.HasPrefix(l.resource.VolType, "hostPath") || strings.HasPrefix(l.resource.VolType, "csi-hostpath") {
|
||||||
// TODO: This skip should be removed once #61446 is fixed
|
// TODO: This skip should be removed once #61446 is fixed
|
||||||
framework.Skipf("%s volume type does not support reconstruction, skipping", l.resource.volType)
|
framework.Skipf("%s volume type does not support reconstruction, skipping", l.resource.VolType)
|
||||||
}
|
}
|
||||||
|
|
||||||
testSubpathReconstruction(f, l.hostExec, l.pod, true)
|
testSubpathReconstruction(f, l.hostExec, l.pod, true)
|
||||||
@ -390,7 +390,7 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
init()
|
init()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
if l.roVolSource == nil {
|
if l.roVolSource == nil {
|
||||||
framework.Skipf("Volume type %v doesn't support readOnly source", l.resource.volType)
|
framework.Skipf("Volume type %v doesn't support readOnly source", l.resource.VolType)
|
||||||
}
|
}
|
||||||
|
|
||||||
origpod := l.pod.DeepCopy()
|
origpod := l.pod.DeepCopy()
|
||||||
@ -418,7 +418,7 @@ func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
init()
|
init()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
if l.roVolSource == nil {
|
if l.roVolSource == nil {
|
||||||
framework.Skipf("Volume type %v doesn't support readOnly source", l.resource.volType)
|
framework.Skipf("Volume type %v doesn't support readOnly source", l.resource.VolType)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Format the volume while it's writable
|
// Format the volume while it's writable
|
||||||
|
@ -46,7 +46,7 @@ type topologyTest struct {
|
|||||||
intreeOps opCounts
|
intreeOps opCounts
|
||||||
migratedOps opCounts
|
migratedOps opCounts
|
||||||
|
|
||||||
resource genericVolumeTestResource
|
resource VolumeResource
|
||||||
pod *v1.Pod
|
pod *v1.Pod
|
||||||
allTopologies []topology
|
allTopologies []topology
|
||||||
}
|
}
|
||||||
@ -59,8 +59,8 @@ var _ TestSuite = &topologyTestSuite{}
|
|||||||
func InitTopologyTestSuite() TestSuite {
|
func InitTopologyTestSuite() TestSuite {
|
||||||
return &topologyTestSuite{
|
return &topologyTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "topology",
|
Name: "topology",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.TopologyImmediate,
|
testpatterns.TopologyImmediate,
|
||||||
testpatterns.TopologyDelayed,
|
testpatterns.TopologyDelayed,
|
||||||
},
|
},
|
||||||
@ -68,14 +68,14 @@ func InitTopologyTestSuite() TestSuite {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *topologyTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (t *topologyTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return t.tsInfo
|
return t.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *topologyTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *topologyTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *topologyTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *topologyTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
var (
|
var (
|
||||||
dInfo = driver.GetDriverInfo()
|
dInfo = driver.GetDriverInfo()
|
||||||
dDriver DynamicPVTestDriver
|
dDriver DynamicPVTestDriver
|
||||||
@ -111,10 +111,9 @@ func (t *topologyTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
// 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 = genericVolumeTestResource{
|
l.resource = VolumeResource{
|
||||||
driver: driver,
|
Config: l.config,
|
||||||
config: l.config,
|
Pattern: pattern,
|
||||||
pattern: pattern,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// After driver is installed, check driver topologies on nodes
|
// After driver is installed, check driver topologies on nodes
|
||||||
@ -135,17 +134,17 @@ func (t *topologyTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
framework.Skipf("Not enough topologies in cluster -- skipping")
|
framework.Skipf("Not enough topologies in cluster -- skipping")
|
||||||
}
|
}
|
||||||
|
|
||||||
l.resource.sc = dDriver.GetDynamicProvisionStorageClass(l.config, pattern.FsType)
|
l.resource.Sc = dDriver.GetDynamicProvisionStorageClass(l.config, pattern.FsType)
|
||||||
framework.ExpectNotEqual(l.resource.sc, nil, "driver failed to provide a StorageClass")
|
framework.ExpectNotEqual(l.resource.Sc, nil, "driver failed to provide a StorageClass")
|
||||||
l.resource.sc.VolumeBindingMode = &pattern.BindingMode
|
l.resource.Sc.VolumeBindingMode = &pattern.BindingMode
|
||||||
|
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
||||||
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
l.resource.pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{
|
l.resource.Pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{
|
||||||
ClaimSize: claimSize,
|
ClaimSize: claimSize,
|
||||||
StorageClassName: &(l.resource.sc.Name),
|
StorageClassName: &(l.resource.Sc.Name),
|
||||||
}, l.config.Framework.Namespace.Name)
|
}, l.config.Framework.Namespace.Name)
|
||||||
|
|
||||||
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
||||||
@ -153,7 +152,7 @@ func (t *topologyTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup := func(l topologyTest) {
|
cleanup := func(l topologyTest) {
|
||||||
t.cleanupResources(cs, &l)
|
t.CleanupResources(cs, &l)
|
||||||
err := tryFunc(l.driverCleanup)
|
err := tryFunc(l.driverCleanup)
|
||||||
l.driverCleanup = nil
|
l.driverCleanup = nil
|
||||||
framework.ExpectNoError(err, "while cleaning up driver")
|
framework.ExpectNoError(err, "while cleaning up driver")
|
||||||
@ -172,7 +171,7 @@ func (t *topologyTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
if len(l.allTopologies) > dInfo.NumAllowedTopologies {
|
if len(l.allTopologies) > dInfo.NumAllowedTopologies {
|
||||||
excludedIndex = rand.Intn(len(l.allTopologies))
|
excludedIndex = rand.Intn(len(l.allTopologies))
|
||||||
}
|
}
|
||||||
allowedTopologies := t.setAllowedTopologies(l.resource.sc, l.allTopologies, excludedIndex)
|
allowedTopologies := t.setAllowedTopologies(l.resource.Sc, l.allTopologies, excludedIndex)
|
||||||
|
|
||||||
t.createResources(cs, &l, nil)
|
t.createResources(cs, &l, nil)
|
||||||
|
|
||||||
@ -201,7 +200,7 @@ func (t *topologyTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
|
|
||||||
// Exclude one topology
|
// Exclude one topology
|
||||||
excludedIndex := rand.Intn(len(l.allTopologies))
|
excludedIndex := rand.Intn(len(l.allTopologies))
|
||||||
t.setAllowedTopologies(l.resource.sc, l.allTopologies, excludedIndex)
|
t.setAllowedTopologies(l.resource.Sc, l.allTopologies, excludedIndex)
|
||||||
|
|
||||||
// Set pod nodeSelector to the excluded topology
|
// Set pod nodeSelector to the excluded topology
|
||||||
exprs := []v1.NodeSelectorRequirement{}
|
exprs := []v1.NodeSelectorRequirement{}
|
||||||
@ -322,19 +321,19 @@ func (t *topologyTestSuite) verifyNodeTopology(node *v1.Node, allowedTopos []top
|
|||||||
|
|
||||||
func (t *topologyTestSuite) createResources(cs clientset.Interface, l *topologyTest, affinity *v1.Affinity) {
|
func (t *topologyTestSuite) createResources(cs clientset.Interface, l *topologyTest, affinity *v1.Affinity) {
|
||||||
var err error
|
var err error
|
||||||
framework.Logf("Creating storage class object and pvc object for driver - sc: %v, pvc: %v", l.resource.sc, l.resource.pvc)
|
framework.Logf("Creating storage class object and pvc object for driver - sc: %v, pvc: %v", l.resource.Sc, l.resource.Pvc)
|
||||||
|
|
||||||
ginkgo.By("Creating sc")
|
ginkgo.By("Creating sc")
|
||||||
l.resource.sc, err = cs.StorageV1().StorageClasses().Create(l.resource.sc)
|
l.resource.Sc, err = cs.StorageV1().StorageClasses().Create(l.resource.Sc)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
ginkgo.By("Creating pvc")
|
ginkgo.By("Creating pvc")
|
||||||
l.resource.pvc, err = cs.CoreV1().PersistentVolumeClaims(l.resource.pvc.Namespace).Create(l.resource.pvc)
|
l.resource.Pvc, err = cs.CoreV1().PersistentVolumeClaims(l.resource.Pvc.Namespace).Create(l.resource.Pvc)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
ginkgo.By("Creating pod")
|
ginkgo.By("Creating pod")
|
||||||
l.pod = e2epod.MakeSecPod(l.config.Framework.Namespace.Name,
|
l.pod = e2epod.MakeSecPod(l.config.Framework.Namespace.Name,
|
||||||
[]*v1.PersistentVolumeClaim{l.resource.pvc},
|
[]*v1.PersistentVolumeClaim{l.resource.Pvc},
|
||||||
nil,
|
nil,
|
||||||
false,
|
false,
|
||||||
"",
|
"",
|
||||||
@ -347,13 +346,13 @@ func (t *topologyTestSuite) createResources(cs clientset.Interface, l *topologyT
|
|||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *topologyTestSuite) cleanupResources(cs clientset.Interface, l *topologyTest) {
|
func (t *topologyTestSuite) CleanupResources(cs clientset.Interface, l *topologyTest) {
|
||||||
if l.pod != nil {
|
if l.pod != nil {
|
||||||
ginkgo.By("Deleting pod")
|
ginkgo.By("Deleting pod")
|
||||||
err := e2epod.DeletePodWithWait(cs, l.pod)
|
err := e2epod.DeletePodWithWait(cs, l.pod)
|
||||||
framework.ExpectNoError(err, "while deleting pod")
|
framework.ExpectNoError(err, "while deleting pod")
|
||||||
}
|
}
|
||||||
|
|
||||||
err := l.resource.cleanupResource()
|
err := l.resource.CleanupResource()
|
||||||
framework.ExpectNoError(err, "while clean up resource")
|
framework.ExpectNoError(err, "while clean up resource")
|
||||||
}
|
}
|
||||||
|
@ -54,33 +54,33 @@ var _ TestSuite = &volumeExpandTestSuite{}
|
|||||||
func InitVolumeExpandTestSuite() TestSuite {
|
func InitVolumeExpandTestSuite() TestSuite {
|
||||||
return &volumeExpandTestSuite{
|
return &volumeExpandTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "volume-expand",
|
Name: "volume-expand",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.DefaultFsDynamicPV,
|
testpatterns.DefaultFsDynamicPV,
|
||||||
testpatterns.BlockVolModeDynamicPV,
|
testpatterns.BlockVolModeDynamicPV,
|
||||||
testpatterns.DefaultFsDynamicPVAllowExpansion,
|
testpatterns.DefaultFsDynamicPVAllowExpansion,
|
||||||
testpatterns.BlockVolModeDynamicPVAllowExpansion,
|
testpatterns.BlockVolModeDynamicPVAllowExpansion,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *volumeExpandTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (v *volumeExpandTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return v.tsInfo
|
return v.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *volumeExpandTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (v *volumeExpandTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (v *volumeExpandTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
|
|
||||||
resource *genericVolumeTestResource
|
resource *VolumeResource
|
||||||
pod *v1.Pod
|
pod *v1.Pod
|
||||||
pod2 *v1.Pod
|
pod2 *v1.Pod
|
||||||
|
|
||||||
@ -111,8 +111,8 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
// 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.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, driver.GetDriverInfo().InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, driver.GetDriverInfo().InTreePluginName)
|
||||||
testVolumeSizeRange := v.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := v.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.resource = createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup := func() {
|
cleanup := func() {
|
||||||
@ -132,7 +132,7 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
}
|
}
|
||||||
|
|
||||||
if l.resource != nil {
|
if l.resource != nil {
|
||||||
errs = append(errs, l.resource.cleanupResource())
|
errs = append(errs, l.resource.CleanupResource())
|
||||||
l.resource = nil
|
l.resource = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,13 +148,13 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
gomega.Expect(l.resource.sc.AllowVolumeExpansion).To(gomega.BeNil())
|
gomega.Expect(l.resource.Sc.AllowVolumeExpansion).To(gomega.BeNil())
|
||||||
ginkgo.By("Expanding non-expandable pvc")
|
ginkgo.By("Expanding non-expandable pvc")
|
||||||
currentPvcSize := l.resource.pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
currentPvcSize := l.resource.Pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
||||||
newSize := currentPvcSize.DeepCopy()
|
newSize := currentPvcSize.DeepCopy()
|
||||||
newSize.Add(resource.MustParse("1Gi"))
|
newSize.Add(resource.MustParse("1Gi"))
|
||||||
framework.Logf("currentPvcSize %v, newSize %v", currentPvcSize, newSize)
|
framework.Logf("currentPvcSize %v, newSize %v", currentPvcSize, newSize)
|
||||||
_, err = ExpandPVCSize(l.resource.pvc, newSize, f.ClientSet)
|
_, err = ExpandPVCSize(l.resource.Pvc, newSize, f.ClientSet)
|
||||||
framework.ExpectError(err, "While updating non-expandable PVC")
|
framework.ExpectError(err, "While updating non-expandable PVC")
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@ -164,7 +164,7 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
ginkgo.By("Creating a pod with dynamically provisioned volume")
|
ginkgo.By("Creating a pod with dynamically provisioned volume")
|
||||||
l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, f.Namespace.Name, []*v1.PersistentVolumeClaim{l.resource.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, f.Namespace.Name, []*v1.PersistentVolumeClaim{l.resource.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
||||||
defer func() {
|
defer func() {
|
||||||
err = e2epod.DeletePodWithWait(f.ClientSet, l.pod)
|
err = e2epod.DeletePodWithWait(f.ClientSet, l.pod)
|
||||||
framework.ExpectNoError(err, "while cleaning up pod already deleted in resize test")
|
framework.ExpectNoError(err, "while cleaning up pod already deleted in resize test")
|
||||||
@ -177,31 +177,31 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
|
|
||||||
// We expand the PVC while no pod is using it to ensure offline expansion
|
// We expand the PVC while no pod is using it to ensure offline expansion
|
||||||
ginkgo.By("Expanding current pvc")
|
ginkgo.By("Expanding current pvc")
|
||||||
currentPvcSize := l.resource.pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
currentPvcSize := l.resource.Pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
||||||
newSize := currentPvcSize.DeepCopy()
|
newSize := currentPvcSize.DeepCopy()
|
||||||
newSize.Add(resource.MustParse("1Gi"))
|
newSize.Add(resource.MustParse("1Gi"))
|
||||||
framework.Logf("currentPvcSize %v, newSize %v", currentPvcSize, newSize)
|
framework.Logf("currentPvcSize %v, newSize %v", currentPvcSize, newSize)
|
||||||
newPVC, err := ExpandPVCSize(l.resource.pvc, newSize, f.ClientSet)
|
newPVC, err := ExpandPVCSize(l.resource.Pvc, newSize, f.ClientSet)
|
||||||
framework.ExpectNoError(err, "While updating pvc for more size")
|
framework.ExpectNoError(err, "While updating pvc for more size")
|
||||||
l.resource.pvc = newPVC
|
l.resource.Pvc = newPVC
|
||||||
gomega.Expect(l.resource.pvc).NotTo(gomega.BeNil())
|
gomega.Expect(l.resource.Pvc).NotTo(gomega.BeNil())
|
||||||
|
|
||||||
pvcSize := l.resource.pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
pvcSize := l.resource.Pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
||||||
if pvcSize.Cmp(newSize) != 0 {
|
if pvcSize.Cmp(newSize) != 0 {
|
||||||
framework.Failf("error updating pvc size %q", l.resource.pvc.Name)
|
framework.Failf("error updating pvc size %q", l.resource.Pvc.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
ginkgo.By("Waiting for cloudprovider resize to finish")
|
ginkgo.By("Waiting for cloudprovider resize to finish")
|
||||||
err = WaitForControllerVolumeResize(l.resource.pvc, f.ClientSet, totalResizeWaitPeriod)
|
err = WaitForControllerVolumeResize(l.resource.Pvc, f.ClientSet, totalResizeWaitPeriod)
|
||||||
framework.ExpectNoError(err, "While waiting for pvc resize to finish")
|
framework.ExpectNoError(err, "While waiting for pvc resize to finish")
|
||||||
|
|
||||||
ginkgo.By("Checking for conditions on pvc")
|
ginkgo.By("Checking for conditions on pvc")
|
||||||
npvc, err := WaitForPendingFSResizeCondition(l.resource.pvc, f.ClientSet)
|
npvc, err := WaitForPendingFSResizeCondition(l.resource.Pvc, f.ClientSet)
|
||||||
framework.ExpectNoError(err, "While waiting for pvc to have fs resizing condition")
|
framework.ExpectNoError(err, "While waiting for pvc to have fs resizing condition")
|
||||||
l.resource.pvc = npvc
|
l.resource.Pvc = npvc
|
||||||
|
|
||||||
ginkgo.By("Creating a new pod with same volume")
|
ginkgo.By("Creating a new pod with same volume")
|
||||||
l.pod2, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, f.Namespace.Name, []*v1.PersistentVolumeClaim{l.resource.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
l.pod2, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, f.Namespace.Name, []*v1.PersistentVolumeClaim{l.resource.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
||||||
defer func() {
|
defer func() {
|
||||||
err = e2epod.DeletePodWithWait(f.ClientSet, l.pod2)
|
err = e2epod.DeletePodWithWait(f.ClientSet, l.pod2)
|
||||||
framework.ExpectNoError(err, "while cleaning up pod before exiting resizing test")
|
framework.ExpectNoError(err, "while cleaning up pod before exiting resizing test")
|
||||||
@ -209,10 +209,10 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
framework.ExpectNoError(err, "while recreating pod for resizing")
|
framework.ExpectNoError(err, "while recreating pod for resizing")
|
||||||
|
|
||||||
ginkgo.By("Waiting for file system resize to finish")
|
ginkgo.By("Waiting for file system resize to finish")
|
||||||
l.resource.pvc, err = WaitForFSResize(l.resource.pvc, f.ClientSet)
|
l.resource.Pvc, err = WaitForFSResize(l.resource.Pvc, f.ClientSet)
|
||||||
framework.ExpectNoError(err, "while waiting for fs resize to finish")
|
framework.ExpectNoError(err, "while waiting for fs resize to finish")
|
||||||
|
|
||||||
pvcConditions := l.resource.pvc.Status.Conditions
|
pvcConditions := l.resource.Pvc.Status.Conditions
|
||||||
framework.ExpectEqual(len(pvcConditions), 0, "pvc should not have conditions")
|
framework.ExpectEqual(len(pvcConditions), 0, "pvc should not have conditions")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -222,7 +222,7 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
ginkgo.By("Creating a pod with dynamically provisioned volume")
|
ginkgo.By("Creating a pod with dynamically provisioned volume")
|
||||||
l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, f.Namespace.Name, []*v1.PersistentVolumeClaim{l.resource.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
l.pod, err = e2epod.CreateSecPodWithNodeSelection(f.ClientSet, f.Namespace.Name, []*v1.PersistentVolumeClaim{l.resource.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil, e2epod.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout)
|
||||||
defer func() {
|
defer func() {
|
||||||
err = e2epod.DeletePodWithWait(f.ClientSet, l.pod)
|
err = e2epod.DeletePodWithWait(f.ClientSet, l.pod)
|
||||||
framework.ExpectNoError(err, "while cleaning up pod already deleted in resize test")
|
framework.ExpectNoError(err, "while cleaning up pod already deleted in resize test")
|
||||||
@ -231,29 +231,29 @@ func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
|
|
||||||
// We expand the PVC while no pod is using it to ensure offline expansion
|
// We expand the PVC while no pod is using it to ensure offline expansion
|
||||||
ginkgo.By("Expanding current pvc")
|
ginkgo.By("Expanding current pvc")
|
||||||
currentPvcSize := l.resource.pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
currentPvcSize := l.resource.Pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
||||||
newSize := currentPvcSize.DeepCopy()
|
newSize := currentPvcSize.DeepCopy()
|
||||||
newSize.Add(resource.MustParse("1Gi"))
|
newSize.Add(resource.MustParse("1Gi"))
|
||||||
framework.Logf("currentPvcSize %v, newSize %v", currentPvcSize, newSize)
|
framework.Logf("currentPvcSize %v, newSize %v", currentPvcSize, newSize)
|
||||||
newPVC, err := ExpandPVCSize(l.resource.pvc, newSize, f.ClientSet)
|
newPVC, err := ExpandPVCSize(l.resource.Pvc, newSize, f.ClientSet)
|
||||||
framework.ExpectNoError(err, "While updating pvc for more size")
|
framework.ExpectNoError(err, "While updating pvc for more size")
|
||||||
l.resource.pvc = newPVC
|
l.resource.Pvc = newPVC
|
||||||
gomega.Expect(l.resource.pvc).NotTo(gomega.BeNil())
|
gomega.Expect(l.resource.Pvc).NotTo(gomega.BeNil())
|
||||||
|
|
||||||
pvcSize := l.resource.pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
pvcSize := l.resource.Pvc.Spec.Resources.Requests[v1.ResourceStorage]
|
||||||
if pvcSize.Cmp(newSize) != 0 {
|
if pvcSize.Cmp(newSize) != 0 {
|
||||||
framework.Failf("error updating pvc size %q", l.resource.pvc.Name)
|
framework.Failf("error updating pvc size %q", l.resource.Pvc.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
ginkgo.By("Waiting for cloudprovider resize to finish")
|
ginkgo.By("Waiting for cloudprovider resize to finish")
|
||||||
err = WaitForControllerVolumeResize(l.resource.pvc, f.ClientSet, totalResizeWaitPeriod)
|
err = WaitForControllerVolumeResize(l.resource.Pvc, f.ClientSet, totalResizeWaitPeriod)
|
||||||
framework.ExpectNoError(err, "While waiting for pvc resize to finish")
|
framework.ExpectNoError(err, "While waiting for pvc resize to finish")
|
||||||
|
|
||||||
ginkgo.By("Waiting for file system resize to finish")
|
ginkgo.By("Waiting for file system resize to finish")
|
||||||
l.resource.pvc, err = WaitForFSResize(l.resource.pvc, f.ClientSet)
|
l.resource.Pvc, err = WaitForFSResize(l.resource.Pvc, f.ClientSet)
|
||||||
framework.ExpectNoError(err, "while waiting for fs resize to finish")
|
framework.ExpectNoError(err, "while waiting for fs resize to finish")
|
||||||
|
|
||||||
pvcConditions := l.resource.pvc.Status.Conditions
|
pvcConditions := l.resource.Pvc.Status.Conditions
|
||||||
framework.ExpectEqual(len(pvcConditions), 0, "pvc should not have conditions")
|
framework.ExpectEqual(len(pvcConditions), 0, "pvc should not have conditions")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -63,35 +63,35 @@ var _ TestSuite = &volumeIOTestSuite{}
|
|||||||
func InitVolumeIOTestSuite() TestSuite {
|
func InitVolumeIOTestSuite() TestSuite {
|
||||||
return &volumeIOTestSuite{
|
return &volumeIOTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "volumeIO",
|
Name: "volumeIO",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.DefaultFsInlineVolume,
|
testpatterns.DefaultFsInlineVolume,
|
||||||
testpatterns.DefaultFsPreprovisionedPV,
|
testpatterns.DefaultFsPreprovisionedPV,
|
||||||
testpatterns.DefaultFsDynamicPV,
|
testpatterns.DefaultFsDynamicPV,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeIOTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (t *volumeIOTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return t.tsInfo
|
return t.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeIOTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumeIOTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(
|
skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(
|
||||||
testpatterns.PreprovisionedPV,
|
testpatterns.PreprovisionedPV,
|
||||||
testpatterns.InlineVolume))
|
testpatterns.InlineVolume))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeIOTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumeIOTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
|
|
||||||
resource *genericVolumeTestResource
|
resource *VolumeResource
|
||||||
|
|
||||||
intreeOps opCounts
|
intreeOps opCounts
|
||||||
migratedOps opCounts
|
migratedOps opCounts
|
||||||
@ -116,9 +116,9 @@ func (t *volumeIOTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
l.config, l.driverCleanup = driver.PrepareTest(f)
|
l.config, l.driverCleanup = driver.PrepareTest(f)
|
||||||
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
||||||
|
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.resource = createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
|
||||||
if l.resource.volSource == nil {
|
if l.resource.VolSource == nil {
|
||||||
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ func (t *volumeIOTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
cleanup := func() {
|
cleanup := func() {
|
||||||
var errs []error
|
var errs []error
|
||||||
if l.resource != nil {
|
if l.resource != nil {
|
||||||
errs = append(errs, l.resource.cleanupResource())
|
errs = append(errs, l.resource.CleanupResource())
|
||||||
l.resource = nil
|
l.resource = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ func (t *volumeIOTestSuite) defineTests(driver TestDriver, pattern testpatterns.
|
|||||||
podSec := v1.PodSecurityContext{
|
podSec := v1.PodSecurityContext{
|
||||||
FSGroup: fsGroup,
|
FSGroup: fsGroup,
|
||||||
}
|
}
|
||||||
err := testVolumeIO(f, cs, convertTestConfig(l.config), *l.resource.volSource, &podSec, testFile, fileSizes)
|
err := testVolumeIO(f, cs, convertTestConfig(l.config), *l.resource.VolSource, &podSec, testFile, fileSizes)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -60,30 +60,30 @@ var _ TestSuite = &volumeLimitsTestSuite{}
|
|||||||
func InitVolumeLimitsTestSuite() TestSuite {
|
func InitVolumeLimitsTestSuite() TestSuite {
|
||||||
return &volumeLimitsTestSuite{
|
return &volumeLimitsTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "volumeLimits",
|
Name: "volumeLimits",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.FsVolModeDynamicPV,
|
testpatterns.FsVolModeDynamicPV,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeLimitsTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (t *volumeLimitsTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return t.tsInfo
|
return t.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeLimitsTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumeLimitsTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeLimitsTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumeLimitsTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
testCleanup func()
|
testCleanup func()
|
||||||
|
|
||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
ns *v1.Namespace
|
ns *v1.Namespace
|
||||||
// genericVolumeTestResource contains pv, pvc, sc, etc. of the first pod created
|
// VolumeResource contains pv, pvc, sc, etc. of the first pod created
|
||||||
resource *genericVolumeTestResource
|
resource *VolumeResource
|
||||||
|
|
||||||
// All created PVCs, incl. the one in resource
|
// All created PVCs, incl. the one in resource
|
||||||
pvcs []*v1.PersistentVolumeClaim
|
pvcs []*v1.PersistentVolumeClaim
|
||||||
@ -141,14 +141,14 @@ func (t *volumeLimitsTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
|
|
||||||
framework.Logf("Node %s can handle %d volumes of driver %s", nodeName, limit, driverInfo.Name)
|
framework.Logf("Node %s can handle %d volumes of driver %s", nodeName, limit, driverInfo.Name)
|
||||||
// Create a storage class and generate a PVC. Do not instantiate the PVC yet, keep it for the last pod.
|
// Create a storage class and generate a PVC. Do not instantiate the PVC yet, keep it for the last pod.
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
driverVolumeSizeRange := dDriver.GetDriverInfo().SupportedSizeRange
|
||||||
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
claimSize, err := 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 = createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.resource = 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")
|
||||||
}()
|
}()
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -161,7 +161,7 @@ func (t *volumeLimitsTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
for i := 0; i < limit; i++ {
|
for i := 0; i < limit; i++ {
|
||||||
pvc := e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{
|
pvc := e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{
|
||||||
ClaimSize: claimSize,
|
ClaimSize: claimSize,
|
||||||
StorageClassName: &l.resource.sc.Name,
|
StorageClassName: &l.resource.Sc.Name,
|
||||||
}, l.ns.Name)
|
}, l.ns.Name)
|
||||||
pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(pvc)
|
pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(pvc)
|
||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
@ -186,7 +186,7 @@ func (t *volumeLimitsTestSuite) defineTests(driver TestDriver, pattern testpatte
|
|||||||
framework.ExpectNoError(err)
|
framework.ExpectNoError(err)
|
||||||
|
|
||||||
ginkgo.By("Creating an extra pod with one volume to exceed the limit")
|
ginkgo.By("Creating an extra pod with one volume to exceed the limit")
|
||||||
pod = e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.resource.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
pod = e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.resource.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
||||||
// Use affinity to schedule everything on the right node
|
// Use affinity to schedule everything on the right node
|
||||||
e2epod.SetAffinity(&selection, nodeName)
|
e2epod.SetAffinity(&selection, nodeName)
|
||||||
pod.Spec.Affinity = selection.Affinity
|
pod.Spec.Affinity = selection.Affinity
|
||||||
|
@ -57,36 +57,36 @@ var _ TestSuite = &volumeModeTestSuite{}
|
|||||||
func InitVolumeModeTestSuite() TestSuite {
|
func InitVolumeModeTestSuite() TestSuite {
|
||||||
return &volumeModeTestSuite{
|
return &volumeModeTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "volumeMode",
|
Name: "volumeMode",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
testpatterns.FsVolModePreprovisionedPV,
|
testpatterns.FsVolModePreprovisionedPV,
|
||||||
testpatterns.FsVolModeDynamicPV,
|
testpatterns.FsVolModeDynamicPV,
|
||||||
testpatterns.BlockVolModePreprovisionedPV,
|
testpatterns.BlockVolModePreprovisionedPV,
|
||||||
testpatterns.BlockVolModeDynamicPV,
|
testpatterns.BlockVolModeDynamicPV,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeModeTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (t *volumeModeTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return t.tsInfo
|
return t.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeModeTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumeModeTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumeModeTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
|
|
||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
ns *v1.Namespace
|
ns *v1.Namespace
|
||||||
// genericVolumeTestResource contains pv, pvc, sc, etc., owns cleaning that up
|
// VolumeResource contains pv, pvc, sc, etc., owns cleaning that up
|
||||||
genericVolumeTestResource
|
VolumeResource
|
||||||
|
|
||||||
intreeOps opCounts
|
intreeOps opCounts
|
||||||
migratedOps opCounts
|
migratedOps opCounts
|
||||||
@ -114,7 +114,7 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// manualInit initializes l.genericVolumeTestResource without creating the PV & PVC objects.
|
// manualInit initializes l.VolumeResource without creating the PV & PVC objects.
|
||||||
manualInit := func() {
|
manualInit := func() {
|
||||||
init()
|
init()
|
||||||
|
|
||||||
@ -127,14 +127,13 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
volumeNodeAffinity *v1.VolumeNodeAffinity
|
volumeNodeAffinity *v1.VolumeNodeAffinity
|
||||||
)
|
)
|
||||||
|
|
||||||
l.genericVolumeTestResource = genericVolumeTestResource{
|
l.VolumeResource = VolumeResource{
|
||||||
driver: driver,
|
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 = CreateVolume(driver, l.config, pattern.VolType)
|
l.Volume = CreateVolume(driver, l.config, pattern.VolType)
|
||||||
|
|
||||||
switch pattern.VolType {
|
switch pattern.VolType {
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
@ -144,31 +143,31 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
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.(PreprovisionedPVTestDriver); ok {
|
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
|
||||||
pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, l.volume)
|
pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, l.Volume)
|
||||||
if pvSource == nil {
|
if pvSource == nil {
|
||||||
framework.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
storageClass, pvConfig, pvcConfig := generateConfigsForPreprovisionedPVTest(scName, volBindMode, pattern.VolMode, *pvSource, volumeNodeAffinity)
|
storageClass, pvConfig, pvcConfig := generateConfigsForPreprovisionedPVTest(scName, volBindMode, pattern.VolMode, *pvSource, volumeNodeAffinity)
|
||||||
l.sc = storageClass
|
l.Sc = storageClass
|
||||||
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 testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
|
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
|
||||||
l.sc = dDriver.GetDynamicProvisionStorageClass(l.config, fsType)
|
l.Sc = dDriver.GetDynamicProvisionStorageClass(l.config, fsType)
|
||||||
if l.sc == nil {
|
if l.Sc == nil {
|
||||||
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
l.sc.VolumeBindingMode = &volBindMode
|
l.Sc.VolumeBindingMode = &volBindMode
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
driverVolumeSizeRange := dInfo.SupportedSizeRange
|
driverVolumeSizeRange := dInfo.SupportedSizeRange
|
||||||
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
claimSize, err := getSizeRangesIntersection(testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
framework.ExpectNoError(err, "determine intersection of test size range %+v and driver size range %+v", testVolumeSizeRange, driverVolumeSizeRange)
|
||||||
|
|
||||||
l.pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{
|
l.Pvc = e2epv.MakePersistentVolumeClaim(e2epv.PersistentVolumeClaimConfig{
|
||||||
ClaimSize: claimSize,
|
ClaimSize: claimSize,
|
||||||
StorageClassName: &(l.sc.Name),
|
StorageClassName: &(l.Sc.Name),
|
||||||
VolumeMode: &pattern.VolMode,
|
VolumeMode: &pattern.VolMode,
|
||||||
}, l.ns.Name)
|
}, l.ns.Name)
|
||||||
}
|
}
|
||||||
@ -179,7 +178,7 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
|
|
||||||
cleanup := func() {
|
cleanup := func() {
|
||||||
var errs []error
|
var errs []error
|
||||||
errs = append(errs, l.cleanupResource())
|
errs = append(errs, l.CleanupResource())
|
||||||
errs = append(errs, tryFunc(l.driverCleanup))
|
errs = append(errs, tryFunc(l.driverCleanup))
|
||||||
l.driverCleanup = nil
|
l.driverCleanup = nil
|
||||||
framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource")
|
framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource")
|
||||||
@ -198,22 +197,22 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
ginkgo.By("Creating sc")
|
ginkgo.By("Creating sc")
|
||||||
l.sc, err = l.cs.StorageV1().StorageClasses().Create(l.sc)
|
l.Sc, err = l.cs.StorageV1().StorageClasses().Create(l.Sc)
|
||||||
framework.ExpectNoError(err, "Failed to create sc")
|
framework.ExpectNoError(err, "Failed to create sc")
|
||||||
|
|
||||||
ginkgo.By("Creating pv and pvc")
|
ginkgo.By("Creating pv and pvc")
|
||||||
l.pv, err = l.cs.CoreV1().PersistentVolumes().Create(l.pv)
|
l.Pv, err = l.cs.CoreV1().PersistentVolumes().Create(l.Pv)
|
||||||
framework.ExpectNoError(err, "Failed to create pv")
|
framework.ExpectNoError(err, "Failed to create pv")
|
||||||
|
|
||||||
// Prebind pv
|
// Prebind pv
|
||||||
l.pvc.Spec.VolumeName = l.pv.Name
|
l.Pvc.Spec.VolumeName = l.Pv.Name
|
||||||
l.pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(l.pvc)
|
l.Pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(l.Pvc)
|
||||||
framework.ExpectNoError(err, "Failed to create pvc")
|
framework.ExpectNoError(err, "Failed to create pvc")
|
||||||
|
|
||||||
framework.ExpectNoError(e2epv.WaitOnPVandPVC(l.cs, l.ns.Name, l.pv, l.pvc), "Failed to bind pv and pvc")
|
framework.ExpectNoError(e2epv.WaitOnPVandPVC(l.cs, l.ns.Name, l.Pv, l.Pvc), "Failed to bind pv and pvc")
|
||||||
|
|
||||||
ginkgo.By("Creating pod")
|
ginkgo.By("Creating pod")
|
||||||
pod := e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
pod := e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
||||||
// Setting node
|
// Setting node
|
||||||
pod.Spec.NodeName = l.config.ClientNodeName
|
pod.Spec.NodeName = l.config.ClientNodeName
|
||||||
pod, err = l.cs.CoreV1().Pods(l.ns.Name).Create(pod)
|
pod, err = l.cs.CoreV1().Pods(l.ns.Name).Create(pod)
|
||||||
@ -252,16 +251,16 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
var err error
|
var err error
|
||||||
|
|
||||||
ginkgo.By("Creating sc")
|
ginkgo.By("Creating sc")
|
||||||
l.sc, err = l.cs.StorageV1().StorageClasses().Create(l.sc)
|
l.Sc, err = l.cs.StorageV1().StorageClasses().Create(l.Sc)
|
||||||
framework.ExpectNoError(err, "Failed to create sc")
|
framework.ExpectNoError(err, "Failed to create sc")
|
||||||
|
|
||||||
ginkgo.By("Creating pv and pvc")
|
ginkgo.By("Creating pv and pvc")
|
||||||
l.pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(l.pvc)
|
l.Pvc, err = l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Create(l.Pvc)
|
||||||
framework.ExpectNoError(err, "Failed to create pvc")
|
framework.ExpectNoError(err, "Failed to create pvc")
|
||||||
|
|
||||||
eventSelector := fields.Set{
|
eventSelector := fields.Set{
|
||||||
"involvedObject.kind": "PersistentVolumeClaim",
|
"involvedObject.kind": "PersistentVolumeClaim",
|
||||||
"involvedObject.name": l.pvc.Name,
|
"involvedObject.name": l.Pvc.Name,
|
||||||
"involvedObject.namespace": l.ns.Name,
|
"involvedObject.namespace": l.ns.Name,
|
||||||
"reason": volevents.ProvisioningFailed,
|
"reason": volevents.ProvisioningFailed,
|
||||||
}.AsSelector().String()
|
}.AsSelector().String()
|
||||||
@ -274,7 +273,7 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check the pvc is still pending
|
// Check the pvc is still pending
|
||||||
pvc, err := l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Get(l.pvc.Name, metav1.GetOptions{})
|
pvc, err := l.cs.CoreV1().PersistentVolumeClaims(l.ns.Name).Get(l.Pvc.Name, metav1.GetOptions{})
|
||||||
framework.ExpectNoError(err, "Failed to re-read the pvc after event (or timeout)")
|
framework.ExpectNoError(err, "Failed to re-read the pvc after event (or timeout)")
|
||||||
framework.ExpectEqual(pvc.Status.Phase, v1.ClaimPending, "PVC phase isn't pending")
|
framework.ExpectEqual(pvc.Status.Phase, v1.ClaimPending, "PVC phase isn't pending")
|
||||||
})
|
})
|
||||||
@ -286,13 +285,13 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
ginkgo.It("should fail to use a volume in a pod with mismatched mode [Slow]", func() {
|
ginkgo.It("should fail to use a volume in a pod with mismatched mode [Slow]", func() {
|
||||||
skipTestIfBlockNotSupported(driver)
|
skipTestIfBlockNotSupported(driver)
|
||||||
init()
|
init()
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.genericVolumeTestResource = *createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.VolumeResource = *CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
ginkgo.By("Creating pod")
|
ginkgo.By("Creating pod")
|
||||||
var err error
|
var err error
|
||||||
pod := e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
pod := e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
||||||
// Change volumeMounts to volumeDevices and the other way around
|
// Change volumeMounts to volumeDevices and the other way around
|
||||||
pod = swapVolumeMode(pod)
|
pod = swapVolumeMode(pod)
|
||||||
|
|
||||||
@ -335,13 +334,13 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
|
|||||||
skipTestIfBlockNotSupported(driver)
|
skipTestIfBlockNotSupported(driver)
|
||||||
}
|
}
|
||||||
init()
|
init()
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.genericVolumeTestResource = *createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.VolumeResource = *CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
ginkgo.By("Creating pod")
|
ginkgo.By("Creating pod")
|
||||||
var err error
|
var err error
|
||||||
pod := e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
pod := e2epod.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.Pvc}, nil, false, "", false, false, e2epv.SELinuxLabel, nil)
|
||||||
for i := range pod.Spec.Containers {
|
for i := range pod.Spec.Containers {
|
||||||
pod.Spec.Containers[i].VolumeDevices = nil
|
pod.Spec.Containers[i].VolumeDevices = nil
|
||||||
pod.Spec.Containers[i].VolumeMounts = nil
|
pod.Spec.Containers[i].VolumeMounts = nil
|
||||||
|
@ -46,8 +46,8 @@ var _ TestSuite = &volumesTestSuite{}
|
|||||||
func InitVolumesTestSuite() TestSuite {
|
func InitVolumesTestSuite() TestSuite {
|
||||||
return &volumesTestSuite{
|
return &volumesTestSuite{
|
||||||
tsInfo: TestSuiteInfo{
|
tsInfo: TestSuiteInfo{
|
||||||
name: "volumes",
|
Name: "volumes",
|
||||||
testPatterns: []testpatterns.TestPattern{
|
TestPatterns: []testpatterns.TestPattern{
|
||||||
// Default fsType
|
// Default fsType
|
||||||
testpatterns.DefaultFsInlineVolume,
|
testpatterns.DefaultFsInlineVolume,
|
||||||
testpatterns.DefaultFsPreprovisionedPV,
|
testpatterns.DefaultFsPreprovisionedPV,
|
||||||
@ -72,18 +72,18 @@ func InitVolumesTestSuite() TestSuite {
|
|||||||
testpatterns.BlockVolModePreprovisionedPV,
|
testpatterns.BlockVolModePreprovisionedPV,
|
||||||
testpatterns.BlockVolModeDynamicPV,
|
testpatterns.BlockVolModeDynamicPV,
|
||||||
},
|
},
|
||||||
supportedSizeRange: volume.SizeRange{
|
SupportedSizeRange: volume.SizeRange{
|
||||||
Min: "1Mi",
|
Min: "1Mi",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumesTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
func (t *volumesTestSuite) GetTestSuiteInfo() TestSuiteInfo {
|
||||||
return t.tsInfo
|
return t.tsInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumesTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumesTestSuite) SkipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func skipExecTest(driver TestDriver) {
|
func skipExecTest(driver TestDriver) {
|
||||||
@ -100,12 +100,12 @@ func skipTestIfBlockNotSupported(driver TestDriver) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *volumesTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
func (t *volumesTestSuite) DefineTests(driver TestDriver, pattern testpatterns.TestPattern) {
|
||||||
type local struct {
|
type local struct {
|
||||||
config *PerTestConfig
|
config *PerTestConfig
|
||||||
driverCleanup func()
|
driverCleanup func()
|
||||||
|
|
||||||
resource *genericVolumeTestResource
|
resource *VolumeResource
|
||||||
|
|
||||||
intreeOps opCounts
|
intreeOps opCounts
|
||||||
migratedOps opCounts
|
migratedOps opCounts
|
||||||
@ -127,9 +127,9 @@ func (t *volumesTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
// 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.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
|
||||||
testVolumeSizeRange := t.getTestSuiteInfo().supportedSizeRange
|
testVolumeSizeRange := t.GetTestSuiteInfo().SupportedSizeRange
|
||||||
l.resource = createGenericVolumeTestResource(driver, l.config, pattern, testVolumeSizeRange)
|
l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
|
||||||
if l.resource.volSource == nil {
|
if l.resource.VolSource == nil {
|
||||||
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ func (t *volumesTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
cleanup := func() {
|
cleanup := func() {
|
||||||
var errs []error
|
var errs []error
|
||||||
if l.resource != nil {
|
if l.resource != nil {
|
||||||
errs = append(errs, l.resource.cleanupResource())
|
errs = append(errs, l.resource.CleanupResource())
|
||||||
l.resource = nil
|
l.resource = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ func (t *volumesTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
|
|
||||||
tests := []volume.Test{
|
tests := []volume.Test{
|
||||||
{
|
{
|
||||||
Volume: *l.resource.volSource,
|
Volume: *l.resource.VolSource,
|
||||||
Mode: pattern.VolMode,
|
Mode: pattern.VolMode,
|
||||||
File: "index.html",
|
File: "index.html",
|
||||||
// Must match content
|
// Must match content
|
||||||
@ -193,7 +193,7 @@ func (t *volumesTestSuite) defineTests(driver TestDriver, pattern testpatterns.T
|
|||||||
init()
|
init()
|
||||||
defer cleanup()
|
defer cleanup()
|
||||||
|
|
||||||
testScriptInPod(f, l.resource.volType, l.resource.volSource, l.config)
|
testScriptInPod(f, l.resource.VolType, l.resource.VolSource, l.config)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user