@@ -32,6 +32,7 @@ import (
32
32
"github.com/golang/glog"
33
33
34
34
"github.com/kubernetes-sigs/sig-storage-lib-external-provisioner/controller"
35
+ "github.com/kubernetes-sigs/sig-storage-lib-external-provisioner/util"
35
36
36
37
snapapi "github.com/kubernetes-csi/external-snapshotter/pkg/apis/volumesnapshot/v1alpha1"
37
38
snapclientset "github.com/kubernetes-csi/external-snapshotter/pkg/client/clientset/versioned"
@@ -108,6 +109,7 @@ const (
108
109
)
109
110
110
111
var _ controller.Provisioner = & csiProvisioner {}
112
+ var _ controller.BlockProvisioner = & csiProvisioner {}
111
113
112
114
var (
113
115
// Each provisioner have a identify string to distinguish with others. This
@@ -332,6 +334,58 @@ func makeVolumeName(prefix, pvcUID string, volumeNameUUIDLength int) (string, er
332
334
333
335
}
334
336
337
+ func getAccessTypeBlock () * csi.VolumeCapability_Block {
338
+ return & csi.VolumeCapability_Block {
339
+ Block : & csi.VolumeCapability_BlockVolume {},
340
+ }
341
+ }
342
+
343
+ func getAccessTypeMount (fsType string , mountFlags []string ) * csi.VolumeCapability_Mount {
344
+ return & csi.VolumeCapability_Mount {
345
+ Mount : & csi.VolumeCapability_MountVolume {
346
+ FsType : fsType ,
347
+ MountFlags : mountFlags ,
348
+ },
349
+ }
350
+ }
351
+
352
+ func getAccessMode (pvcAccessMode v1.PersistentVolumeAccessMode ) * csi.VolumeCapability_AccessMode {
353
+ switch pvcAccessMode {
354
+ case v1 .ReadWriteOnce :
355
+ return & csi.VolumeCapability_AccessMode {
356
+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
357
+ }
358
+ case v1 .ReadWriteMany :
359
+ return & csi.VolumeCapability_AccessMode {
360
+ Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER ,
361
+ }
362
+ case v1 .ReadOnlyMany :
363
+ return & csi.VolumeCapability_AccessMode {
364
+ Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ,
365
+ }
366
+ default :
367
+ return nil
368
+ }
369
+ }
370
+
371
+ func getVolumeCapability (
372
+ pvcOptions controller.VolumeOptions ,
373
+ pvcAccessMode v1.PersistentVolumeAccessMode ,
374
+ fsType string ,
375
+ ) * csi.VolumeCapability {
376
+ if util .CheckPersistentVolumeClaimModeBlock (pvcOptions .PVC ) {
377
+ return & csi.VolumeCapability {
378
+ AccessType : getAccessTypeBlock (),
379
+ AccessMode : getAccessMode (pvcAccessMode ),
380
+ }
381
+ } else {
382
+ return & csi.VolumeCapability {
383
+ AccessType : getAccessTypeMount (fsType , pvcOptions .MountOptions ),
384
+ AccessMode : getAccessMode (pvcAccessMode ),
385
+ }
386
+ }
387
+ }
388
+
335
389
func (p * csiProvisioner ) Provision (options controller.VolumeOptions ) (* v1.PersistentVolume , error ) {
336
390
if options .PVC .Spec .Selector != nil {
337
391
return nil , fmt .Errorf ("claim Selector is not supported" )
@@ -375,44 +429,14 @@ func (p *csiProvisioner) Provision(options controller.VolumeOptions) (*v1.Persis
375
429
capacity := options .PVC .Spec .Resources .Requests [v1 .ResourceName (v1 .ResourceStorage )]
376
430
volSizeBytes := capacity .Value ()
377
431
378
- accessType := & csi.VolumeCapability_Mount {
379
- Mount : & csi.VolumeCapability_MountVolume {
380
- FsType : fsType ,
381
- MountFlags : options .MountOptions ,
382
- },
383
- }
384
-
385
432
// Get access mode
386
433
volumeCaps := make ([]* csi.VolumeCapability , 0 )
387
- for _ , cap := range options .PVC .Spec .AccessModes {
388
- switch cap {
389
- case v1 .ReadWriteOnce :
390
- volumeCaps = append (volumeCaps , & csi.VolumeCapability {
391
- AccessMode : & csi.VolumeCapability_AccessMode {
392
- Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
393
- },
394
- AccessType : accessType ,
395
- })
396
- case v1 .ReadWriteMany :
397
- volumeCaps = append (volumeCaps , & csi.VolumeCapability {
398
- AccessMode : & csi.VolumeCapability_AccessMode {
399
- Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER ,
400
- },
401
- AccessType : accessType ,
402
- })
403
- case v1 .ReadOnlyMany :
404
- volumeCaps = append (volumeCaps , & csi.VolumeCapability {
405
- AccessMode : & csi.VolumeCapability_AccessMode {
406
- Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ,
407
- },
408
- AccessType : accessType ,
409
- })
410
- }
434
+ for _ , pvcAccessMode := range options .PVC .Spec .AccessModes {
435
+ volumeCaps = append (volumeCaps , getVolumeCapability (options , pvcAccessMode , fsType ))
411
436
}
412
437
413
438
// Create a CSI CreateVolumeRequest and Response
414
439
req := csi.CreateVolumeRequest {
415
-
416
440
Name : pvName ,
417
441
Parameters : options .Parameters ,
418
442
VolumeCapabilities : volumeCaps ,
@@ -538,7 +562,6 @@ func (p *csiProvisioner) Provision(options controller.VolumeOptions) (*v1.Persis
538
562
CSI : & v1.CSIPersistentVolumeSource {
539
563
Driver : driverState .driverName ,
540
564
VolumeHandle : p .volumeIdToHandle (rep .Volume .VolumeId ),
541
- FSType : fsType ,
542
565
VolumeAttributes : volumeAttributes ,
543
566
ControllerPublishSecretRef : controllerPublishSecretRef ,
544
567
NodeStageSecretRef : nodeStageSecretRef ,
@@ -553,6 +576,15 @@ func (p *csiProvisioner) Provision(options controller.VolumeOptions) (*v1.Persis
553
576
pv .Spec .NodeAffinity = GenerateVolumeNodeAffinity (rep .Volume .AccessibleTopology )
554
577
}
555
578
579
+ // Set VolumeMode to PV if it is passed via PVC spec when Block feature is enabled
580
+ if options .PVC .Spec .VolumeMode != nil {
581
+ pv .Spec .VolumeMode = options .PVC .Spec .VolumeMode
582
+ }
583
+ // Set FSType if PV is not Block Volume
584
+ if ! util .CheckPersistentVolumeClaimModeBlock (options .PVC ) {
585
+ pv .Spec .PersistentVolumeSource .CSI .FSType = fsType
586
+ }
587
+
556
588
glog .Infof ("successfully created PV %+v" , pv .Spec .PersistentVolumeSource )
557
589
558
590
return pv , nil
@@ -653,6 +685,14 @@ func (p *csiProvisioner) Delete(volume *v1.PersistentVolume) error {
653
685
return err
654
686
}
655
687
688
+ func (p * csiProvisioner ) SupportsBlock () bool {
689
+ // SupportsBlock always return true, because current CSI spec doesn't allow checking
690
+ // drivers' capability of block volume before creating volume.
691
+ // Drivers that don't support block volume should return error for CreateVolume called
692
+ // by Provision if block AccessType is specified.
693
+ return true
694
+ }
695
+
656
696
//TODO use a unique volume handle from and to Id
657
697
func (p * csiProvisioner ) volumeIdToHandle (id string ) string {
658
698
return id
0 commit comments