diff --git a/test/e2e/storage/testpatterns/testpattern.go b/test/e2e/storage/testpatterns/testpattern.go index a723e6dd52c..5aaa872c829 100644 --- a/test/e2e/storage/testpatterns/testpattern.go +++ b/test/e2e/storage/testpatterns/testpattern.go @@ -17,7 +17,7 @@ limitations under the License. package testpatterns import ( - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" "k8s.io/kubernetes/test/e2e/framework/volume" ) @@ -233,3 +233,12 @@ var ( AllowExpansion: true, } ) + +// NewVolTypeMap creates a map with the given TestVolTypes enabled +func NewVolTypeMap(types ...TestVolType) map[TestVolType]bool { + m := map[TestVolType]bool{} + for _, t := range types { + m[t] = true + } + return m +} diff --git a/test/e2e/storage/testsuites/base.go b/test/e2e/storage/testsuites/base.go index 5393dde3c1f..9177483fe74 100644 --- a/test/e2e/storage/testsuites/base.go +++ b/test/e2e/storage/testsuites/base.go @@ -61,6 +61,8 @@ type TestSuite interface { // Called inside a Ginkgo context that reflects the current driver and test pattern, // so the test suite can define tests directly with ginkgo.It. defineTests(TestDriver, testpatterns.TestPattern) + // skipRedundantSuite will skip the test suite based on the given TestPattern and TestDriver + skipRedundantSuite(TestDriver, testpatterns.TestPattern) } // TestSuiteInfo represents a set of parameters for TestSuite @@ -90,6 +92,7 @@ func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite) { ginkgo.Context(getTestNameStr(suite, p), func() { ginkgo.BeforeEach(func() { // Skip unsupported tests to avoid unnecessary resource initialization + suite.skipRedundantSuite(driver, p) skipUnsupportedTest(driver, p) }) suite.defineTests(driver, p) @@ -614,3 +617,11 @@ func validateMigrationVolumeOpCounts(cs clientset.Interface, pluginName string, // guarantees (as well as more informative metrics). } } + +// Skip skipVolTypes patterns if the driver supports dynamic provisioning +func skipVolTypePatterns(pattern testpatterns.TestPattern, driver TestDriver, skipVolTypes map[testpatterns.TestVolType]bool) { + _, supportsProvisioning := driver.(DynamicPVTestDriver) + if supportsProvisioning && skipVolTypes[pattern.VolType] { + framework.Skipf("Driver supports dynamic provisioning, skipping %s pattern", pattern.VolType) + } +} diff --git a/test/e2e/storage/testsuites/disruptive.go b/test/e2e/storage/testsuites/disruptive.go index 929582b426c..e63a5484d22 100644 --- a/test/e2e/storage/testsuites/disruptive.go +++ b/test/e2e/storage/testsuites/disruptive.go @@ -18,7 +18,7 @@ package testsuites import ( "github.com/onsi/ginkgo" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/storage/testpatterns" @@ -38,20 +38,25 @@ func InitDisruptiveTestSuite() TestSuite { name: "disruptive", featureTag: "[Disruptive]", testPatterns: []testpatterns.TestPattern{ + // FSVolMode is already covered in subpath testsuite testpatterns.DefaultFsInlineVolume, testpatterns.FsVolModePreprovisionedPV, testpatterns.FsVolModeDynamicPV, testpatterns.BlockVolModePreprovisionedPV, + testpatterns.BlockVolModePreprovisionedPV, testpatterns.BlockVolModeDynamicPV, }, }, } } - func (s *disruptiveTestSuite) getTestSuiteInfo() TestSuiteInfo { return s.tsInfo } +func (s *disruptiveTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { + skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV)) +} + func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig @@ -121,41 +126,43 @@ func (s *disruptiveTestSuite) defineTests(driver TestDriver, pattern testpattern runTestBlock: utils.TestKubeletRestartsAndRestoresMap, }, { - testItStmt: "Should test that pv used in a pod that is deleted while the kubelet is down cleans up when the kubelet returns.", - runTestFile: utils.TestVolumeUnmountsFromDeletedPod, + testItStmt: "Should test that pv used in a pod that is deleted while the kubelet is down cleans up when the kubelet returns.", + // File test is covered by subpath testsuite runTestBlock: utils.TestVolumeUnmapsFromDeletedPod, }, { - testItStmt: "Should test that pv used in a pod that is force deleted while the kubelet is down cleans up when the kubelet returns.", - runTestFile: utils.TestVolumeUnmountsFromForceDeletedPod, + testItStmt: "Should test that pv used in a pod that is force deleted while the kubelet is down cleans up when the kubelet returns.", + // File test is covered by subpath testsuite runTestBlock: utils.TestVolumeUnmapsFromForceDeletedPod, }, } for _, test := range disruptiveTestTable { - func(t disruptiveTest) { - ginkgo.It(t.testItStmt, func() { - init() - defer cleanup() + if test.runTestFile != nil { + func(t disruptiveTest) { + ginkgo.It(t.testItStmt, func() { + init() + defer cleanup() - var err error - var pvcs []*v1.PersistentVolumeClaim - var inlineSources []*v1.VolumeSource - if pattern.VolType == testpatterns.InlineVolume { - inlineSources = append(inlineSources, l.resource.volSource) - } else { - pvcs = append(pvcs, l.resource.pvc) - } - ginkgo.By("Creating a pod with pvc") - l.pod, err = framework.CreateSecPodWithNodeSelection(l.cs, l.ns.Name, pvcs, inlineSources, false, "", false, false, framework.SELinuxLabel, nil, framework.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout) - framework.ExpectNoError(err, "While creating pods for kubelet restart test") + var err error + var pvcs []*v1.PersistentVolumeClaim + var inlineSources []*v1.VolumeSource + if pattern.VolType == testpatterns.InlineVolume { + inlineSources = append(inlineSources, l.resource.volSource) + } else { + pvcs = append(pvcs, l.resource.pvc) + } + ginkgo.By("Creating a pod with pvc") + l.pod, err = framework.CreateSecPodWithNodeSelection(l.cs, l.ns.Name, pvcs, inlineSources, false, "", false, false, framework.SELinuxLabel, nil, framework.NodeSelection{Name: l.config.ClientNodeName}, framework.PodStartTimeout) + framework.ExpectNoError(err, "While creating pods for kubelet restart test") - if pattern.VolMode == v1.PersistentVolumeBlock { - t.runTestBlock(l.cs, l.config.Framework, l.pod) - } else { - t.runTestFile(l.cs, l.config.Framework, l.pod) - } - }) - }(test) + if pattern.VolMode == v1.PersistentVolumeBlock { + t.runTestBlock(l.cs, l.config.Framework, l.pod) + } else { + t.runTestFile(l.cs, l.config.Framework, l.pod) + } + }) + }(test) + } } } diff --git a/test/e2e/storage/testsuites/ephemeral.go b/test/e2e/storage/testsuites/ephemeral.go index ee9cfcbf71a..b6af252c54a 100644 --- a/test/e2e/storage/testsuites/ephemeral.go +++ b/test/e2e/storage/testsuites/ephemeral.go @@ -57,6 +57,9 @@ func (p *ephemeralTestSuite) getTestSuiteInfo() TestSuiteInfo { return p.tsInfo } +func (p *ephemeralTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +} + func (p *ephemeralTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/multivolume.go b/test/e2e/storage/testsuites/multivolume.go index 46f8c3532f7..4767c0022d4 100644 --- a/test/e2e/storage/testsuites/multivolume.go +++ b/test/e2e/storage/testsuites/multivolume.go @@ -56,6 +56,10 @@ func (t *multiVolumeTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } +func (t *multiVolumeTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { + skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap(testpatterns.PreprovisionedPV)) +} + func (t *multiVolumeTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/provisioning.go b/test/e2e/storage/testsuites/provisioning.go index 899225341e8..d735a50c8f2 100644 --- a/test/e2e/storage/testsuites/provisioning.go +++ b/test/e2e/storage/testsuites/provisioning.go @@ -82,6 +82,9 @@ func (p *provisioningTestSuite) getTestSuiteInfo() TestSuiteInfo { return p.tsInfo } +func (p *provisioningTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +} + func (p *provisioningTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/snapshottable.go b/test/e2e/storage/testsuites/snapshottable.go index 56b3175f242..5dae3e14a63 100644 --- a/test/e2e/storage/testsuites/snapshottable.go +++ b/test/e2e/storage/testsuites/snapshottable.go @@ -66,6 +66,9 @@ func (s *snapshottableTestSuite) getTestSuiteInfo() TestSuiteInfo { return s.tsInfo } +func (s *snapshottableTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +} + func (s *snapshottableTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { var ( sDriver SnapshottableTestDriver diff --git a/test/e2e/storage/testsuites/subpath.go b/test/e2e/storage/testsuites/subpath.go index 4d23bef12c1..6542993b046 100644 --- a/test/e2e/storage/testsuites/subpath.go +++ b/test/e2e/storage/testsuites/subpath.go @@ -74,6 +74,12 @@ func (s *subPathTestSuite) getTestSuiteInfo() TestSuiteInfo { return s.tsInfo } +func (s *subPathTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { + skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap( + testpatterns.PreprovisionedPV, + testpatterns.InlineVolume)) +} + func (s *subPathTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/volume_expand.go b/test/e2e/storage/testsuites/volume_expand.go index 08b5d0dcc94..ae4457dc73f 100644 --- a/test/e2e/storage/testsuites/volume_expand.go +++ b/test/e2e/storage/testsuites/volume_expand.go @@ -64,6 +64,9 @@ func (v *volumeExpandTestSuite) getTestSuiteInfo() TestSuiteInfo { return v.tsInfo } +func (v *volumeExpandTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +} + func (v *volumeExpandTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/volume_io.go b/test/e2e/storage/testsuites/volume_io.go index 3b4bfc25932..88c2c20309f 100644 --- a/test/e2e/storage/testsuites/volume_io.go +++ b/test/e2e/storage/testsuites/volume_io.go @@ -77,6 +77,12 @@ func (t *volumeIOTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } +func (t *volumeIOTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { + skipVolTypePatterns(pattern, driver, testpatterns.NewVolTypeMap( + testpatterns.PreprovisionedPV, + testpatterns.InlineVolume)) +} + func (t *volumeIOTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/volumemode.go b/test/e2e/storage/testsuites/volumemode.go index fabd7184113..38a98229808 100644 --- a/test/e2e/storage/testsuites/volumemode.go +++ b/test/e2e/storage/testsuites/volumemode.go @@ -63,6 +63,9 @@ func (t *volumeModeTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } +func (t *volumeModeTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { +} + func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpatterns.TestPattern) { type local struct { config *PerTestConfig diff --git a/test/e2e/storage/testsuites/volumes.go b/test/e2e/storage/testsuites/volumes.go index 2bc6eb3c640..a26fcbc258b 100644 --- a/test/e2e/storage/testsuites/volumes.go +++ b/test/e2e/storage/testsuites/volumes.go @@ -26,7 +26,7 @@ import ( "github.com/onsi/ginkgo" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework/volume" @@ -78,7 +78,7 @@ func (t *volumesTestSuite) getTestSuiteInfo() TestSuiteInfo { return t.tsInfo } -func (t *volumesTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) { +func (t *volumesTestSuite) skipRedundantSuite(driver TestDriver, pattern testpatterns.TestPattern) { } func skipExecTest(driver TestDriver) {