@@ -26,13 +26,15 @@ import (
26
26
"time"
27
27
28
28
"github.com/onsi/ginkgo"
29
+ "github.com/pkg/errors"
29
30
30
31
v1 "k8s.io/api/core/v1"
31
32
storagev1 "k8s.io/api/storage/v1"
32
33
apierrs "k8s.io/apimachinery/pkg/api/errors"
33
34
"k8s.io/apimachinery/pkg/api/resource"
34
35
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
35
36
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
37
+ apierrors "k8s.io/apimachinery/pkg/util/errors"
36
38
utilerrors "k8s.io/apimachinery/pkg/util/errors"
37
39
"k8s.io/apimachinery/pkg/util/sets"
38
40
clientset "k8s.io/client-go/kubernetes"
@@ -81,7 +83,7 @@ type TestSuiteInfo struct {
81
83
// TestResource represents an interface for resources that is used by TestSuite
82
84
type TestResource interface {
83
85
// cleanupResource cleans up the test resources created when setting up the resource
84
- cleanupResource ()
86
+ cleanupResource () error
85
87
}
86
88
87
89
func getTestNameStr (suite TestSuite , pattern testpatterns.TestPattern ) string {
@@ -268,9 +270,9 @@ func createVolumeSource(pvcName string, readOnly bool) *v1.VolumeSource {
268
270
}
269
271
270
272
// cleanupResource cleans up genericVolumeTestResource
271
- func (r * genericVolumeTestResource ) cleanupResource () {
273
+ func (r * genericVolumeTestResource ) cleanupResource () error {
272
274
f := r .config .Framework
273
-
275
+ var cleanUpErrs [] error
274
276
if r .pvc != nil || r .pv != nil {
275
277
switch r .pattern .VolType {
276
278
case testpatterns .PreprovisionedPV :
@@ -287,10 +289,15 @@ func (r *genericVolumeTestResource) cleanupResource() {
287
289
}
288
290
if r .pvc != nil {
289
291
err := e2epv .DeletePersistentVolumeClaim (f .ClientSet , r .pvc .Name , f .Namespace .Name )
290
- framework .ExpectNoError (err , "Failed to delete PVC %v" , r .pvc .Name )
292
+ if err != nil {
293
+ cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err , "Failed to delete PVC %v" , r .pvc .Name ))
294
+ }
291
295
if r .pv != nil {
292
296
err = framework .WaitForPersistentVolumeDeleted (f .ClientSet , r .pv .Name , 5 * time .Second , 5 * time .Minute )
293
- framework .ExpectNoError (err , "Persistent Volume %v not deleted by dynamic provisioner" , r .pv .Name )
297
+ if err != nil {
298
+ cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err ,
299
+ "Persistent Volume %v not deleted by dynamic provisioner" , r .pv .Name ))
300
+ }
294
301
}
295
302
}
296
303
default :
@@ -300,13 +307,18 @@ func (r *genericVolumeTestResource) cleanupResource() {
300
307
301
308
if r .sc != nil {
302
309
ginkgo .By ("Deleting sc" )
303
- deleteStorageClass (f .ClientSet , r .sc .Name )
310
+ if err := deleteStorageClass (f .ClientSet , r .sc .Name ); err != nil {
311
+ cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err , "Failed to delete StorageClass %v" , r .sc .Name ))
312
+ }
304
313
}
305
314
306
315
// Cleanup volume for pre-provisioned volume tests
307
316
if r .volume != nil {
308
- r .volume .DeleteVolume ()
317
+ if err := tryFunc (r .volume .DeleteVolume ); err != nil {
318
+ cleanUpErrs = append (cleanUpErrs , errors .Wrap (err , "Failed to delete Volume" ))
319
+ }
309
320
}
321
+ return apierrors .NewAggregate (cleanUpErrs )
310
322
}
311
323
312
324
func createPVCPV (
@@ -396,11 +408,12 @@ func isDelayedBinding(sc *storagev1.StorageClass) bool {
396
408
}
397
409
398
410
// deleteStorageClass deletes the passed in StorageClass and catches errors other than "Not Found"
399
- func deleteStorageClass (cs clientset.Interface , className string ) {
411
+ func deleteStorageClass (cs clientset.Interface , className string ) error {
400
412
err := cs .StorageV1 ().StorageClasses ().Delete (className , nil )
401
413
if err != nil && ! apierrs .IsNotFound (err ) {
402
- framework . ExpectNoError ( err )
414
+ return err
403
415
}
416
+ return nil
404
417
}
405
418
406
419
// convertTestConfig returns a framework test config with the
@@ -685,3 +698,17 @@ func skipVolTypePatterns(pattern testpatterns.TestPattern, driver TestDriver, sk
685
698
framework .Skipf ("Driver supports dynamic provisioning, skipping %s pattern" , pattern .VolType )
686
699
}
687
700
}
701
+
702
+ func tryFunc (f func ()) error {
703
+ var err error
704
+ if f == nil {
705
+ return nil
706
+ }
707
+ defer func () {
708
+ if recoverError := recover (); recoverError != nil {
709
+ err = fmt .Errorf ("%v" , recoverError )
710
+ }
711
+ }()
712
+ f ()
713
+ return err
714
+ }
0 commit comments