mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-02 16:29:21 +00:00
Merge pull request #85540 from pohly/testsuites-api
e2e storage: public API for testsuites, support CSIInlineVolume type for generic resource
This commit is contained in:
commit
d47e1364c9
@ -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)",
|
||||||
|
@ -76,7 +76,13 @@ filegroup(
|
|||||||
|
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = ["base_test.go"],
|
srcs = [
|
||||||
|
"api_test.go",
|
||||||
|
"base_test.go",
|
||||||
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = ["//test/e2e/framework/volume:go_default_library"],
|
deps = [
|
||||||
|
"//test/e2e/framework/volume:go_default_library",
|
||||||
|
"//test/e2e/storage/testpatterns:go_default_library",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
|
52
test/e2e/storage/testsuites/api_test.go
Normal file
52
test/e2e/storage/testsuites/api_test.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package testsuites_test is used intentionally to ensure that the
|
||||||
|
// code below only has access to exported names. It doesn't have any
|
||||||
|
// actual test. That the custom volume test suite defined below
|
||||||
|
// compile is the test.
|
||||||
|
//
|
||||||
|
// It's needed because we don't have any in-tree volume test
|
||||||
|
// suite implementations that aren't in the "testuites" package itself.
|
||||||
|
// We don't need this for the "TestDriver" interface because there
|
||||||
|
// we have implementations in a separate package.
|
||||||
|
package testsuites_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/kubernetes/test/e2e/framework/volume"
|
||||||
|
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
||||||
|
"k8s.io/kubernetes/test/e2e/storage/testsuites"
|
||||||
|
)
|
||||||
|
|
||||||
|
type fakeSuite struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeSuite) GetTestSuiteInfo() testsuites.TestSuiteInfo {
|
||||||
|
return testsuites.TestSuiteInfo{
|
||||||
|
Name: "fake",
|
||||||
|
FeatureTag: "",
|
||||||
|
TestPatterns: []testpatterns.TestPattern{testpatterns.DefaultFsDynamicPV},
|
||||||
|
SupportedSizeRange: volume.SizeRange{Min: "1Mi", Max: "1Gi"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeSuite) DefineTests(testsuites.TestDriver, testpatterns.TestPattern) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *fakeSuite) SkipRedundantSuite(testsuites.TestDriver, testpatterns.TestPattern) {
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ testsuites.TestSuite = &fakeSuite{}
|
@ -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