Skip to content

Commit 13133cc

Browse files
committed
Refactoring GetDisk calls based on comments
1 parent ec6b44a commit 13133cc

File tree

1 file changed

+31
-33
lines changed

1 file changed

+31
-33
lines changed

pkg/gce-pd-csi-driver/controller.go

+31-33
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
225225
// Apply Parameters (case-insensitive). We leave validation of
226226
// the values to the cloud provider.
227227
params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraVolumeLabels)
228+
diskTypeForMetric = params.DiskType
228229
if err != nil {
229230
return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err.Error())
230231
}
@@ -337,7 +338,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
337338

338339
// Verify that the volume in VolumeContentSource exists.
339340
diskFromSourceVolume, err := gceCS.CloudProvider.GetDisk(ctx, project, sourceVolKey, gceAPIVersion)
340-
diskTypeForMetric = metrics.GetDiskType(diskFromSourceVolume)
341341
if err != nil {
342342
if gce.IsGCEError(err, "notFound") {
343343
return nil, status.Errorf(codes.NotFound, "CreateVolume source volume %s does not exist", volumeContentSourceVolumeID)
@@ -394,7 +394,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
394394

395395
// Create the disk
396396
var disk *gce.CloudDisk
397-
diskTypeForMetric = params.DiskType
398397
switch params.ReplicationType {
399398
case replicationTypeNone:
400399
if len(zones) != 1 {
@@ -452,8 +451,6 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
452451
}
453452

454453
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
455-
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
456-
diskTypeForMetric = metrics.GetDiskType(disk)
457454
if err != nil {
458455
if gce.IsGCENotFoundError(err) {
459456
klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error())
@@ -466,7 +463,8 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
466463
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID)
467464
}
468465
defer gceCS.volumeLocks.Release(volumeID)
469-
466+
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
467+
diskTypeForMetric = metrics.GetDiskType(disk)
470468
err = gceCS.CloudProvider.DeleteDisk(ctx, project, volKey)
471469
if err != nil {
472470
return nil, common.LoggedError("Failed to delete disk: ", err)
@@ -485,18 +483,17 @@ func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, r
485483
}
486484
}()
487485
// Only valid requests will be accepted
488-
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
486+
_, _, err = gceCS.validateControllerPublishVolumeRequest(ctx, req)
489487
if err != nil {
490488
return nil, err
491489
}
492-
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
493-
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
490+
494491
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
495492
if gceCS.errorBackoff.blocking(backoffId) {
496493
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
497494
}
498495

499-
resp, err := gceCS.executeControllerPublishVolume(ctx, req)
496+
resp, err, diskTypeForMetric := gceCS.executeControllerPublishVolume(ctx, req)
500497
if err != nil {
501498
klog.Infof("For node %s adding backoff due to error for volume %s: %v", req.NodeId, req.VolumeId, err.Error())
502499
gceCS.errorBackoff.next(backoffId)
@@ -544,10 +541,11 @@ func parseMachineType(machineTypeUrl string) string {
544541
return machineType
545542
}
546543

547-
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
544+
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error, string) {
545+
diskToPublish := ""
548546
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
549547
if err != nil {
550-
return nil, err
548+
return nil, err, diskToPublish
551549
}
552550

553551
volumeID := req.GetVolumeId()
@@ -562,35 +560,36 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
562560
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
563561
if err != nil {
564562
if gce.IsGCENotFoundError(err) {
565-
return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error())
563+
return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error()), diskToPublish
566564
}
567-
return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err)
565+
return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err), diskToPublish
568566
}
569567

