Skip to content

Commit b41cab6

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

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
@@ -177,6 +177,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
177177
// Apply Parameters (case-insensitive). We leave validation of
178178
// the values to the cloud provider.
179179
params, err := common.ExtractAndDefaultParameters(req.GetParameters(), gceCS.Driver.name, gceCS.Driver.extraVolumeLabels)
180+
diskTypeForMetric = params.DiskType
180181
if err != nil {
181182
return nil, status.Errorf(codes.InvalidArgument, "failed to extract parameters: %v", err.Error())
182183
}
@@ -280,7 +281,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
280281

281282
// Verify that the volume in VolumeContentSource exists.
282283
diskFromSourceVolume, err := gceCS.CloudProvider.GetDisk(ctx, project, sourceVolKey, gceAPIVersion)
283-
diskTypeForMetric = metrics.GetDiskType(diskFromSourceVolume)
284284
if err != nil {
285285
if gce.IsGCEError(err, "notFound") {
286286
return nil, status.Errorf(codes.NotFound, "CreateVolume source volume %s does not exist", volumeContentSourceVolumeID)
@@ -337,7 +337,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
337337

338338
// Create the disk
339339
var disk *gce.CloudDisk
340-
diskTypeForMetric = params.DiskType
341340
switch params.ReplicationType {
342341
case replicationTypeNone:
343342
if len(zones) != 1 {
@@ -395,8 +394,6 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
395394
}
396395

397396
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
398-
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
399-
diskTypeForMetric = metrics.GetDiskType(disk)
400397
if err != nil {
401398
if gce.IsGCENotFoundError(err) {
402399
klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error())
@@ -409,7 +406,8 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
409406
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID)
410407
}
411408
defer gceCS.volumeLocks.Release(volumeID)
412-
409+
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
410+
diskTypeForMetric = metrics.GetDiskType(disk)
413411
err = gceCS.CloudProvider.DeleteDisk(ctx, project, volKey)
414412
if err != nil {
415413
return nil, common.LoggedError("Failed to delete disk: ", err)
@@ -428,18 +426,17 @@ func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, r
428426
}
429427
}()
430428
// Only valid requests will be accepted
431-
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
429+
_, _, err = gceCS.validateControllerPublishVolumeRequest(ctx, req)
432430
if err != nil {
433431
return nil, err
434432
}
435-
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
436-
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
433+
437434
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
438435
if gceCS.errorBackoff.blocking(backoffId) {
439436
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
440437
}
441438

442-
resp, err := gceCS.executeControllerPublishVolume(ctx, req)
439+
resp, err, diskTypeForMetric := gceCS.executeControllerPublishVolume(ctx, req)
443440
if err != nil {
444441
klog.Infof("For node %s adding backoff due to error for volume %s: %v", req.NodeId, req.VolumeId, err.Error())
445442
gceCS.errorBackoff.next(backoffId)
@@ -487,10 +484,11 @@ func parseMachineType(machineTypeUrl string) string {
487484
return machineType
488485
}
489486

490-
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
487+
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error, string) {
488+
diskToPublish := ""
491489
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
492490
if err != nil {
493-
return nil, err
491+
return nil, err, diskToPublish
494492
}
495493

496494
volumeID := req.GetVolumeId()
@@ -505,35 +503,36 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
505503
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
506504
if err != nil {
507505
if gce.IsGCENotFoundError(err) {
508-
return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error())
506+
return nil, status.Errorf(codes.NotFound, "ControllerPublishVolume could not find volume with ID %v: %v", volumeID, err.Error()), diskToPublish
509507
}
510-
return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err)
508+
return nil, common.LoggedError("ControllerPublishVolume error repairing underspecified volume key: ", err), diskToPublish
511509
}
512510

