@@ -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,31 @@ 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 , common .GCEReadWriteOnceAccessMode :
414
+ return got == common .GCEReadWriteManyAccessMode
415
+ // For RWX, no other access mode is valid.
416
+ default :
417
+ return false
418
+ }
419
+ }
420
+
406
421
// ValidateDiskParameters takes a CloudDisk and returns true if the parameters
407
422
// specified validly describe the disk provided, and false otherwise.
408
423
func ValidateDiskParameters (disk * CloudDisk , params common.DiskParameters ) error {
@@ -442,7 +457,7 @@ func (cloud *CloudProvider) InsertDisk(ctx context.Context, project string, volK
442
457
if description == "" {
443
458
description = "Regional disk created by GCE-PD CSI Driver"
444
459
}
445
- return cloud .insertRegionalDisk (ctx , project , volKey , params , capBytes , capacityRange , replicaZones , snapshotID , volumeContentSourceVolumeID , description , multiWriter )
460
+ return cloud .insertRegionalDisk (ctx , project , volKey , params , capBytes , capacityRange , replicaZones , snapshotID , volumeContentSourceVolumeID , description , multiWriter , accessMode )
446
461
default :
447
462
return fmt .Errorf ("could not insert disk, key was neither zonal nor regional, instead got: %v" , volKey .String ())
448
463
}
@@ -626,7 +641,8 @@ func (cloud *CloudProvider) insertRegionalDisk(
626
641
snapshotID string ,
627
642
volumeContentSourceVolumeID string ,
628
643
description string ,
629
- multiWriter bool ) error {
644
+ multiWriter bool ,
645
+ accessMode string ) error {
630
646
var (
631
647
err error
632
648
opName string
@@ -676,8 +692,13 @@ func (cloud *CloudProvider) insertRegionalDisk(
676
692
}
677
693
}
678
694
695
+ if common .IsHyperdisk (params .DiskType ) {
696
+ diskToCreate .AccessMode = accessMode
697
+ } else {
698
+ diskToCreate .MultiWriter = multiWriter
699
+ }
700
+
679
701
var insertOp * computebeta.Operation
680
- diskToCreate .MultiWriter = multiWriter
681
702
insertOp , err = cloud .betaService .RegionDisks .Insert (project , volKey .Region , diskToCreate ).Context (ctx ).Do ()
682
703
if insertOp != nil {
683
704
opName = insertOp .Name
@@ -691,10 +712,10 @@ func (cloud *CloudProvider) insertRegionalDisk(
691
712
// the error code should be non-Final
692
713
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
693
714
}
694
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
715
+ err = ValidateExistingDisk (ctx , disk , params ,
695
716
int64 (capacityRange .GetRequiredBytes ()),
696
717
int64 (capacityRange .GetLimitBytes ()),
697
- multiWriter )
718
+ multiWriter , accessMode )
698
719
if err != nil {
699
720
return err
700
721
}
@@ -715,10 +736,10 @@ func (cloud *CloudProvider) insertRegionalDisk(
715
736
if err != nil {
716
737
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
717
738
}
718
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
739
+ err = ValidateExistingDisk (ctx , disk , params ,
719
740
int64 (capacityRange .GetRequiredBytes ()),
720
741
int64 (capacityRange .GetLimitBytes ()),
721
- multiWriter )
742
+ multiWriter , accessMode )
722
743
if err != nil {
723
744
return err
724
745
}
@@ -806,7 +827,12 @@ func (cloud *CloudProvider) insertZonalDisk(
806
827
}
807
828
}
808
829
809
- diskToCreate .AccessMode = accessMode
830
+ if common .IsHyperdisk (params .DiskType ) {
831
+ diskToCreate .AccessMode = accessMode
832
+ } else {
833
+ diskToCreate .MultiWriter = multiWriter
834
+ }
835
+
810
836
var insertOp * computebeta.Operation
811
837
insertOp , err = cloud .betaService .Disks .Insert (project , volKey .Zone , diskToCreate ).Context (ctx ).Do ()
812
838
if insertOp != nil {
@@ -821,10 +847,10 @@ func (cloud *CloudProvider) insertZonalDisk(
821
847
// the error code should be non-Final
822
848
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
823
849
}
824
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
850
+ err = ValidateExistingDisk (ctx , disk , params ,
825
851
int64 (capacityRange .GetRequiredBytes ()),
826
852
int64 (capacityRange .GetLimitBytes ()),
827
- multiWriter )
853
+ multiWriter , accessMode )
828
854
if err != nil {
829
855
return err
830
856
}
@@ -846,10 +872,10 @@ func (cloud *CloudProvider) insertZonalDisk(
846
872
if err != nil {
847
873
return common .NewTemporaryError (codes .Unavailable , fmt .Errorf ("error when getting disk: %w" , err ))
848
874
}
849
- err = cloud . ValidateExistingDisk (ctx , disk , params ,
875
+ err = ValidateExistingDisk (ctx , disk , params ,
850
876
int64 (capacityRange .GetRequiredBytes ()),
851
877
int64 (capacityRange .GetLimitBytes ()),
852
- multiWriter )
878
+ multiWriter , accessMode )
853
879
if err != nil {
854
880
return err
855
881
}
@@ -1687,13 +1713,3 @@ func encodeTags(tags map[string]string) (string, error) {
1687
1713
}
1688
1714
return string (enc ), nil
1689
1715
}
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