Skip to content

Commit 82c6deb

Browse files
authored
Merge pull request #1718 from hungnguyen243/master
Improve error messages for ControllerExpandVolume / CreateSnapshot of multi-zone PV.
2 parents f3f566e + 6a7146b commit 82c6deb

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

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

+14
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,11 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C
11601160
return nil, status.Errorf(codes.InvalidArgument, "CreateSnapshot Volume ID is invalid: %v", err.Error())
11611161
}
11621162

1163+
volumeIsMultiZone := isMultiZoneVolKey(volKey)
1164+
if gceCS.multiZoneVolumeHandleConfig.Enable && volumeIsMultiZone {
1165+
return nil, status.Errorf(codes.InvalidArgument, "CreateSnapshot for volume %v failed. Snapshots are not supported with the multi-zone PV volumeHandle feature", volumeID)
1166+
}
1167+
11631168
if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired {
11641169
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID)
11651170
}
@@ -1205,6 +1210,7 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
12051210
if err != nil {
12061211
return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey)
12071212
}
1213+
12081214
// Check if PD snapshot already exists
12091215
var snapshot *compute.Snapshot
12101216
snapshot, err = gceCS.CloudProvider.GetSnapshot(ctx, project, snapshotName)
@@ -1484,6 +1490,7 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li
14841490
}
14851491

14861492
func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) {
1493+
14871494
var err error
14881495
diskTypeForMetric := metrics.DefaultDiskTypeForMetric
14891496
enableConfidentialCompute := metrics.DefaultEnableConfidentialCompute
@@ -1506,12 +1513,19 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
15061513
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
15071514
}
15081515
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
1516+
15091517
if err != nil {
15101518
if gce.IsGCENotFoundError(err) {
15111519
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
15121520
}
15131521
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
15141522
}
1523+
1524+
volumeIsMultiZone := isMultiZoneVolKey(volKey)
1525+
if gceCS.multiZoneVolumeHandleConfig.Enable && volumeIsMultiZone {
1526+
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume is not supported with the multi-zone PVC volumeHandle feature. Please re-create the volume %v from source if you want a larger size", volumeID)
1527+
}
1528+
15151529
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
15161530
diskTypeForMetric, enableConfidentialCompute, enableStoragePools = metrics.GetMetricParameters(sourceDisk)
15171531
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)

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

+71
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,77 @@ func TestCreateSnapshotArguments(t *testing.T) {
255255
}
256256
}
257257

258+
func TestUnsupportedMultiZoneCreateSnapshot(t *testing.T) {
259+
testCase := struct {
260+
name string
261+
req *csi.CreateSnapshotRequest
262+
expErrCode codes.Code
263+
}{
264+
name: "failed create snapshot for multi-zone PV", // Example values
265+
req: &csi.CreateSnapshotRequest{
266+
Name: name,
267+
SourceVolumeId: multiZoneVolumeID,
268+
},
269+
expErrCode: codes.InvalidArgument,
270+
}
271+
272+
t.Logf("test case: %s", testCase.name)
273+
274+
gceDriver := initGCEDriver(t, nil)
275+
gceDriver.cs.multiZoneVolumeHandleConfig = MultiZoneVolumeHandleConfig{
276+
Enable: true,
277+
}
278+
279+
// Start Test
280+
_, err := gceDriver.cs.CreateSnapshot(context.Background(), testCase.req)
281+
if err != nil {
282+
serverError, ok := status.FromError(err)
283+
if !ok {
284+
t.Fatalf("Could not get error status code from err: %v", serverError)
285+
}
286+
if serverError.Code() != testCase.expErrCode {
287+
t.Fatalf("Expected error code: %v, got: %v. err : %v", testCase.expErrCode, serverError.Code(), err)
288+
}
289+
} else {
290+
t.Fatalf("Expected error: %v, got no error", testCase.expErrCode)
291+
}
292+
}
293+
294+
func TestUnsupportedMultiZoneControllerExpandVolume(t *testing.T) {
295+
testCase := struct {
296+
name string
297+
req *csi.ControllerExpandVolumeRequest
298+
expErrCode codes.Code
299+
}{
300+
name: "failed create snapshot for multi-zone PV", // Example values
301+
req: &csi.ControllerExpandVolumeRequest{
302+
VolumeId: multiZoneVolumeID,
303+
},
304+
expErrCode: codes.InvalidArgument,
305+
}
306+
307+
t.Logf("test case: %s", testCase.name)
308+
309+
gceDriver := initGCEDriver(t, nil)
310+
gceDriver.cs.multiZoneVolumeHandleConfig = MultiZoneVolumeHandleConfig{
311+
Enable: true,
312+
}
313+
314+
// Start Test
315+
_, err := gceDriver.cs.ControllerExpandVolume(context.Background(), testCase.req)
316+
if err != nil {
317+
serverError, ok := status.FromError(err)
318+
if !ok {
319+
t.Fatalf("Could not get error status code from err: %v", serverError)
320+
}
321+
if serverError.Code() != testCase.expErrCode {
322+
t.Fatalf("Expected error code: %v, got: %v. err : %v", testCase.expErrCode, serverError.Code(), err)
323+
}
324+
} else {
325+
t.Fatalf("Expected error: %v, got no error", testCase.expErrCode)
326+
}
327+
}
328+
258329
func TestDeleteSnapshot(t *testing.T) {
259330
testCases := []struct {
260331
name string

0 commit comments

Comments
 (0)