Skip to content

Commit f3eb9f7

Browse files
committed
Add tests for capabilities
1 parent e0df338 commit f3eb9f7

File tree

2 files changed

+153
-22
lines changed

2 files changed

+153
-22
lines changed

pkg/controller/controller_test.go

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ func TestController(t *testing.T) {
2828
PVC *v1.PersistentVolumeClaim
2929
PV *v1.PersistentVolume
3030

31-
CreateObjects bool
32-
NodeResize bool
33-
CallCSIExpand bool
34-
blockVolume bool
31+
CreateObjects bool
32+
NodeResize bool
33+
CallCSIExpand bool
34+
expectBlockVolume bool
3535
}{
3636
{
3737
Name: "Invalid key",
@@ -89,13 +89,13 @@ func TestController(t *testing.T) {
8989
CallCSIExpand: true,
9090
},
9191
{
92-
Name: "Block Resize PVC with FS resize",
93-
PVC: createPVC(2, 1),
94-
PV: createPV(1, "testPVC", "test", "foobar", &blockVolumeMode),
95-
CreateObjects: true,
96-
NodeResize: true,
97-
CallCSIExpand: true,
98-
blockVolume: true,
92+
Name: "Block Resize PVC with FS resize",
93+
PVC: createPVC(2, 1),
94+
PV: createPV(1, "testPVC", "test", "foobar", &blockVolumeMode),
95+
CreateObjects: true,
96+
NodeResize: true,
97+
CallCSIExpand: true,
98+
expectBlockVolume: true,
9999
},
100100
} {
101101
client := csi.NewMockClient("mock", test.NodeResize, true, true)
@@ -150,17 +150,14 @@ func TestController(t *testing.T) {
150150
t.Fatalf("for %s: expected no csi expand call, received csi expansion request", test.Name)
151151
}
152152

153-
if test.CallCSIExpand {
154-
usedCapability := client.GetCapability()
155-
if test.blockVolume {
156-
if usedCapability.GetBlock() == nil {
157-
t.Errorf("For %s: expected block accesstype got: %v", test.Name, usedCapability)
158-
}
159-
} else {
160-
if usedCapability.GetMount() == nil {
161-
t.Errorf("For %s: expected mount accesstype got: %v", test.Name, usedCapability)
162-
}
163-
}
153+
usedCapability := client.GetCapability()
154+
155+
if test.CallCSIExpand && test.expectBlockVolume && usedCapability.GetBlock() == nil {
156+
t.Errorf("For %s: expected block accesstype got: %v", test.Name, usedCapability)
157+
}
158+
159+
if test.CallCSIExpand && !test.expectBlockVolume && usedCapability.GetMount() == nil {
160+
t.Errorf("For %s: expected mount accesstype got: %v", test.Name, usedCapability)
164161
}
165162
}
166163
}

pkg/resizer/csi_resizer_test.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package resizer
33
import (
44
"errors"
55
"fmt"
6+
"reflect"
67
"testing"
78
"time"
89

10+
csilib "github.com/container-storage-interface/spec/lib/go/csi"
911
"github.com/kubernetes-csi/csi-lib-utils/metrics"
1012
"github.com/kubernetes-csi/external-resizer/pkg/csi"
1113
"github.com/kubernetes-csi/external-resizer/pkg/util"
@@ -187,6 +189,138 @@ func TestResizeMigratedPV(t *testing.T) {
187189
}
188190
}
189191

192+
func TestGetVolumeCapabilities(t *testing.T) {
193+
blockVolumeMode := v1.PersistentVolumeMode(v1.PersistentVolumeBlock)
194+
filesystemVolumeMode := v1.PersistentVolumeMode(v1.PersistentVolumeFilesystem)
195+
196+
tests := []struct {
197+
name string
198+
volumeMode *v1.PersistentVolumeMode
199+
fsType string
200+
modes []v1.PersistentVolumeAccessMode
201+
mountOptions []string
202+
expectedCapability *csilib.VolumeCapability
203+
expectError bool
204+
}{
205+
{
206+
name: "RWX",
207+
volumeMode: &filesystemVolumeMode,
208+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
209+
expectedCapability: createMountCapability(defaultFSType, csilib.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER, nil),
210+
expectError: false,
211+
},
212+
{
213+
name: "Block RWX",
214+
volumeMode: &blockVolumeMode,
215+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
216+
expectedCapability: createBlockCapability(csilib.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER),
217+
expectError: false,
218+
},
219+
{
220+
name: "RWX + specified fsType",
221+
fsType: "ext3",
222+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
223+
expectedCapability: createMountCapability("ext3", csilib.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER, nil),
224+
expectError: false,
225+
},
226+
{
227+
name: "RWO",
228+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
229+
expectedCapability: createMountCapability(defaultFSType, csilib.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, nil),
230+
expectError: false,
231+
},
232+
{
233+
name: "Block RWO",
234+
volumeMode: &blockVolumeMode,
235+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
236+
expectedCapability: createBlockCapability(csilib.VolumeCapability_AccessMode_SINGLE_NODE_WRITER),
237+
expectError: false,
238+
},
239+
{
240+
name: "ROX",
241+
modes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany},
242+
expectedCapability: createMountCapability(defaultFSType, csilib.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY, nil),
243+
expectError: false,
244+
},
245+
{
246+
name: "RWX + anytyhing",
247+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany, v1.ReadOnlyMany, v1.ReadWriteOnce},
248+
expectedCapability: createMountCapability(defaultFSType, csilib.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER, nil),
249+
expectError: false,
250+
},
251+
{
252+
name: "mount options",
253+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
254+
expectedCapability: createMountCapability(defaultFSType, csilib.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER, []string{"first", "second"}),
255+
mountOptions: []string{"first", "second"},
256+
expectError: false,
257+
},
258+
{
259+
name: "ROX+RWO",
260+
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadOnlyMany},
261+
expectedCapability: nil,
262+
expectError: true, // not possible in CSI
263+
},
264+
{
265+
name: "nothing",
266+
modes: []v1.PersistentVolumeAccessMode{},
267+
expectedCapability: nil,
268+
expectError: true,
269+
},
270+
}
271+
272+
for _, test := range tests {
273+
pv := &v1.PersistentVolume{
274+
Spec: v1.PersistentVolumeSpec{
275+
VolumeMode: test.volumeMode,
276+
AccessModes: test.modes,
277+
MountOptions: test.mountOptions,
278+
PersistentVolumeSource: v1.PersistentVolumeSource{
279+
CSI: &v1.CSIPersistentVolumeSource{
280+
FSType: test.fsType,
281+
},
282+
},
283+
},
284+
}
285+
cap, err := GetVolumeCapabilities(pv.Spec)
286+
287+
if err == nil && test.expectError {
288+
t.Errorf("test %s: expected error, got none", test.name)
289+
}
290+
if err != nil && !test.expectError {
291+
t.Errorf("test %s: got error: %s", test.name, err)
292+
}
293+
if !test.expectError && !reflect.DeepEqual(cap, test.expectedCapability) {
294+
t.Errorf("test %s: unexpected VolumeCapability: %+v", test.name, cap)
295+
}
296+
}
297+
}
298+
299+
func createBlockCapability(mode csilib.VolumeCapability_AccessMode_Mode) *csilib.VolumeCapability {
300+
return &csilib.VolumeCapability{
301+
AccessType: &csilib.VolumeCapability_Block{
302+
Block: &csilib.VolumeCapability_BlockVolume{},
303+
},
304+
AccessMode: &csilib.VolumeCapability_AccessMode{
305+
Mode: mode,
306+
},
307+
}
308+
}
309+
310+
func createMountCapability(fsType string, mode csilib.VolumeCapability_AccessMode_Mode, mountOptions []string) *csilib.VolumeCapability {
311+
return &csilib.VolumeCapability{
312+
AccessType: &csilib.VolumeCapability_Mount{
313+
Mount: &csilib.VolumeCapability_MountVolume{
314+
FsType: fsType,
315+
MountFlags: mountOptions,
316+
},
317+
},
318+
AccessMode: &csilib.VolumeCapability_AccessMode{
319+
Mode: mode,
320+
},
321+
}
322+
}
323+
190324
func TestCanSupport(t *testing.T) {
191325
testCases := []struct {
192326
name string

0 commit comments

Comments
 (0)