@@ -31,13 +31,27 @@ func init() {
31
31
_ = flag .Set ("v" , "4" )
32
32
}
33
33
34
+ func checkExpectedError (t * testing.T , expectedErr bool , err error , testName string ) {
35
+ t .Helper ()
36
+
37
+ if expectedErr && err == nil {
38
+ t .Errorf ("Test case '%s': no error returned" , testName )
39
+ }
40
+
41
+ if ! expectedErr && err != nil {
42
+ t .Errorf ("Test case '%s': unexpected error: %+v" , testName , err )
43
+ }
44
+ }
45
+
34
46
func TestPatcherStorageFunctions (t * testing.T ) {
35
47
goodAf := & fpgav2.AcceleratorFunction {
36
48
ObjectMeta : metav1.ObjectMeta {
37
49
Name : "arria10-nlb0" ,
38
50
},
39
51
Spec : fpgav2.AcceleratorFunctionSpec {
40
- AfuID : "d8424dc4a4a3c413f89e433683f9040b" ,
52
+ AfuID : "d8424dc4a4a3c413f89e433683f9040b" ,
53
+ InterfaceID : "ce48969398f05f33946d560708be108a" ,
54
+ Mode : af ,
41
55
},
42
56
}
43
57
brokenAf := & fpgav2.AcceleratorFunction {
@@ -58,37 +72,103 @@ func TestPatcherStorageFunctions(t *testing.T) {
58
72
InterfaceID : "ce48969398f05f33946d560708be108a" ,
59
73
},
60
74
}
61
-
62
- p := newPatcher (ctrl .Log .WithName ("test" ))
63
-
64
- if err := p .AddAf (goodAf ); err != nil {
65
- t .Error ("unexpected error" )
66
- }
67
-
68
- if len (p .resourceModeMap ) != 1 || len (p .afMap ) != 1 || len (p .resourceMap ) != 1 {
69
- t .Error ("Failed to add AF to patcher" )
70
- }
71
-
72
- if err := p .AddAf (brokenAf ); err == nil {
73
- t .Error ("AddAf() must fail" )
74
- }
75
-
76
- p .RemoveAf (goodAf .Name )
77
-
78
- if len (p .resourceModeMap ) != 0 || len (p .afMap ) != 0 || len (p .resourceMap ) != 0 {
79
- t .Error ("Failed to remove AF from patcher" )
75
+ regionAlias := & fpgav2.FpgaRegion {
76
+ ObjectMeta : metav1.ObjectMeta {
77
+ Name : "arria10-alias" ,
78
+ },
79
+ Spec : fpgav2.FpgaRegionSpec {
80
+ InterfaceID : "ce48969398f05f33946d560708be108a" ,
81
+ },
80
82
}
81
83
82
- p .AddRegion (region )
83
-
84
- if len (p .resourceModeMap ) != 1 || len (p .resourceMap ) != 1 {
85
- t .Error ("Failed to add fpga region to patcher" )
84
+ tcases := []struct {
85
+ name string
86
+ afsToAdd []* fpgav2.AcceleratorFunction
87
+ afsToRemove []* fpgav2.AcceleratorFunction
88
+ regionsToAdd []* fpgav2.FpgaRegion
89
+ regionsToRemove []* fpgav2.FpgaRegion
90
+ expectedResourceModeMapSize int
91
+ expectedResourceMapSize int
92
+ expectedIdentitySetSize int
93
+ expectedErr bool
94
+ }{
95
+ {
96
+ name : "Add one good af" ,
97
+ afsToAdd : []* fpgav2.AcceleratorFunction {goodAf },
98
+ expectedResourceModeMapSize : 1 ,
99
+ expectedResourceMapSize : 1 ,
100
+ expectedIdentitySetSize : 1 ,
101
+ },
102
+ {
103
+ name : "Add one broken af" ,
104
+ afsToAdd : []* fpgav2.AcceleratorFunction {brokenAf },
105
+ expectedErr : true ,
106
+ },
107
+ {
108
+ name : "Add one and remove one good af" ,
109
+ afsToAdd : []* fpgav2.AcceleratorFunction {goodAf },
110
+ afsToRemove : []* fpgav2.AcceleratorFunction {goodAf },
111
+ },
112
+ {
113
+ name : "Add one good region" ,
114
+ regionsToAdd : []* fpgav2.FpgaRegion {region },
115
+ expectedResourceModeMapSize : 1 ,
116
+ expectedResourceMapSize : 1 ,
117
+ expectedIdentitySetSize : 1 ,
118
+ },
119
+ {
120
+ name : "Add one and remove one good region" ,
121
+ regionsToAdd : []* fpgav2.FpgaRegion {region },
122
+ regionsToRemove : []* fpgav2.FpgaRegion {region },
123
+ },
124
+ {
125
+ name : "Add one region and one alias then remove one alias" ,
126
+ regionsToAdd : []* fpgav2.FpgaRegion {region , regionAlias },
127
+ regionsToRemove : []* fpgav2.FpgaRegion {region },
128
+ expectedResourceModeMapSize : 1 ,
129
+ expectedResourceMapSize : 1 ,
130
+ expectedIdentitySetSize : 1 ,
131
+ },
132
+ {
133
+ name : "Add one region and one alias" ,
134
+ regionsToAdd : []* fpgav2.FpgaRegion {region , regionAlias },
135
+ expectedResourceModeMapSize : 2 ,
136
+ expectedResourceMapSize : 2 ,
137
+ expectedIdentitySetSize : 1 ,
138
+ },
139
+ {
140
+ name : "Add one region and one alias then remove all" ,
141
+ regionsToAdd : []* fpgav2.FpgaRegion {region , regionAlias },
142
+ regionsToRemove : []* fpgav2.FpgaRegion {region , regionAlias },
143
+ },
86
144
}
87
145
88
- p .RemoveRegion (region .Name )
89
-
90
- if len (p .resourceModeMap ) != 0 || len (p .resourceMap ) != 0 {
91
- t .Error ("Failed to remove fpga region from patcher" )
146
+ for _ , tt := range tcases {
147
+ t .Run (tt .name , func (t * testing.T ) {
148
+ p := newPatcher (ctrl .Log .WithName ("test" ))
149
+ for _ , af := range tt .afsToAdd {
150
+ err := p .AddAf (af )
151
+ checkExpectedError (t , tt .expectedErr , err , tt .name )
152
+ }
153
+ for _ , reg := range tt .regionsToAdd {
154
+ p .AddRegion (reg )
155
+ }
156
+ for _ , af := range tt .afsToRemove {
157
+ p .RemoveAf (af .Name )
158
+ }
159
+ for _ , reg := range tt .regionsToRemove {
160
+ p .RemoveRegion (reg .Name )
161
+ }
162
+ if tt .expectedResourceModeMapSize != len (p .resourceModeMap ) {
163
+ t .Errorf ("wrong size of resourceModeMap. Expected %d, but got %d" , tt .expectedResourceModeMapSize , len (p .resourceModeMap ))
164
+ }
165
+ if tt .expectedResourceMapSize != len (p .resourceMap ) {
166
+ t .Errorf ("wrong size of resourceMap. Expected %d, but got %d" , tt .expectedResourceMapSize , len (p .resourceMap ))
167
+ }
168
+ if tt .expectedIdentitySetSize != len (p .identitySet ) {
169
+ t .Errorf ("wrong size of identitySet. Expected %d, but got %d" , tt .expectedIdentitySetSize , len (p .identitySet ))
170
+ }
171
+ })
92
172
}
93
173
}
94
174
@@ -245,6 +325,41 @@ func TestGetPatchOps(t *testing.T) {
245
325
},
246
326
expectedOps : 4 ,
247
327
},
328
+ {
329
+ name : "Skip handling for an identity mapping" ,
330
+ container : corev1.Container {
331
+ Resources : corev1.ResourceRequirements {
332
+ Limits : corev1.ResourceList {
333
+ "fpga.intel.com/af-ce4.d84.zkiWk5jwXzOUbVYHCL4QithCTcSko8QT-J5DNoP5BAs" : resource .MustParse ("1" ),
334
+ },
335
+ Requests : corev1.ResourceList {
336
+ "fpga.intel.com/af-ce4.d84.zkiWk5jwXzOUbVYHCL4QithCTcSko8QT-J5DNoP5BAs" : resource .MustParse ("1" ),
337
+ },
338
+ },
339
+ },
340
+ afs : []* fpgav2.AcceleratorFunction {
341
+ {
342
+ ObjectMeta : metav1.ObjectMeta {
343
+ Name : "arria10-nlb0" ,
344
+ },
345
+ Spec : fpgav2.AcceleratorFunctionSpec {
346
+ AfuID : "d8424dc4a4a3c413f89e433683f9040b" ,
347
+ InterfaceID : "ce48969398f05f33946d560708be108a" ,
348
+ Mode : af ,
349
+ },
350
+ },
351
+ {
352
+ ObjectMeta : metav1.ObjectMeta {
353
+ Name : "arria10-nlb0-alias" ,
354
+ },
355
+ Spec : fpgav2.AcceleratorFunctionSpec {
356
+ AfuID : "d8424dc4a4a3c413f89e433683f9040b" ,
357
+ InterfaceID : "ce48969398f05f33946d560708be108a" ,
358
+ Mode : af ,
359
+ },
360
+ },
361
+ },
362
+ },
248
363
{
249
364
name : "Successful handling for regiondevel mode" ,
250
365
container : corev1.Container {
@@ -399,12 +514,7 @@ func TestGetPatchOps(t *testing.T) {
399
514
p .AddRegion (region )
400
515
}
401
516
ops , err := p .getPatchOps (0 , tt .container )
402
- if tt .expectedErr && err == nil {
403
- t .Errorf ("Test case '%s': no error returned" , tt .name )
404
- }
405
- if ! tt .expectedErr && err != nil {
406
- t .Errorf ("Test case '%s': unexpected error: %+v" , tt .name , err )
407
- }
517
+ checkExpectedError (t , tt .expectedErr , err , tt .name )
408
518
if len (ops ) != tt .expectedOps {
409
519
t .Errorf ("test case '%s': expected %d ops, but got %d\n %v" , tt .name , tt .expectedOps , len (ops ), ops )
410
520
}
0 commit comments