@@ -24,6 +24,7 @@ import (
24
24
25
25
"github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta"
26
26
csi "github.com/container-storage-interface/spec/lib/go/csi"
27
+ computealpha "google.golang.org/api/compute/v0.alpha"
27
28
computebeta "google.golang.org/api/compute/v0.beta"
28
29
computev1 "google.golang.org/api/compute/v1"
29
30
"google.golang.org/grpc/codes"
@@ -51,8 +52,10 @@ type GCEAPIVersion string
51
52
const (
52
53
// V1 key type
53
54
GCEAPIVersionV1 GCEAPIVersion = "v1"
54
- // Alpha key type
55
+ // Beta key type
55
56
GCEAPIVersionBeta GCEAPIVersion = "beta"
57
+ // Alpha key type
58
+ GCEAPIVersionAlpha GCEAPIVersion = "alpha"
56
59
)
57
60
58
61
// AttachDiskBackoff is backoff used to wait for AttachDisk to complete.
@@ -266,13 +269,16 @@ func (cloud *CloudProvider) GetDisk(ctx context.Context, project string, key *me
266
269
if gceAPIVersion == GCEAPIVersionBeta {
267
270
disk , err := cloud .getZonalBetaDiskOrError (ctx , project , key .Zone , key .Name )
268
271
return CloudDiskFromBeta (disk ), err
272
+ } else if gceAPIVersion == GCEAPIVersionAlpha {
273
+ disk , err := cloud .getZonalAlphaDiskOrError (ctx , project , key .Zone , key .Name )
274
+ return CloudDiskFromAlpha (disk ), err
269
275
} else {
270
276
disk , err := cloud .getZonalDiskOrError (ctx , project , key .Zone , key .Name )
271
277
return CloudDiskFromV1 (disk ), err
272
278
}
273
279
case meta .Regional :
274
280
if gceAPIVersion == GCEAPIVersionBeta {
275
- disk , err := cloud .getRegionalAlphaDiskOrError (ctx , project , key .Region , key .Name )
281
+ disk , err := cloud .getRegionalBetaDiskOrError (ctx , project , key .Region , key .Name )
276
282
return CloudDiskFromBeta (disk ), err
277
283
} else {
278
284
disk , err := cloud .getRegionalDiskOrError (ctx , project , key .Region , key .Name )
@@ -299,6 +305,14 @@ func (cloud *CloudProvider) getRegionalDiskOrError(ctx context.Context, project,
299
305
return disk , nil
300
306
}
301
307
308
+ func (cloud * CloudProvider ) getZonalAlphaDiskOrError (ctx context.Context , project , volumeZone , volumeName string ) (* computealpha.Disk , error ) {
309
+ disk , err := cloud .alphaService .Disks .Get (project , volumeZone , volumeName ).Context (ctx ).Do ()
310
+ if err != nil {
311
+ return nil , err
312
+ }
313
+ return disk , nil
314
+ }
315
+
302
316
func (cloud * CloudProvider ) getZonalBetaDiskOrError (ctx context.Context , project , volumeZone , volumeName string ) (* computebeta.Disk , error ) {
303
317
disk , err := cloud .betaService .Disks .Get (project , volumeZone , volumeName ).Context (ctx ).Do ()
304
318
if err != nil {
@@ -307,7 +321,7 @@ func (cloud *CloudProvider) getZonalBetaDiskOrError(ctx context.Context, project
307
321
return disk , nil
308
322
}
309
323
310
- func (cloud * CloudProvider ) getRegionalAlphaDiskOrError (ctx context.Context , project , volumeRegion , volumeName string ) (* computebeta.Disk , error ) {
324
+ func (cloud * CloudProvider ) getRegionalBetaDiskOrError (ctx context.Context , project , volumeRegion , volumeName string ) (* computebeta.Disk , error ) {
311
325
disk , err := cloud .betaService .RegionDisks .Get (project , volumeRegion , volumeName ).Context (ctx ).Do ()
312
326
if err != nil {
313
327
return nil , err
@@ -440,6 +454,37 @@ func convertV1DiskToBetaDisk(v1Disk *computev1.Disk, provisionedThroughputOnCrea
440
454
return betaDisk
441
455
}
442
456
457
+ func convertV1DiskToAlphaDisk (v1Disk * computev1.Disk , provisionedThroughputOnCreate int64 , storagePool string ) * computealpha.Disk {
458
+ // Note: this is an incomplete list. It only includes the fields we use for disk creation.
459
+ alphaDisk := & computealpha.Disk {
460
+ Name : v1Disk .Name ,
461
+ SizeGb : v1Disk .SizeGb ,
462
+ Description : v1Disk .Description ,
463
+ Type : v1Disk .Type ,
464
+ SourceSnapshot : v1Disk .SourceSnapshot ,
465
+ SourceImage : v1Disk .SourceImage ,
466
+ SourceImageId : v1Disk .SourceImageId ,
467
+ SourceSnapshotId : v1Disk .SourceSnapshotId ,
468
+ SourceDisk : v1Disk .SourceDisk ,
469
+ ReplicaZones : v1Disk .ReplicaZones ,
470
+ Zone : v1Disk .Zone ,
471
+ Region : v1Disk .Region ,
472
+ Status : v1Disk .Status ,
473
+ SelfLink : v1Disk .SelfLink ,
474
+ }
475
+ if v1Disk .ProvisionedIops > 0 {
476
+ alphaDisk .ProvisionedIops = v1Disk .ProvisionedIops
477
+ }
478
+ if provisionedThroughputOnCreate > 0 {
479
+ alphaDisk .ProvisionedThroughput = provisionedThroughputOnCreate
480
+ }
481
+ if storagePool != "" {
482
+ alphaDisk .StoragePool = storagePool
483
+ }
484
+
485
+ return alphaDisk
486
+ }
487
+
443
488
func (cloud * CloudProvider ) insertRegionalDisk (
444
489
ctx context.Context ,
445
490
project string ,
@@ -572,6 +617,10 @@ func (cloud *CloudProvider) insertZonalDisk(
572
617
if multiWriter || containsBetaDiskType (hyperdiskTypes , params .DiskType ) {
573
618
gceAPIVersion = GCEAPIVersionBeta
574
619
}
620
+ storagePoolsEnabled := params .StoragePools != nil
621
+ if storagePoolsEnabled {
622
+ gceAPIVersion = GCEAPIVersionAlpha
623
+ }
575
624
576
625
diskToCreate := & computev1.Disk {
577
626
Name : volKey .Name ,
@@ -618,6 +667,22 @@ func (cloud *CloudProvider) insertZonalDisk(
618
667
if insertOp != nil {
619
668
opName = insertOp .Name
620
669
}
670
+ } else if gceAPIVersion == GCEAPIVersionAlpha {
671
+ var insertOp * computealpha.Operation
672
+ var storagePool string
673
+ if storagePoolsEnabled {
674
+ storagePool = common .StoragePoolInZone (params .StoragePools , diskToCreate .Zone )
675
+ if storagePool == "" {
676
+ return status .Errorf (codes .InvalidArgument , "cannot create disk in zone %q: no Storage Pools exist in zone" , diskToCreate .Zone )
677
+ }
678
+ }
679
+ alphaDiskToCreate := convertV1DiskToAlphaDisk (diskToCreate , params .ProvisionedThroughputOnCreate , storagePool )
680
+ alphaDiskToCreate .MultiWriter = multiWriter
681
+ alphaDiskToCreate .EnableConfidentialCompute = params .EnableConfidentialCompute
682
+ insertOp , err = cloud .alphaService .Disks .Insert (project , volKey .Zone , alphaDiskToCreate ).Context (ctx ).Do ()
683
+ if insertOp != nil {
684
+ opName = insertOp .Name
685
+ }
621
686
} else {
622
687
var insertOp * computev1.Operation
623
688
insertOp , err = cloud .service .Disks .Insert (project , volKey .Zone , diskToCreate ).Context (ctx ).Do ()
0 commit comments