Skip to content

Commit fd15fe1

Browse files
Sneha-atsunnylovestiramisu
authored andcommitted
Refactoring GetDisk calls based on comments
1 parent a0d0a27 commit fd15fe1

File tree

1 file changed

+31
-33
lines changed

1 file changed

+31
-33
lines changed

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

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

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

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

453452
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
454-
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
455-
diskTypeForMetric = metrics.GetDiskType(disk)
456453
if err != nil {
457454
if gce.IsGCENotFoundError(err) {
458455
klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error())
@@ -465,7 +462,8 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
465462
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID)
466463
}
467464
defer gceCS.volumeLocks.Release(volumeID)
468-
465+
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
466+
diskTypeForMetric = metrics.GetDiskType(disk)
469467
err = gceCS.CloudProvider.DeleteDisk(ctx, project, volKey)
470468
if err != nil {
471469
return nil, common.LoggedError("Failed to delete disk: ", err)
@@ -484,18 +482,17 @@ func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, r
484482
}
485483
}()
486484
// Only valid requests will be accepted
487-
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
485+
_, _, err = gceCS.validateControllerPublishVolumeRequest(ctx, req)
488486
if err != nil {
489487
return nil, err
490488
}
491-
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
492-
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
489+
493490
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
494491
if gceCS.errorBackoff.blocking(backoffId) {
495492
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
496493
}
497494

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

546-
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
543+
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error, string) {
544+
diskToPublish := ""
547545
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
548546
if err != nil {
549-
return nil, err
547+
return nil, err, diskToPublish
550548
}
551549

552550
volumeID := req.GetVolumeId()
@@ -561,35 +559,36 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
561559
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
562560
if err != nil {
563561
if gce.IsGCENotFoundError(err) {
564-
return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error())
562+
return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error()), diskToPublish
565563
}
566-
return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err)
564+
return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err), diskToPublish
567565
}
568566

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

595594
readWrite := "READ_WRITE"
@@ -599,21 +598,21 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
599598

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

605604
attached, err := diskIsAttachedAndCompatible(deviceName, instance, volumeCapability, readWrite)
606605
if err != nil {
607-
return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error())
606+
return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error()), diskToPublish
608607
}
609608
if attached {
610609
// Volume is attached to node. Success!
611610
klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v, already attached.", volKey, nodeID)
612-
return pubVolResp, nil
611+
return pubVolResp, nil, diskToPublish
613612
}
614613
instanceZone, instanceName, err = common.NodeIDToZoneAndName(nodeID)
615614
if err != nil {
616-
return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error())
615+
return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()), diskToPublish
617616
}
618617
err = gceCS.CloudProvider.AttachDisk(ctx, project, volKey, readWrite, attachableDiskTypePersistent, instanceZone, instanceName)
619618
if err != nil {
@@ -622,18 +621,18 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
622621
// If we encountered an UnsupportedDiskError, rewrite the error message to be more user friendly.
623622
// The error message from GCE is phrased around disk create on VM creation, not runtime attach.
624623
machineType := parseMachineType(instance.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)
624+
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
626625
}
627-
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
626+
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error()), diskToPublish
628627
}
629628

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

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

639638
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
@@ -648,14 +647,13 @@ func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context,
648647
if err != nil {
649648
return nil, err
650649
}
651-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
652-
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
653650
// Only valid requests will be queued
654651
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
655652
if gceCS.errorBackoff.blocking(backoffId) {
656653
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
657654
}
658-
655+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
656+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
659657
resp, err := gceCS.executeControllerUnpublishVolume(ctx, req)
660658
if err != nil {
661659
klog.Infof("For node %s adding backoff due to error for volume %s", req.NodeId, req.VolumeId)
@@ -1255,15 +1253,15 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
12551253
if err != nil {
12561254
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
12571255
}
1258-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1259-
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12601256
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
12611257
if err != nil {
12621258
if gce.IsGCENotFoundError(err) {
12631259
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
12641260
}
12651261
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
12661262
}
1263+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1264+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12671265
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
12681266
if err != nil {
12691267
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)

0 commit comments

Comments
 (0)