@@ -17,6 +17,7 @@ limitations under the License.
17
17
package volume
18
18
19
19
import (
20
+ "fmt"
20
21
"testing"
21
22
22
23
v1 "k8s.io/api/core/v1"
33
34
classNoMode = "no-mode"
34
35
classImmediateMode = "immediate-mode"
35
36
classWaitMode = "wait-mode"
37
+ classGold = "gold"
38
+ classSilver = "silver"
36
39
37
40
modeImmediate = storagev1 .VolumeBindingImmediate
38
41
modeWait = storagev1 .VolumeBindingWaitForFirstConsumer
@@ -167,6 +170,15 @@ func TestFindMatchVolumeWithNode(t *testing.T) {
167
170
}),
168
171
}
169
172
173
+ var volumesWithVAC = func (name string , input []* v1.PersistentVolume ) []* v1.PersistentVolume {
174
+ output := make ([]* v1.PersistentVolume , len (input ))
175
+ for i , volume := range input {
176
+ output [i ] = volume .DeepCopy ()
177
+ output [i ].Spec .VolumeAttributesClassName = & name
178
+ }
179
+ return output
180
+ }
181
+
170
182
node1 := & v1.Node {
171
183
ObjectMeta : metav1.ObjectMeta {
172
184
Labels : map [string ]string {"key1" : "value1" },
@@ -190,80 +202,151 @@ func TestFindMatchVolumeWithNode(t *testing.T) {
190
202
191
203
scenarios := map [string ]struct {
192
204
expectedMatch string
205
+ expectErr bool
193
206
claim * v1.PersistentVolumeClaim
194
207
node * v1.Node
208
+ volumes []* v1.PersistentVolume
195
209
excludedVolumes map [string ]* v1.PersistentVolume
210
+ vacEnabled []bool
196
211
}{
197
212
"success-match" : {
198
213
expectedMatch : "affinity-pv" ,
199
- claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
214
+ volumes : volumes ,
215
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
200
216
node : node1 ,
217
+ vacEnabled : []bool {true , false },
201
218
},
202
219
"success-prebound" : {
203
220
expectedMatch : "affinity-prebound" ,
204
- claim : makeTestPersistentVolumeClaim ("claim02" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
221
+ volumes : volumes ,
222
+ claim : makeTestPersistentVolumeClaim ("claim02" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
205
223
node : node1 ,
224
+ vacEnabled : []bool {true , false },
206
225
},
207
226
"success-exclusion" : {
208
227
expectedMatch : "affinity-pv2" ,
209
- claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
228
+ volumes : volumes ,
229
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
210
230
node : node1 ,
211
231
excludedVolumes : map [string ]* v1.PersistentVolume {"affinity001" : nil },
232
+ vacEnabled : []bool {true , false },
212
233
},
213
234
"fail-exclusion" : {
214
235
expectedMatch : "" ,
215
- claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
236
+ volumes : volumes ,
237
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
216
238
node : node1 ,
217
- excludedVolumes : map [string ]* v1.PersistentVolume {"affinity001" : nil , "affinity002" : nil },
239
+ excludedVolumes : map [string ]* v1.PersistentVolume {"affinity001" : nil , "affinity002" : nil , "affinity002-vac" : nil },
240
+ vacEnabled : []bool {true , false },
218
241
},
219
242
"fail-accessmode" : {
220
243
expectedMatch : "" ,
221
- claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteMany }),
244
+ volumes : volumes ,
245
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteMany }, nil ),
222
246
node : node1 ,
247
+ vacEnabled : []bool {true , false },
223
248
},
224
249
"fail-nodeaffinity" : {
225
250
expectedMatch : "" ,
226
- claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
251
+ volumes : volumes ,
252
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
227
253
node : node2 ,
254
+ vacEnabled : []bool {true , false },
228
255
},
229
256
"fail-prebound-node-affinity" : {
230
257
expectedMatch : "" ,
231
- claim : makeTestPersistentVolumeClaim ("claim02" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
258
+ volumes : volumes ,
259
+ claim : makeTestPersistentVolumeClaim ("claim02" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
232
260
node : node3 ,
261
+ vacEnabled : []bool {true , false },
233
262
},
234
263
"fail-nonavaliable" : {
235
264
expectedMatch : "" ,
236
- claim : makeTestPersistentVolumeClaim ("claim04" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
265
+ volumes : volumes ,
266
+ claim : makeTestPersistentVolumeClaim ("claim04" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
237
267
node : node4 ,
268
+ vacEnabled : []bool {true , false },
238
269
},
239
270
"success-bad-and-good-node-affinity" : {
240
271
expectedMatch : "affinity-pv3" ,
241
- claim : makeTestPersistentVolumeClaim ("claim03" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }),
272
+ volumes : volumes ,
273
+ claim : makeTestPersistentVolumeClaim ("claim03" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
242
274
node : node3 ,
275
+ vacEnabled : []bool {true , false },
276
+ },
277
+ "success-match-with-vac" : {
278
+ expectedMatch : "affinity-pv" ,
279
+ volumes : volumesWithVAC (classGold , volumes ),
280
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, func (pvc * v1.PersistentVolumeClaim ) {
281
+ pvc .Spec .VolumeAttributesClassName = & classGold
282
+ }),
283
+ node : node1 ,
284
+ vacEnabled : []bool {true },
285
+ },
286
+ "fail-vac" : { // claim has a given vac and volumes don't have the same vac.
287
+ expectedMatch : "" ,
288
+ volumes : volumes ,
289
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, func (pvc * v1.PersistentVolumeClaim ) {
290
+ pvc .Spec .VolumeAttributesClassName = & classSilver
291
+ }),
292
+ node : node1 ,
293
+ vacEnabled : []bool {true },
294
+ },
295
+ "fail-prebound-vac" : { // claim has a given vac and volume name but the given volume has a different vac.
296
+ expectedMatch : "" ,
297
+ volumes : volumesWithVAC (classGold , volumes ),
298
+ claim : makeTestPersistentVolumeClaim ("claim02" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, func (pvc * v1.PersistentVolumeClaim ) {
299
+ pvc .Spec .VolumeAttributesClassName = & classSilver
300
+ }),
301
+ node : node1 ,
302
+ vacEnabled : []bool {true },
303
+ },
304
+ "fail-on-error" : { // claim has a given vac when feature-gate is disabled.
305
+ expectedMatch : "" ,
306
+ expectErr : true ,
307
+ volumes : volumes ,
308
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, func (pvc * v1.PersistentVolumeClaim ) {
309
+ pvc .Spec .VolumeAttributesClassName = & classGold
310
+ }),
311
+ node : node1 ,
312
+ vacEnabled : []bool {false },
313
+ },
314
+ "fail-volumes-vac" : { // claim has no vac and all volumes have vac when feature-gate is disabled.
315
+ expectedMatch : "" ,
316
+ volumes : volumesWithVAC (classGold , volumes ),
317
+ claim : makeTestPersistentVolumeClaim ("claim01" , "100G" , []v1.PersistentVolumeAccessMode {v1 .ReadWriteOnce }, nil ),
318
+ node : node1 ,
319
+ vacEnabled : []bool {false },
243
320
},
244
321
}
245
322
246
323
for name , scenario := range scenarios {
247
- volume , err := FindMatchingVolume (scenario .claim , volumes , scenario .node , scenario .excludedVolumes , true )
248
- if err != nil {
249
- t .Errorf ("Unexpected error matching volume by claim: %v" , err )
250
- }
251
- if len (scenario .expectedMatch ) != 0 && volume == nil {
252
- t .Errorf ("Expected match but received nil volume for scenario: %s" , name )
253
- }
254
- if len (scenario .expectedMatch ) != 0 && volume != nil && string (volume .UID ) != scenario .expectedMatch {
255
- t .Errorf ("Expected %s but got volume %s in scenario %s" , scenario .expectedMatch , volume .UID , name )
256
- }
257
- if len (scenario .expectedMatch ) == 0 && volume != nil {
258
- t .Errorf ("Unexpected match for scenario: %s, matched with %s instead" , name , volume .UID )
324
+ for _ , enabled := range scenario .vacEnabled {
325
+ name := fmt .Sprintf ("[VolumeAttributiesClass: %v] %s" , enabled , name )
326
+ volume , err := FindMatchingVolume (scenario .claim , scenario .volumes , scenario .node , scenario .excludedVolumes , true , enabled )
327
+ if scenario .expectErr && err == nil {
328
+ t .Errorf ("Expected error for scenario: %s" , name )
329
+ }
330
+ if ! scenario .expectErr && err != nil {
331
+ t .Errorf ("Unexpected error matching volume by claim: %v" , err )
332
+ }
333
+ if len (scenario .expectedMatch ) != 0 && volume == nil {
334
+ t .Errorf ("Expected match but received nil volume for scenario: %s" , name )
335
+ }
336
+ if len (scenario .expectedMatch ) != 0 && volume != nil && string (volume .UID ) != scenario .expectedMatch {
337
+ t .Errorf ("Expected %s but got volume %s in scenario %s" , scenario .expectedMatch , volume .UID , name )
338
+ }
339
+ if len (scenario .expectedMatch ) == 0 && volume != nil {
340
+ t .Errorf ("Unexpected match for scenario: %s, matched with %s instead" , name , volume .UID )
341
+ }
259
342
}
260
343
}
261
344
}
262
345
263
- func makeTestPersistentVolumeClaim (name string , size string , accessMode []v1.PersistentVolumeAccessMode ) * v1.PersistentVolumeClaim {
346
+ func makeTestPersistentVolumeClaim (name string , size string , accessMode []v1.PersistentVolumeAccessMode , modfn func ( * v1. PersistentVolumeClaim ) ) * v1.PersistentVolumeClaim {
264
347
fs := v1 .PersistentVolumeFilesystem
265
348
sc := "wait"
266
- return & v1.PersistentVolumeClaim {
349
+ pvc := & v1.PersistentVolumeClaim {
267
350
ObjectMeta : metav1.ObjectMeta {
268
351
Name : name ,
269
352
Namespace : "myns" ,
@@ -279,6 +362,12 @@ func makeTestPersistentVolumeClaim(name string, size string, accessMode []v1.Per
279
362
VolumeMode : & fs ,
280
363
},
281
364
}
365
+
366
+ if modfn != nil {
367
+ modfn (pvc )
368
+ }
369
+
370
+ return pvc
282
371
}
283
372
284
373
func makeTestVolume (uid types.UID , name string , capacity string , available bool , modfn func (* v1.PersistentVolume )) * v1.PersistentVolume {
0 commit comments