chore: fix ut

This commit is contained in:
andyzhangx 2024-11-23 03:04:36 +00:00
parent a9c4f7fd04
commit 86f7309499
4 changed files with 35 additions and 28 deletions

View File

@ -40,6 +40,7 @@ import (
// ControllerServer controller server setting // ControllerServer controller server setting
type ControllerServer struct { type ControllerServer struct {
Driver *Driver Driver *Driver
csi.UnimplementedControllerServer
} }
// nfsVolume is an internal representation of a volume // nfsVolume is an internal representation of a volume
@ -347,6 +348,10 @@ func (cs *ControllerServer) GetCapacity(_ context.Context, _ *csi.GetCapacityReq
return nil, status.Error(codes.Unimplemented, "") return nil, status.Error(codes.Unimplemented, "")
} }
func (d *Driver) ControllerModifyVolume(_ context.Context, _ *csi.ControllerModifyVolumeRequest) (*csi.ControllerModifyVolumeResponse, error) {
return nil, status.Error(codes.Unimplemented, "")
}
// ControllerGetCapabilities implements the default GRPC callout. // ControllerGetCapabilities implements the default GRPC callout.
// Default supports all capabilities // Default supports all capabilities
func (cs *ControllerServer) ControllerGetCapabilities(_ context.Context, _ *csi.ControllerGetCapabilitiesRequest) (*csi.ControllerGetCapabilitiesResponse, error) { func (cs *ControllerServer) ControllerGetCapabilities(_ context.Context, _ *csi.ControllerGetCapabilitiesRequest) (*csi.ControllerGetCapabilitiesResponse, error) {

View File

@ -26,6 +26,7 @@ import (
type IdentityServer struct { type IdentityServer struct {
Driver *Driver Driver *Driver
csi.UnimplementedIdentityServer
} }
func (ids *IdentityServer) GetPluginInfo(_ context.Context, _ *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) { func (ids *IdentityServer) GetPluginInfo(_ context.Context, _ *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) {

View File

@ -38,6 +38,7 @@ import (
type NodeServer struct { type NodeServer struct {
Driver *Driver Driver *Driver
mounter mount.Interface mounter mount.Interface
csi.UnimplementedNodeServer
} }
// NodePublishVolume mount the volume // NodePublishVolume mount the volume
@ -223,9 +224,9 @@ func (ns *NodeServer) NodeGetVolumeStats(_ context.Context, req *csi.NodeGetVolu
return nil, status.Errorf(codes.Internal, "%v", err) return nil, status.Errorf(codes.Internal, "%v", err)
} }
if cache != nil { if cache != nil {
resp := cache.(csi.NodeGetVolumeStatsResponse) resp := cache.(*csi.NodeGetVolumeStatsResponse)
klog.V(6).Infof("NodeGetVolumeStats: volume stats for volume %s path %s is cached", req.VolumeId, req.VolumePath) klog.V(6).Infof("NodeGetVolumeStats: volume stats for volume %s path %s is cached", req.VolumeId, req.VolumePath)
return &resp, nil return resp, nil
} }
if _, err := os.Lstat(req.VolumePath); err != nil { if _, err := os.Lstat(req.VolumePath); err != nil {
@ -284,7 +285,7 @@ func (ns *NodeServer) NodeGetVolumeStats(_ context.Context, req *csi.NodeGetVolu
} }
// cache the volume stats per volume // cache the volume stats per volume
ns.Driver.volStatsCache.Set(req.VolumeId, resp) ns.Driver.volStatsCache.Set(req.VolumeId, &resp)
return &resp, err return &resp, err
} }

View File

@ -74,24 +74,24 @@ func TestNodePublishVolume(t *testing.T) {
tests := []struct { tests := []struct {
desc string desc string
setup func() setup func()
req csi.NodePublishVolumeRequest req *csi.NodePublishVolumeRequest
skipOnWindows bool skipOnWindows bool
expectedErr error expectedErr error
cleanup func() cleanup func()
}{ }{
{ {
desc: "[Error] Volume capabilities missing", desc: "[Error] Volume capabilities missing",
req: csi.NodePublishVolumeRequest{}, req: &csi.NodePublishVolumeRequest{},
expectedErr: status.Error(codes.InvalidArgument, "Volume capability missing in request"), expectedErr: status.Error(codes.InvalidArgument, "Volume capability missing in request"),
}, },
{ {
desc: "[Error] Volume ID missing", desc: "[Error] Volume ID missing",
req: csi.NodePublishVolumeRequest{VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}}, req: &csi.NodePublishVolumeRequest{VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}},
expectedErr: status.Error(codes.InvalidArgument, "Volume ID missing in request"), expectedErr: status.Error(codes.InvalidArgument, "Volume ID missing in request"),
}, },
{ {
desc: "[Error] Target path missing", desc: "[Error] Target path missing",
req: csi.NodePublishVolumeRequest{VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, req: &csi.NodePublishVolumeRequest{VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1"}, VolumeId: "vol_1"},
expectedErr: status.Error(codes.InvalidArgument, "Target path not provided"), expectedErr: status.Error(codes.InvalidArgument, "Target path not provided"),
}, },
@ -100,7 +100,7 @@ func TestNodePublishVolume(t *testing.T) {
setup: func() { setup: func() {
ns.Driver.volumeLocks.TryAcquire(lockKey) ns.Driver.volumeLocks.TryAcquire(lockKey)
}, },
req: csi.NodePublishVolumeRequest{VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, req: &csi.NodePublishVolumeRequest{VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
VolumeContext: params, VolumeContext: params,
TargetPath: targetTest}, TargetPath: targetTest},
@ -111,7 +111,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Success] Stage target path missing", desc: "[Success] Stage target path missing",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: params, VolumeContext: params,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -120,7 +120,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Success] Valid request read only", desc: "[Success] Valid request read only",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: params, VolumeContext: params,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -130,7 +130,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Success] Valid request already mounted", desc: "[Success] Valid request already mounted",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: params, VolumeContext: params,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -140,7 +140,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Success] Valid request", desc: "[Success] Valid request",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: params, VolumeContext: params,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -150,7 +150,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Success] Valid request with pv/pvc metadata", desc: "[Success] Valid request with pv/pvc metadata",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: paramsWithMetadata, VolumeContext: paramsWithMetadata,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -160,7 +160,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Success] Valid request with 0 mountPermissions", desc: "[Success] Valid request with 0 mountPermissions",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: paramsWithZeroPermissions, VolumeContext: paramsWithZeroPermissions,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -170,7 +170,7 @@ func TestNodePublishVolume(t *testing.T) {
}, },
{ {
desc: "[Error] invalid mountPermissions", desc: "[Error] invalid mountPermissions",
req: csi.NodePublishVolumeRequest{ req: &csi.NodePublishVolumeRequest{
VolumeContext: invalidParams, VolumeContext: invalidParams,
VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap}, VolumeCapability: &csi.VolumeCapability{AccessMode: &volumeCap},
VolumeId: "vol_1", VolumeId: "vol_1",
@ -188,7 +188,7 @@ func TestNodePublishVolume(t *testing.T) {
if tc.setup != nil { if tc.setup != nil {
tc.setup() tc.setup()
} }
_, err := ns.NodePublishVolume(context.Background(), &tc.req) _, err := ns.NodePublishVolume(context.Background(), tc.req)
if !reflect.DeepEqual(err, tc.expectedErr) { if !reflect.DeepEqual(err, tc.expectedErr) {
t.Errorf("Desc:%v\nUnexpected error: %v\nExpected: %v", tc.desc, err, tc.expectedErr) t.Errorf("Desc:%v\nUnexpected error: %v\nExpected: %v", tc.desc, err, tc.expectedErr)
} }
@ -219,30 +219,30 @@ func TestNodeUnpublishVolume(t *testing.T) {
tests := []struct { tests := []struct {
desc string desc string
setup func() setup func()
req csi.NodeUnpublishVolumeRequest req *csi.NodeUnpublishVolumeRequest
expectedErr error expectedErr error
cleanup func() cleanup func()
}{ }{
{ {
desc: "[Error] Volume ID missing", desc: "[Error] Volume ID missing",
req: csi.NodeUnpublishVolumeRequest{TargetPath: targetTest}, req: &csi.NodeUnpublishVolumeRequest{TargetPath: targetTest},
expectedErr: status.Error(codes.InvalidArgument, "Volume ID missing in request"), expectedErr: status.Error(codes.InvalidArgument, "Volume ID missing in request"),
}, },
{ {
desc: "[Error] Target missing", desc: "[Error] Target missing",
req: csi.NodeUnpublishVolumeRequest{VolumeId: "vol_1"}, req: &csi.NodeUnpublishVolumeRequest{VolumeId: "vol_1"},
expectedErr: status.Error(codes.InvalidArgument, "Target path missing in request"), expectedErr: status.Error(codes.InvalidArgument, "Target path missing in request"),
}, },
{ {
desc: "[Success] Volume not mounted", desc: "[Success] Volume not mounted",
req: csi.NodeUnpublishVolumeRequest{TargetPath: targetFile, VolumeId: "vol_1"}, req: &csi.NodeUnpublishVolumeRequest{TargetPath: targetFile, VolumeId: "vol_1"},
}, },
{ {
desc: "[Error] Volume operation in progress", desc: "[Error] Volume operation in progress",
setup: func() { setup: func() {
ns.Driver.volumeLocks.TryAcquire(lockKey) ns.Driver.volumeLocks.TryAcquire(lockKey)
}, },
req: csi.NodeUnpublishVolumeRequest{TargetPath: targetTest, VolumeId: "vol_1"}, req: &csi.NodeUnpublishVolumeRequest{TargetPath: targetTest, VolumeId: "vol_1"},
expectedErr: status.Error(codes.Aborted, fmt.Sprintf(volumeOperationAlreadyExistsFmt, "vol_1")), expectedErr: status.Error(codes.Aborted, fmt.Sprintf(volumeOperationAlreadyExistsFmt, "vol_1")),
cleanup: func() { cleanup: func() {
ns.Driver.volumeLocks.Release(lockKey) ns.Driver.volumeLocks.Release(lockKey)
@ -257,7 +257,7 @@ func TestNodeUnpublishVolume(t *testing.T) {
if tc.setup != nil { if tc.setup != nil {
tc.setup() tc.setup()
} }
_, err := ns.NodeUnpublishVolume(context.Background(), &tc.req) _, err := ns.NodeUnpublishVolume(context.Background(), tc.req)
if !reflect.DeepEqual(err, tc.expectedErr) { if !reflect.DeepEqual(err, tc.expectedErr) {
if err == nil || tc.expectedErr == nil || !strings.Contains(err.Error(), tc.expectedErr.Error()) { if err == nil || tc.expectedErr == nil || !strings.Contains(err.Error(), tc.expectedErr.Error()) {
t.Errorf("Desc:%v\nUnexpected error: %v\nExpected: %v", tc.desc, err, tc.expectedErr) t.Errorf("Desc:%v\nUnexpected error: %v\nExpected: %v", tc.desc, err, tc.expectedErr)
@ -329,27 +329,27 @@ func TestNodeGetVolumeStats(t *testing.T) {
tests := []struct { tests := []struct {
desc string desc string
req csi.NodeGetVolumeStatsRequest req *csi.NodeGetVolumeStatsRequest
expectedErr error expectedErr error
}{ }{
{ {
desc: "[Error] Volume ID missing", desc: "[Error] Volume ID missing",
req: csi.NodeGetVolumeStatsRequest{VolumePath: targetTest}, req: &csi.NodeGetVolumeStatsRequest{VolumePath: targetTest},
expectedErr: status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume ID was empty"), expectedErr: status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume ID was empty"),
}, },
{ {
desc: "[Error] VolumePath missing", desc: "[Error] VolumePath missing",
req: csi.NodeGetVolumeStatsRequest{VolumeId: "vol_1"}, req: &csi.NodeGetVolumeStatsRequest{VolumeId: "vol_1"},
expectedErr: status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume path was empty"), expectedErr: status.Error(codes.InvalidArgument, "NodeGetVolumeStats volume path was empty"),
}, },
{ {
desc: "[Error] Incorrect volume path", desc: "[Error] Incorrect volume path",
req: csi.NodeGetVolumeStatsRequest{VolumePath: nonexistedPath, VolumeId: "vol_1"}, req: &csi.NodeGetVolumeStatsRequest{VolumePath: nonexistedPath, VolumeId: "vol_1"},
expectedErr: status.Errorf(codes.NotFound, "path /not/a/real/directory does not exist"), expectedErr: status.Errorf(codes.NotFound, "path /not/a/real/directory does not exist"),
}, },
{ {
desc: "[Success] Standard success", desc: "[Success] Standard success",
req: csi.NodeGetVolumeStatsRequest{VolumePath: fakePath, VolumeId: "vol_1"}, req: &csi.NodeGetVolumeStatsRequest{VolumePath: fakePath, VolumeId: "vol_1"},
expectedErr: nil, expectedErr: nil,
}, },
} }
@ -362,7 +362,7 @@ func TestNodeGetVolumeStats(t *testing.T) {
} }
for _, test := range tests { for _, test := range tests {
_, err := ns.NodeGetVolumeStats(context.Background(), &test.req) _, err := ns.NodeGetVolumeStats(context.Background(), test.req)
if !reflect.DeepEqual(err, test.expectedErr) { if !reflect.DeepEqual(err, test.expectedErr) {
t.Errorf("desc: %v, expected error: %v, actual error: %v", test.desc, test.expectedErr, err) t.Errorf("desc: %v, expected error: %v, actual error: %v", test.desc, test.expectedErr, err)
} }