Skip to content

Commit 7713644

Browse files
committed
Add unit test for ext4 and block node resize
1 parent 7b8a1ca commit 7713644

File tree

3 files changed

+112
-8
lines changed

3 files changed

+112
-8
lines changed

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

+6-4
Original file line numberDiff line numberDiff line change
@@ -388,15 +388,17 @@ func (ns *GCENodeServer) NodeExpandVolume(ctx context.Context, req *csi.NodeExpa
388388
}
389389

390390
resizer := resizefs.NewResizeFs(ns.Mounter)
391-
_, err = resizer.Resize(devicePath, "")
391+
resized, err := resizer.Resize(devicePath, "")
392392
if err != nil {
393393
return nil, status.Error(codes.Internal, fmt.Sprintf("Error when resizing volume %s: %v", volKey.String(), err))
394394

395395
}
396396

397-
return &csi.NodeExpandVolumeResponse{
398-
CapacityBytes: reqBytes,
399-
}, nil
397+
resp := &csi.NodeExpandVolumeResponse{}
398+
if resized {
399+
resp.CapacityBytes = reqBytes
400+
}
401+
return resp, nil
400402
}
401403

402404
func (ns *GCENodeServer) GetVolumeLimits() (int64, error) {

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

+95-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ limitations under the License.
1515
package gceGCEDriver
1616

1717
import (
18+
"errors"
19+
"fmt"
1820
"testing"
1921

2022
"context"
23+
2124
csi "github.com/container-storage-interface/spec/lib/go/csi"
2225
"google.golang.org/grpc/codes"
2326
"google.golang.org/grpc/status"
27+
"k8s.io/kubernetes/pkg/util/mount"
28+
utilexec "k8s.io/utils/exec"
2429
metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata"
2530
mountmanager "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/mount-manager"
2631
)
@@ -30,8 +35,16 @@ const defaultTargetPath = "/mnt/test"
3035
const defaultStagingPath = "/staging"
3136

3237
func getTestGCEDriver(t *testing.T) *GCEDriver {
38+
return getCustomTestGCEDriver(t, mountmanager.NewFakeSafeMounter(), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService())
39+
}
40+
41+
func getTestGCEDriverWithCustomMounter(t *testing.T, mounter *mount.SafeFormatAndMount) *GCEDriver {
42+
return getCustomTestGCEDriver(t, mounter, mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService())
43+
}
44+
45+
func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils, metaService metadataservice.MetadataService) *GCEDriver {
3346
gceDriver := GetGCEDriver()
34-
err := gceDriver.SetupGCEDriver(nil, mountmanager.NewFakeSafeMounter(), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), driver, "test-vendor")
47+
err := gceDriver.SetupGCEDriver(nil, mounter, deviceUtils, metaService, driver, "test-vendor")
3548
if err != nil {
3649
t.Fatalf("Failed to setup GCE Driver: %v", err)
3750
}
@@ -328,6 +341,87 @@ func TestNodeStageVolume(t *testing.T) {
328341
}
329342
}
330343

