@@ -22,14 +22,14 @@ import (
22
22
"fmt"
23
23
"regexp"
24
24
"strings"
25
+ "time"
25
26
26
27
"k8s.io/api/core/v1"
27
28
storagev1 "k8s.io/api/storage/v1"
28
29
"k8s.io/apimachinery/pkg/api/errors"
29
30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30
31
"k8s.io/apimachinery/pkg/util/sets"
31
32
clientset "k8s.io/client-go/kubernetes"
32
- csiv1alpha1 "k8s.io/csi-api/pkg/apis/csi/v1alpha1"
33
33
csiclient "k8s.io/csi-api/pkg/client/clientset/versioned"
34
34
"k8s.io/kubernetes/test/e2e/framework"
35
35
"k8s.io/kubernetes/test/e2e/framework/podlogs"
@@ -196,57 +196,49 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
196
196
})
197
197
198
198
// The CSIDriverRegistry feature gate is needed for this test in Kubernetes 1.12.
199
- Context ("CSI attach test using HostPath driver [Feature:CSIDriverRegistry]" , func () {
199
+
200
+ Context ("CSI attach test using mock driver [Feature:CSIDriverRegistry]" , func () {
200
201
var (
201
202
driver testsuites.TestDriver
202
203
)
203
204
204
- BeforeEach (func () {
205
- config := testsuites.TestConfig {
206
- Framework : f ,
207
- Prefix : "csi-attach" ,
208
- }
209
- driver = drivers .InitHostPathCSIDriver (config )
210
- driver .CreateDriver ()
211
- })
212
-
213
- AfterEach (func () {
214
- driver .CleanupDriver ()
215
- })
216
-
217
205
tests := []struct {
218
- name string
219
- driverAttachable bool
220
- driverExists bool
221
- expectVolumeAttachment bool
206
+ name string
207
+ driverAttachable bool
208
+ driverExists bool
222
209
}{
223
210
{
224
- name : "non-attachable volume does not need VolumeAttachment" ,
225
- driverAttachable : false ,
226
- driverExists : true ,
227
- expectVolumeAttachment : false ,
211
+ name : "should not require VolumeAttach for drivers without attachment" ,
212
+ driverAttachable : false ,
213
+ driverExists : true ,
228
214
},
229
215
{
230
- name : "attachable volume needs VolumeAttachment" ,
231
- driverAttachable : true ,
232
- driverExists : true ,
233
- expectVolumeAttachment : true ,
216
+ name : "should require VolumeAttach for drivers with attachment" ,
217
+ driverAttachable : true ,
218
+ driverExists : true ,
234
219
},
235
220
{
236
- name : "volume with no CSI driver needs VolumeAttachment " ,
237
- driverExists : false ,
238
- expectVolumeAttachment : true ,
221
+ name : "should preserve attachment policy when no CSIDriver present " ,
222
+ driverAttachable : true ,
223
+ driverExists : false ,
239
224
},
240
225
}
241
226
242
227
for _ , t := range tests {
243
228
test := t
244
229
It (test .name , func () {
230
+ By ("Deploying mock CSI driver" )
231
+ config := testsuites.TestConfig {
232
+ Framework : f ,
233
+ Prefix : "csi-attach" ,
234
+ }
235
+
236
+ driver = drivers .InitMockCSIDriver (config , test .driverExists , test .driverAttachable , nil )
237
+ driver .CreateDriver ()
238
+
245
239
if test .driverExists {
246
- csiDriver := createCSIDriver (csics , testsuites .GetUniqueDriverName (driver ), test .driverAttachable , nil )
247
- if csiDriver != nil {
248
- defer csics .CsiV1alpha1 ().CSIDrivers ().Delete (csiDriver .Name , nil )
249
- }
240
+ defer destroyCSIDriver (csics , driver )
241
+ defer driver .CleanupDriver ()
250
242
}
251
243
252
244
By ("Creating pod" )
@@ -270,7 +262,8 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
270
262
defer cs .StorageV1 ().StorageClasses ().Delete (class .Name , nil )
271
263
}
272
264
if claim != nil {
273
- defer cs .CoreV1 ().PersistentVolumeClaims (ns .Name ).Delete (claim .Name , nil )
265
+ // Fully delete PV before deleting CSI driver
266
+ defer deleteVolume (cs , claim )
274
267
}
275
268
if pod != nil {
276
269
// Fully delete (=unmount) the pod before deleting CSI driver
@@ -284,48 +277,34 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
284
277
framework .ExpectNoError (err , "Failed to start pod: %v" , err )
285
278
286
279
By ("Checking if VolumeAttachment was created for the pod" )
287
- // Check that VolumeAttachment does not exist
288
280
handle := getVolumeHandle (cs , claim )
289
281
attachmentHash := sha256 .Sum256 ([]byte (fmt .Sprintf ("%s%s%s" , handle , scTest .Provisioner , nodeName )))
290
282
attachmentName := fmt .Sprintf ("csi-%x" , attachmentHash )
291
283
_ , err = cs .StorageV1beta1 ().VolumeAttachments ().Get (attachmentName , metav1.GetOptions {})
292
284
if err != nil {
293
285
if errors .IsNotFound (err ) {
294
- if test .expectVolumeAttachment {
286
+ if test .driverAttachable {
295
287
framework .ExpectNoError (err , "Expected VolumeAttachment but none was found" )
296
288
}
297
289
} else {
298
290
framework .ExpectNoError (err , "Failed to find VolumeAttachment" )
299
291
}
300
292
}
301
- if ! test .expectVolumeAttachment {
293
+ if ! test .driverAttachable {
302
294
Expect (err ).To (HaveOccurred (), "Unexpected VolumeAttachment found" )
303
295
}
304
296
})
305
297
}
306
298
})
307
299
308
- Context ("CSI workload information [Feature:CSIDriverRegistry]" , func () {
300
+ Context ("CSI workload information using mock driver [Feature:CSIDriverRegistry]" , func () {
309
301
var (
310
302
driver testsuites.TestDriver
311
303
podInfoV1 = "v1"
312
304
podInfoUnknown = "unknown"
313
305
podInfoEmpty = ""
314
306
)
315
307
316
- BeforeEach (func () {
317
- config := testsuites.TestConfig {
318
- Framework : f ,
319
- Prefix : "csi-workload" ,
320
- }
321
- driver = drivers .InitMockCSIDriver (config )
322
- driver .CreateDriver ()
323
- })
324
-
325
- AfterEach (func () {
326
- driver .CleanupDriver ()
327
- })
328
-
329
308
tests := []struct {
330
309
name string
331
310
podInfoOnMountVersion * string
@@ -365,11 +344,18 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
365
344
for _ , t := range tests {
366
345
test := t
367
346
It (test .name , func () {
347
+ By ("Deploying mock CSI driver" )
348
+ config := testsuites.TestConfig {
349
+ Framework : f ,
350
+ Prefix : "csi-workload" ,
351
+ }
352
+
353
+ driver = drivers .InitMockCSIDriver (config , test .driverExists , true , test .podInfoOnMountVersion )
354
+ driver .CreateDriver ()
355
+
368
356
if test .driverExists {
369
- csiDriver := createCSIDriver (csics , testsuites .GetUniqueDriverName (driver ), true , test .podInfoOnMountVersion )
370
- if csiDriver != nil {
371
- defer csics .CsiV1alpha1 ().CSIDrivers ().Delete (csiDriver .Name , nil )
372
- }
357
+ defer destroyCSIDriver (csics , driver )
358
+ defer driver .CleanupDriver ()
373
359
}
374
360
375
361
By ("Creating pod" )
@@ -397,7 +383,8 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
397
383
defer cs .StorageV1 ().StorageClasses ().Delete (class .Name , nil )
398
384
}
399
385
if claim != nil {
400
- defer cs .CoreV1 ().PersistentVolumeClaims (ns .Name ).Delete (claim .Name , nil )
386
+ // Fully delete PV before deleting CSI driver
387
+ defer deleteVolume (cs , claim )
401
388
}
402
389
if pod != nil {
403
390
// Fully delete (=unmount) the pod before deleting CSI driver
@@ -472,20 +459,15 @@ func testTopologyNegative(cs clientset.Interface, suffix, namespace string, dela
472
459
}
473
460
}
474
461
475
- func createCSIDriver (csics csiclient.Interface , name string , attachable bool , podInfoOnMountVersion * string ) * csiv1alpha1.CSIDriver {
476
- By ("Creating CSIDriver instance" )
477
- driver := & csiv1alpha1.CSIDriver {
478
- ObjectMeta : metav1.ObjectMeta {
479
- Name : name ,
480
- },
481
- Spec : csiv1alpha1.CSIDriverSpec {
482
- AttachRequired : & attachable ,
483
- PodInfoOnMountVersion : podInfoOnMountVersion ,
484
- },
462
+ func destroyCSIDriver (csics csiclient.Interface , driver testsuites.TestDriver ) {
463
+ driverName := testsuites .GetUniqueDriverName (driver )
464
+ driverGet , err := csics .CsiV1alpha1 ().CSIDrivers ().Get (driverName , metav1.GetOptions {})
465
+ if err == nil {
466
+ framework .Logf ("deleting %s.%s: %s" , driverGet .TypeMeta .APIVersion , driverGet .TypeMeta .Kind , driverGet .ObjectMeta .Name )
467
+ // Uncomment the following line to get full dump of CSIDriver object
468
+ // framework.Logf("%s", framework.PrettyPrint(driverGet))
469
+ csics .CsiV1alpha1 ().CSIDrivers ().Delete (driverName , nil )
485
470
}
486
- driver , err := csics .CsiV1alpha1 ().CSIDrivers ().Create (driver )
487
- framework .ExpectNoError (err , "Failed to create CSIDriver: %v" , err )
488
- return driver
489
471
}
490
472
491
473
func getVolumeHandle (cs clientset.Interface , claim * v1.PersistentVolumeClaim ) string {
@@ -508,6 +490,15 @@ func getVolumeHandle(cs clientset.Interface, claim *v1.PersistentVolumeClaim) st
508
490
return pv .Spec .CSI .VolumeHandle
509
491
}
510
492
493
+ func deleteVolume (cs clientset.Interface , claim * v1.PersistentVolumeClaim ) {
494
+ // re-get the claim to the latest state with bound volume
495
+ claim , err := cs .CoreV1 ().PersistentVolumeClaims (claim .Namespace ).Get (claim .Name , metav1.GetOptions {})
496
+ if err == nil {
497
+ cs .CoreV1 ().PersistentVolumeClaims (claim .Namespace ).Delete (claim .Name , nil )
498
+ framework .WaitForPersistentVolumeDeleted (cs , claim .Spec .VolumeName , 2 * time .Second , 2 * time .Minute )
499
+ }
500
+ }
501
+
511
502
func startPausePod (cs clientset.Interface , t testsuites.StorageClassTest , node testsuites.NodeSelection , ns string ) (* storagev1.StorageClass , * v1.PersistentVolumeClaim , * v1.Pod ) {
512
503
class := newStorageClass (t , ns , "" )
513
504
class , err := cs .StorageV1 ().StorageClasses ().Create (class )
0 commit comments