513511
// Acquires the lock for the volume on that node only, because we need to support the ability
514512
// to publish the same volume onto different nodes concurrently
515513
lockingVolumeID := fmt.Sprintf("%s/%s", nodeID, volumeID)
516514
if acquired := gceCS.volumeLocks.TryAcquire(lockingVolumeID); !acquired {
517-
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID)
515+
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID), diskToPublish
518516
}
519517
defer gceCS.volumeLocks.Release(lockingVolumeID)
520-
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
518+
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
519+
diskToPublish = metrics.GetDiskType(disk)
521520
if err != nil {
522521
if gce.IsGCENotFoundError(err) {
523-
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error())
522+
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error()), diskToPublish
524523
}
525-
return nil, status.Errorf(codes.Internal, "Failed to getDisk: %v", err.Error())
524+
return nil, status.Errorf(codes.Internal, "Failed to getDisk: %v", err.Error()), diskToPublish
526525
}
527526
instanceZone, instanceName, err := common.NodeIDToZoneAndName(nodeID)
528527
if err != nil {
529-
return nil, status.Errorf(codes.NotFound, "could not split nodeID: %v", err.Error())
528+
return nil, status.Errorf(codes.NotFound, "could not split nodeID: %v", err.Error()), diskToPublish
530529
}
531530
instance, err := gceCS.CloudProvider.GetInstanceOrError(ctx, instanceZone, instanceName)
532531
if err != nil {
533532
if gce.IsGCENotFoundError(err) {
534-
return nil, status.Errorf(codes.NotFound, "Could not find instance %v: %v", nodeID, err.Error())
533+
return nil, status.Errorf(codes.NotFound, "Could not find instance %v: %v", nodeID, err.Error()), diskToPublish
535534
}
536-
return nil, status.Errorf(codes.Internal, "Failed to get instance: %v", err.Error())
535+
return nil, status.Errorf(codes.Internal, "Failed to get instance: %v", err.Error()), diskToPublish
537536
}
538537

539538
readWrite := "READ_WRITE"
@@ -543,21 +542,21 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
543542

544543
deviceName, err := common.GetDeviceName(volKey)
545544
if err != nil {
546-
return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error())
545+
return nil, status.Errorf(codes.Internal, "error getting device name: %v", err.Error()), diskToPublish
547546
}
548547

549548
attached, err := diskIsAttachedAndCompatible(deviceName, instance, volumeCapability, readWrite)
550549
if err != nil {
551-
return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error())
550+
return nil, status.Errorf(codes.AlreadyExists, "Disk %v already published to node %v but incompatible: %v", volKey.Name, nodeID, err.Error()), diskToPublish
552551
}
553552
if attached {
554553
// Volume is attached to node. Success!
555554
klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v, already attached.", volKey, nodeID)
556-
return pubVolResp, nil
555+
return pubVolResp, nil, diskToPublish
557556
}
558557
instanceZone, instanceName, err = common.NodeIDToZoneAndName(nodeID)
559558
if err != nil {
560-
return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error())
559+
return nil, status.Errorf(codes.InvalidArgument, "could not split nodeID: %v", err.Error()), diskToPublish
561560
}
562561
err = gceCS.CloudProvider.AttachDisk(ctx, project, volKey, readWrite, attachableDiskTypePersistent, instanceZone, instanceName)
563562
if err != nil {
@@ -566,18 +565,18 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
566565
// If we encountered an UnsupportedDiskError, rewrite the error message to be more user friendly.
567566
// The error message from GCE is phrased around disk create on VM creation, not runtime attach.
568567
machineType := parseMachineType(instance.MachineType)
569-
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)
568+
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
570569
}
571-
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
570+
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error()), diskToPublish
572571
}
573572

574573
err = gceCS.CloudProvider.WaitForAttach(ctx, project, volKey, instanceZone, instanceName)
575574
if err != nil {
576-
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error())
575+
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error()), diskToPublish
577576
}
578577

579578
klog.V(4).Infof("ControllerPublishVolume succeeded for disk %v to instance %v", volKey, nodeID)
580-
return pubVolResp, nil
579+
return pubVolResp, nil, diskToPublish
581580
}
582581

583582
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
@@ -592,14 +591,13 @@ func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context,
592591
if err != nil {
593592
return nil, err
594593
}
595-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
596-
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
597594
// Only valid requests will be queued
598595
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
599596
if gceCS.errorBackoff.blocking(backoffId) {
600597
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
601598
}
602-
599+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
600+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
603601
resp, err := gceCS.executeControllerUnpublishVolume(ctx, req)
604602
if err != nil {
605603
klog.Infof("For node %s adding backoff due to error for volume %s", req.NodeId, req.VolumeId)
@@ -1200,15 +1198,15 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
12001198
if err != nil {
12011199
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
12021200
}
1203-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1204-
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12051201
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
12061202
if err != nil {
12071203
if gce.IsGCENotFoundError(err) {
12081204
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
12091205
}
12101206
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
12111207
}
1208+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1209+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12121210
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
12131211
if err != nil {
12141212
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)

0 commit comments

Comments
 (0)