570568
// Acquires the lock for the volume on that node only, because we need to support the ability
571569
// to publish the same volume onto different nodes concurrently
572570
lockingVolumeID := fmt.Sprintf("%s/%s", nodeID, volumeID)
573571
if acquired := gceCS.volumeLocks.TryAcquire(lockingVolumeID); !acquired {
574-
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID)
572+
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID), diskToPublish
575573
}
576574
defer gceCS.volumeLocks.Release(lockingVolumeID)
577-
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
575+
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
576+
diskToPublish = metrics.GetDiskType(disk)
578577
if err != nil {
579578
if gce.IsGCENotFoundError(err) {
580-
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error())
579+
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error()), diskToPublish
581580
}
582-
return nil, status.Errorf(codes.Internal, "Failed to getDisk: %v", err.Error())
581+
return nil, status.Errorf(codes.Internal, "Failed to getDisk: %v", err.Error()), diskToPublish
583582
}
584583
instanceZone, instanceName, err := common.NodeIDToZoneAndName(nodeID)
585584
if err != nil {
586-
return nil, status.Errorf(codes.NotFound, "could not split nodeID: %v", err.Error())
585+
return nil, status.Errorf(codes.NotFound, "could not split nodeID: %v", err.Error()), diskToPublish
587586
}
588587
instance, err := gceCS.CloudProvider.GetInstanceOrError(ctx, instanceZone, instanceName)
589588
if err != nil {
590589
if gce.IsGCENotFoundError(err) {
591-
return nil, status.Errorf(codes.NotFound, "Could not find instance %v: %v", nodeID, err.Error())
590+
return nil, status.Errorf(codes.NotFound, "Could not find instance %v: %v", nodeID, err.Error()), diskToPublish
592591
}
593-
return nil, status.Errorf(codes.Internal, "Failed to get instance: %v", err.Error())
592+
return nil, status.Errorf(codes.Internal, "Failed to get instance: %v", err.Error()), diskToPublish
594593
}
595594

596595
readWrite := "READ_WRITE"
@@ -600,21 +599,21 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
600599

601600
deviceName, err := common.GetDeviceName(volKey)
602601
if err != nil {
603-
return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error())
602+
return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error()), diskToPublish
604603
}
605604

606605
attached, err := diskIsAttachedAndCompatible(deviceName, instance, volumeCapability, readWrite)
607606
if err != nil {
608-
return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error())
607+
return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error()), diskToPublish
609608
}
610609
if attached {
611610
// Volume is attached to node. Success!
612611
klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v, already attached.", volKey, nodeID)
613-
return pubVolResp, nil
612+
return pubVolResp, nil, diskToPublish
614613
}
615614
instanceZone, instanceName, err = common.NodeIDToZoneAndName(nodeID)
616615
if err != nil {
617-
return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error())
616+
return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()), diskToPublish
618617
}
619618
err = gceCS.CloudProvider.AttachDisk(ctx, project, volKey, readWrite, attachableDiskTypePersistent, instanceZone, instanceName)
620619
if err != nil {
@@ -623,18 +622,18 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
623622
// If we encountered an UnsupportedDiskError, rewrite the error message to be more user friendly.
624623
// The error message from GCE is phrased around disk create on VM creation, not runtime attach.
625624
machineType := parseMachineType(instance.MachineType)
626-
return nil, status.Errorf(codes.InvalidArgument, "'%s' is not a compatible disk type with the machine type %s, please review the GCP online documentation for available persistent disk options", udErr.DiskType, machineType)
625+
return nil, status.Errorf(codes.InvalidArgument, "'%s' is not a compatible disk type with the machine type %s, please review the GCP online documentation for available persistent disk options", udErr.DiskType, machineType), diskToPublish
627626
}
628-
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
627+
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error()), diskToPublish
629628
}
630629

631630
err = gceCS.CloudProvider.WaitForAttach(ctx, project, volKey, instanceZone, instanceName)
632631
if err != nil {
633-
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error())
632+
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error()), diskToPublish
634633
}
635634

636635
klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v", volKey, nodeID)
637-
return pubVolResp, nil
636+
return pubVolResp, nil, diskToPublish
638637
}
639638

640639
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
@@ -649,14 +648,13 @@ func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context,
649648
if err != nil {
650649
return nil, err
651650
}
652-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
653-
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
654651
// Only valid requests will be queued
655652
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
656653
if gceCS.errorBackoff.blocking(backoffId) {
657654
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
658655
}
659-
656+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
657+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
660658
resp, err := gceCS.executeControllerUnpublishVolume(ctx, req)
661659
if err != nil {
662660
klog.Infof("For node %s adding backoff due to error for volume %s", req.NodeId, req.VolumeId)
@@ -1257,15 +1255,15 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
12571255
if err != nil {
12581256
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
12591257
}
1260-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1261-
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12621258
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
12631259
if err != nil {
12641260
if gce.IsGCENotFoundError(err) {
12651261
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
12661262
}
12671263
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
12681264
}
1265+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1266+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12691267
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
12701268
if err != nil {
12711269
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)

0 commit comments

Comments
 (0)