344+
func TestNodeExpandVolume(t *testing.T) {
345+
// TODO: Add tests/functionality for non-existant volume
346+
var resizedBytes int64 = 2000000000
347+
volumeID := "project/test001/zones/c1/disks/testDisk"
348+
testCases := []struct {
349+
name string
350+
req *csi.NodeExpandVolumeRequest
351+
blockDevice bool
352+
expRespBytes int64
353+
expErrCode codes.Code
354+
}{
355+
{
356+
name: "ext4 fs expand",
357+
req: &csi.NodeExpandVolumeRequest{
358+
VolumeId: volumeID,
359+
VolumePath: "some-path",
360+
CapacityRange: &csi.CapacityRange{
361+
RequiredBytes: resizedBytes,
362+
},
363+
},
364+
blockDevice: false,
365+
expRespBytes: resizedBytes,
366+
},
367+
{
368+
name: "block device expand",
369+
req: &csi.NodeExpandVolumeRequest{
370+
VolumeId: volumeID,
371+
VolumePath: "some-path",
372+
CapacityRange: &csi.CapacityRange{
373+
RequiredBytes: resizedBytes,
374+
},
375+
},
376+
blockDevice: true,
377+
},
378+
}
379+
for _, tc := range testCases {
380+
t.Logf("Test case: %s", tc.name)
381+
382+
execCallback := func(cmd string, args ...string) ([]byte, error) {
383+
if cmd == "blkid" {
384+
if tc.blockDevice {
385+
// blkid returns exit code 2 when run on unformatted device
386+
return nil, utilexec.CodeExitError{
387+
Err: errors.New("this is an exit error"),
388+
Code: 2,
389+
}
390+
} else {
391+
return []byte("DEVNAME=/dev/sdb\nTYPE=ext4"), nil
392+
}
393+
} else if cmd == "resize2fs" {
394+
if tc.blockDevice {
395+
t.Fatalf("resize fs called on block device")
396+
}
397+
return nil, nil
398+
}
399+
return nil, fmt.Errorf("fake exec got unknown call to %v %v", cmd, args)
400+
}
401+
mounter := mountmanager.NewFakeSafeMounterWithCustomExec(mount.NewFakeExec(execCallback))
402+
gceDriver := getTestGCEDriverWithCustomMounter(t, mounter)
403+
404+
resp, err := gceDriver.ns.NodeExpandVolume(context.Background(), tc.req)
405+
if err != nil {
406+
serverError, ok := status.FromError(err)
407+
if !ok {
408+
t.Fatalf("Could not get error status code from err: %v", err)
409+
}
410+
if serverError.Code() != tc.expErrCode {
411+
t.Fatalf("Expected error code: %v, got: %v. err : %v", tc.expErrCode, serverError.Code(), err)
412+
}
413+
continue
414+
}
415+
if tc.expErrCode != codes.OK {
416+
t.Fatalf("Expected error: %v, got no error", tc.expErrCode)
417+
}
418+
419+
if resp.CapacityBytes != tc.expRespBytes {
420+
t.Fatalf("Expected bytes: %v, got: %v", tc.expRespBytes, resp.CapacityBytes)
421+
}
422+
}
423+
}
424+
331425
func TestNodeUnstageVolume(t *testing.T) {
332426
gceDriver := getTestGCEDriver(t)
333427
ns := gceDriver.ns

pkg/mount-manager/fake-safe-mounter.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,18 @@ func execCallback(cmd string, args ...string) ([]byte, error) {
4444
}
4545

4646
func NewFakeSafeMounter() *mount.SafeFormatAndMount {
47+
return NewCustomFakeSafeMounter(fakeMounter, fakeExec)
48+
}
49+
50+
func NewFakeSafeMounterWithCustomExec(exec mount.Exec) *mount.SafeFormatAndMount {
51+
fakeMounter := &mount.FakeMounter{MountPoints: []mount.MountPoint{}, Log: []mount.FakeAction{}}
52+
return NewCustomFakeSafeMounter(fakeMounter, exec)
53+
}
54+
55+
func NewCustomFakeSafeMounter(mounter mount.Interface, exec mount.Exec) *mount.SafeFormatAndMount {
4756
return &mount.SafeFormatAndMount{
48-
Interface: fakeMounter,
49-
Exec: fakeExec,
57+
Interface: mounter,
58+
Exec: exec,
5059
}
5160
}
5261

@@ -84,6 +93,5 @@ func NewFakeSafeBlockingMounter(mountToRun chan MountSourceAndTarget, readyToMou
8493
}
8594
return &mount.SafeFormatAndMount{
8695
Interface: fakeBlockingMounter,
87-
Exec: fakeExec,
8896
}
8997
}

0 commit comments

Comments
 (0)