@@ -3,9 +3,11 @@ package resizer
3
3
import (
4
4
"errors"
5
5
"fmt"
6
+ "reflect"
6
7
"testing"
7
8
"time"
8
9
10
+ csilib "github.com/container-storage-interface/spec/lib/go/csi"
9
11
"github.com/kubernetes-csi/csi-lib-utils/metrics"
10
12
"github.com/kubernetes-csi/external-resizer/pkg/csi"
11
13
"github.com/kubernetes-csi/external-resizer/pkg/util"
@@ -187,6 +189,138 @@ func TestResizeMigratedPV(t *testing.T) {
187
189
}
188
190
}
189
191
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
+
190
324
func TestCanSupport (t * testing.T ) {
191
325
testCases := []struct {
192
326
name string
0 commit comments