From 33c213577e81cd520eb0370e8ea95286ee900bcc Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Tue, 13 Aug 2019 11:57:33 -0700 Subject: [PATCH 1/2] Skip preprovisioned and inline volume tests if driver supports dynamic provisioning. Also remove FS VolMode disruptive tests because they are already covered through the subpath disruptive test cases. Change-Id: Ice4b30b0d8fdcb1f7fd61e54d27f53557de9f13a --- test/e2e/storage/testpatterns/testpattern.go | 11 ++++++++++- test/e2e/storage/testsuites/base.go | 11 +++++++++++ test/e2e/storage/testsuites/disruptive.go | 11 ++++++----- test/e2e/storage/testsuites/ephemeral.go | 3 +++ test/e2e/storage/testsuites/multivolume.go | 4 ++++ test/e2e/storage/testsuites/provisioning.go | 3 +++ test/e2e/storage/testsuites/snapshottable.go | 3 +++ test/e2e/storage/testsuites/subpath.go | 6 ++++++ test/e2e/storage/testsuites/volume_expand.go | 3 +++ test/e2e/storage/testsuites/volume_io.go | 6 ++++++ test/e2e/storage/testsuites/volumemode.go | 3 +++ test/e2e/storage/testsuites/volumes.go | 4 ++-- 12 files changed, 60 insertions(+), 8 deletions(-) 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..f401e4e60e0 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,21 @@ func InitDisruptiveTestSuite() TestSuite { name: "disruptive", featureTag: "[Disruptive]", testPatterns: []testpatterns.TestPattern{ - testpatterns.DefaultFsInlineVolume, - testpatterns.FsVolModePreprovisionedPV, - testpatterns.FsVolModeDynamicPV, + // FSVolMode is already covered in subpath testsuite 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 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 aa7565243ce..30c3224fe27 100644 --- a/test/e2e/storage/testsuites/provisioning.go +++ b/test/e2e/storage/testsuites/provisioning.go @@ -81,6 +81,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 e4a4d586fcb..0a8a2f53c52 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 89dadb3ca73..afa4c73382e 100644 --- a/test/e2e/storage/testsuites/volumemode.go +++ b/test/e2e/storage/testsuites/volumemode.go @@ -60,6 +60,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) { From 62f0b7df7be55c640c4d44cc579725727d913e66 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Thu, 15 Aug 2019 15:08:14 -0700 Subject: [PATCH 2/2] Disable kubelet restart tests for file volmode Change-Id: I016cba4aba11d6e8574d4bc2d1f26284a068e562 --- test/e2e/storage/testsuites/disruptive.go | 58 +++++++++++++---------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/test/e2e/storage/testsuites/disruptive.go b/test/e2e/storage/testsuites/disruptive.go index f401e4e60e0..e63a5484d22 100644 --- a/test/e2e/storage/testsuites/disruptive.go +++ b/test/e2e/storage/testsuites/disruptive.go @@ -39,6 +39,10 @@ func InitDisruptiveTestSuite() TestSuite { featureTag: "[Disruptive]", testPatterns: []testpatterns.TestPattern{ // FSVolMode is already covered in subpath testsuite + testpatterns.DefaultFsInlineVolume, + testpatterns.FsVolModePreprovisionedPV, + testpatterns.FsVolModeDynamicPV, + testpatterns.BlockVolModePreprovisionedPV, testpatterns.BlockVolModePreprovisionedPV, testpatterns.BlockVolModeDynamicPV, }, @@ -122,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) + } } }