@@ -53,7 +53,6 @@ const (
53
53
pdDiskTypeUnsupportedPattern = `\[([a-z-]+)\] features are not compatible for creating instance`
54
54
)
55
55
56
- var hyperdiskTypes = []string {"hyperdisk-extreme" , "hyperdisk-throughput" , "hyperdisk-balanced" }
57
56
var pdDiskTypeUnsupportedRegex = regexp .MustCompile (pdDiskTypeUnsupportedPattern )
58
57
59
58
type GCEAPIVersion string
@@ -101,7 +100,6 @@ type GCECompute interface {
101
100
// Disk Methods
102
101
GetDisk (ctx context.Context , project string , volumeKey * meta.Key ) (* CloudDisk , error )
103
102
RepairUnderspecifiedVolumeKey (ctx context.Context , project string , volumeKey * meta.Key ) (string , * meta.Key , error )
104
- ValidateExistingDisk (ctx context.Context , disk * CloudDisk , params common.DiskParameters , reqBytes , limBytes int64 , multiWriter bool ) error
105
103
InsertDisk (ctx context.Context , project string , volKey * meta.Key , params common.DiskParameters , capBytes int64 , capacityRange * csi.CapacityRange , replicaZones []string , snapshotID string , volumeContentSourceVolumeID string , multiWriter bool , accessMode string ) error
106
104
DeleteDisk (ctx context.Context , project string , volumeKey * meta.Key ) error
107
105
UpdateDisk (ctx context.Context , project string , volKey * meta.Key , existingDisk * CloudDisk , params common.ModifyVolumeParameters ) error
@@ -382,7 +380,7 @@ func (cloud *CloudProvider) getRegionURI(project, region string) string {
382
380
region )
383
381
}
384
382
385
- func ( cloud * CloudProvider ) ValidateExistingDisk (ctx context.Context , resp * CloudDisk , params common.DiskParameters , reqBytes , limBytes int64 , multiWriter bool ) error {
383
+ func ValidateExistingDisk (ctx context.Context , resp * CloudDisk , params common.DiskParameters , reqBytes , limBytes int64 , multiWriter bool , accessMode string ) error {
386
384
klog .V (5 ).Infof ("Validating existing disk %v with diskType: %s, reqested bytes: %v, limit bytes: %v" , resp , params .DiskType , reqBytes , limBytes )
387
385
if resp == nil {
388
386
return fmt .Errorf ("disk does not exist" )
@@ -395,14 +393,33 @@ func (cloud *CloudProvider) ValidateExistingDisk(ctx context.Context, resp *Clou
395
393
reqBytes , common .GbToBytes (resp .GetSizeGb ()), limBytes )
396
394
}
397
395
398
- // We are assuming here that a multiWriter disk could be used as non-multiWriter
399
- if multiWriter && ! resp .GetMultiWriter () {
396
+ if common .IsHyperdisk (params .DiskType ) {
397
+ if validAccessMode (accessMode , resp .GetAccessMode ()) {
398
+ return fmt .Errorf ("disk already exists with incompatible capability. Need %s. Got %s" , accessMode , resp .GetAccessMode ())
399
+ }
400
+ } else if multiWriter && ! resp .GetMultiWriter () {
401
+ // We are assuming here that a multiWriter PD could be used as non-multiWriter
400
402
return fmt .Errorf ("disk already exists with incompatible capability. Need MultiWriter. Got non-MultiWriter" )
401
403
}
402
404
403
405
return ValidateDiskParameters (resp , params )
404
406
}
405
407
408
+ func validAccessMode (want , got string ) bool {
409
+ if want == got {
410
+ return true
411
+ }
412
+ switch want {
413
+ case common .GCEReadOnlyManyAccessMode :
414
+ return got == common .GCEReadWriteManyAccessMode
415
+ case common .GCEReadWriteOnceAccessMode :
416
+ return got == common .GCEReadWriteManyAccessMode
417
+ // For RWX, no other access mode is valid.
418
+ default :
419
+ return false
420
+ }
421
+ }
422
+
406
423
// ValidateDiskParameters takes a CloudDisk and returns true if the parameters
407
424
// specified validly describe the disk provided, and false otherwise.
408
425
func ValidateDiskParameters (disk * CloudDisk , params common.DiskParameters ) error {
@@ -442,7 +459,7 @@ func (cloud *CloudProvider) InsertDisk(ctx context.Context, project string, volK
442
459
if description == "" {
443
460
description = "Regional disk created by GCE-PD CSI Driver"
444
461
}
445
- return cloud .insertRegionalDisk (ctx , project , volKey , params , capBytes , capacityRange , replicaZones , snapshotID , volumeContentSourceVolumeID , description , multiWriter )
462
+ return cloud .insertRegionalDisk (ctx , project , volKey , params , capBytes , capacityRange , replicaZones , snapshotID , volumeContentSourceVolumeID , description , multiWriter , accessMode )
446
463
default :
447
464
return fmt .Errorf ("could not insert disk, key was neither zonal nor regional, instead got: %v" , volKey .String ())
448
465
}
@@ -626,7 +643,8 @@ func (cloud *CloudProvider) insertRegionalDisk(
626
643
snapshotID string ,
627
644
volumeContentSourceVolumeID string ,
628
645
description string ,
629
- multiWriter bool ) error {
646
+ multiWriter bool ,
647
+ accessMode string ) error {
630
648
var (
631
649
err error
632
650
opName string
@@ -676,8 +694,13 @@ func (cloud *CloudProvider) insertRegionalDisk(
676
694
}
677
695
}
678
696
697
+ if common .IsHyperdisk (params .DiskType ) {
698
+ diskToCreate .AccessMode = accessMode
699
+ } else {
700
+ diskToCreate .MultiWriter = multiWriter
701
+ }
702
+
679
703
var insertOp * computebeta.Operation
680
- diskToCreate .MultiWriter = multiWriter
681
704
insertOp , err = cloud .betaService .RegionDisks .Insert (project , volKey .Region , diskToCreate ).Context (ctx ).Do ()
682
705
if insertOp != nil {
683
706
opName = insertOp .Name
@@ -691,10 +714,10 @@ func (cloud *CloudProvider) insertRegionalDisk(
691
714
// the error code should be non-Final
692
715
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
693
716
}
694
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
717
+ err = ValidateExistingDisk (ctx , disk , params ,
695
718
int64 (capacityRange .GetRequiredBytes ()),
696
719
int64 (capacityRange .GetLimitBytes ()),
697
- multiWriter )
720
+ multiWriter , accessMode )
698
721
if err != nil {
699
722
return err
700
723
}
@@ -715,10 +738,10 @@ func (cloud *CloudProvider) insertRegionalDisk(
715
738
if err != nil {
716
739
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
717
740
}
718
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
741
+ err = ValidateExistingDisk (ctx , disk , params ,
719
742
int64 (capacityRange .GetRequiredBytes ()),
720
743
int64 (capacityRange .GetLimitBytes ()),
721
- multiWriter )
744
+ multiWriter , accessMode )
722
745
if err != nil {
723
746
return err
724
747
}
@@ -806,7 +829,12 @@ func (cloud *CloudProvider) insertZonalDisk(
806
829
}
807
830
}
808
831
809
- diskToCreate .AccessMode = accessMode
832
+ if common .IsHyperdisk (params .DiskType ) {
833
+ diskToCreate .AccessMode = accessMode
834
+ } else {
835
+ diskToCreate .MultiWriter = multiWriter
836
+ }
837
+
810
838
var insertOp * computebeta.Operation
811
839
insertOp , err = cloud .betaService .Disks .Insert (project , volKey .Zone , diskToCreate ).Context (ctx ).Do ()
812
840
if insertOp != nil {
@@ -821,10 +849,10 @@ func (cloud *CloudProvider) insertZonalDisk(
821
849
// the error code should be non-Final
822
850
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
823
851
}
824
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
852
+ err = ValidateExistingDisk (ctx , disk , params ,
825
853
int64 (capacityRange .GetRequiredBytes ()),
826
854
int64 (capacityRange .GetLimitBytes ()),
827
- multiWriter )
855
+ multiWriter , accessMode )
828
856
if err != nil {
829
857
return err
830
858
}
@@ -846,10 +874,10 @@ func (cloud *CloudProvider) insertZonalDisk(
846
874
if err != nil {
847
875
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
848
876
}
849
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
877
+ err = ValidateExistingDisk (ctx , disk , params ,
850
878
int64 (capacityRange .GetRequiredBytes ()),
851
879
int64 (capacityRange .GetLimitBytes ()),
852
- multiWriter )
880
+ multiWriter , accessMode )
853
881
if err != nil {
854
882
return err
855
883
}
@@ -1687,13 +1715,3 @@ func encodeTags(tags map[string]string) (string, error) {
1687
1715
}
1688
1716
return string (enc ), nil
1689
1717
}
1690
-
1691
- func containsBetaDiskType (betaDiskTypes []string , diskType string ) bool {
1692
- for _ , betaDiskType := range betaDiskTypes {
1693
- if betaDiskType == diskType {
1694
- return true
1695
- }
1696
- }
1697
-
1698
- return false
1699
- }
0 commit comments