123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*
- 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
- import (
- "github.com/onsi/ginkgo"
- v1 "k8s.io/api/core/v1"
- errors "k8s.io/apimachinery/pkg/util/errors"
- clientset "k8s.io/client-go/kubernetes"
- "k8s.io/kubernetes/test/e2e/framework"
- e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
- e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
- e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
- "k8s.io/kubernetes/test/e2e/storage/testpatterns"
- "k8s.io/kubernetes/test/e2e/storage/utils"
- )
- type disruptiveTestSuite struct {
- tsInfo TestSuiteInfo
- }
- var _ TestSuite = &disruptiveTestSuite{}
- // InitDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface
- func InitDisruptiveTestSuite() TestSuite {
- return &disruptiveTestSuite{
- tsInfo: TestSuiteInfo{
- Name: "disruptive",
- FeatureTag: "[Disruptive]",
- TestPatterns: []testpatterns.TestPattern{
- // FSVolMode is already covered in subpath testsuite
- testpatterns.DefaultFsInlineVolume,
- testpatterns.FsVolModePreprovisionedPV,
- testpatterns.FsVolModeDynamicPV,
- 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
- driverCleanup func()
- cs clientset.Interface
- ns *v1.Namespace
- // VolumeResource contains pv, pvc, sc, etc., owns cleaning that up
- resource *VolumeResource
- pod *v1.Pod
- }
- var l local
- // No preconditions to test. Normally they would be in a BeforeEach here.
- // This intentionally comes after checking the preconditions because it
- // registers its own BeforeEach which creates the namespace. Beware that it
- // also registers an AfterEach which renders f unusable. Any code using
- // f must run inside an It or Context callback.
- f := framework.NewDefaultFramework("disruptive")
- init := func() {
- l = local{}
- l.ns = f.Namespace
- l.cs = f.ClientSet
- // Now do the more expensive test initialization.
- l.config, l.driverCleanup = driver.PrepareTest(f)
- if pattern.VolMode == v1.PersistentVolumeBlock && !driver.GetDriverInfo().Capabilities[CapBlock] {
- e2eskipper.Skipf("Driver %s doesn't support %v -- skipping", driver.GetDriverInfo().Name, pattern.VolMode)
- }
- testVolumeSizeRange := s.GetTestSuiteInfo().SupportedSizeRange
- l.resource = CreateVolumeResource(driver, l.config, pattern, testVolumeSizeRange)
- }
- cleanup := func() {
- var errs []error
- if l.pod != nil {
- ginkgo.By("Deleting pod")
- err := e2epod.DeletePodWithWait(f.ClientSet, l.pod)
- errs = append(errs, err)
- l.pod = nil
- }
- if l.resource != nil {
- err := l.resource.CleanupResource()
- errs = append(errs, err)
- l.resource = nil
- }
- errs = append(errs, tryFunc(l.driverCleanup))
- l.driverCleanup = nil
- framework.ExpectNoError(errors.NewAggregate(errs), "while cleaning up resource")
- }
- type testBody func(c clientset.Interface, f *framework.Framework, clientPod *v1.Pod)
- type disruptiveTest struct {
- testItStmt string
- runTestFile testBody
- runTestBlock testBody
- }
- disruptiveTestTable := []disruptiveTest{
- {
- testItStmt: "Should test that pv written before kubelet restart is readable after restart.",
- runTestFile: utils.TestKubeletRestartsAndRestoresMount,
- 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.",
- // 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.",
- // File test is covered by subpath testsuite
- runTestBlock: utils.TestVolumeUnmapsFromForceDeletedPod,
- },
- }
- for _, test := range disruptiveTestTable {
- func(t disruptiveTest) {
- if (pattern.VolMode == v1.PersistentVolumeBlock && t.runTestBlock != nil) ||
- (pattern.VolMode == v1.PersistentVolumeFilesystem && t.runTestFile != nil) {
- 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 = e2epod.CreateSecPodWithNodeSelection(l.cs, l.ns.Name, pvcs, inlineSources, false, "", false, false, e2epv.SELinuxLabel, nil, l.config.ClientNodeSelection, framework.PodStartTimeout)
- framework.ExpectNoError(err, "While creating pods for kubelet restart test")
- if pattern.VolMode == v1.PersistentVolumeBlock && t.runTestBlock != nil {
- t.runTestBlock(l.cs, l.config.Framework, l.pod)
- }
- if pattern.VolMode == v1.PersistentVolumeFilesystem && t.runTestFile != nil {
- t.runTestFile(l.cs, l.config.Framework, l.pod)
- }
- })
- }
- }(test)
- }
- }
|