1
1
package resizer
2
2
3
3
import (
4
+ "errors"
4
5
"testing"
5
6
6
7
"github.com/kubernetes-csi/external-resizer/pkg/csi"
8
+ "k8s.io/api/core/v1"
9
+ "k8s.io/apimachinery/pkg/api/resource"
10
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11
+ "k8s.io/apimachinery/pkg/runtime"
7
12
"k8s.io/client-go/informers"
8
13
"k8s.io/client-go/kubernetes"
9
14
"k8s.io/client-go/kubernetes/fake"
@@ -51,7 +56,7 @@ func TestNewResizer(t *testing.T) {
51
56
Error : resizeNotSupportErr ,
52
57
},
53
58
} {
54
- client := csi .NewMockClient (c .SupportsNodeResize , c .SupportsControllerResize , c .SupportsPluginControllerService )
59
+ client := csi .NewMockClient ("mock" , c .SupportsNodeResize , c .SupportsControllerResize , c .SupportsPluginControllerService )
55
60
k8sClient , informerFactory := fakeK8s ()
56
61
resizer , err := NewResizerFromClient (client , 0 , k8sClient , informerFactory )
57
62
if err != c .Error {
@@ -66,8 +71,218 @@ func TestNewResizer(t *testing.T) {
66
71
}
67
72
}
68
73
69
- func fakeK8s () (kubernetes.Interface , informers.SharedInformerFactory ) {
70
- client := fake .NewSimpleClientset ()
74
+ func TestResizeMigratedPV (t * testing.T ) {
75
+ testCases := []struct {
76
+ name string
77
+ driverName string
78
+ pv * v1.PersistentVolume
79
+ nodeResizeRequired bool
80
+ err error
81
+ }{
82
+ {
83
+ name : "Test AWS EBS CSI Driver" ,
84
+ driverName : "ebs.csi.aws.com" ,
85
+ pv : createEBSPV (1 ),
86
+ nodeResizeRequired : true ,
87
+ },
88
+ {
89
+ name : "Test GCE PD Driver" ,
90
+ driverName : "pd.csi.storage.gke.io" ,
91
+ pv : createGCEPDPV (1 ),
92
+ nodeResizeRequired : true ,
93
+ },
94
+ {
95
+ name : "Test unknonwn driver" ,
96
+ driverName : "unknown" ,
97
+ pv : createEBSPV (1 ),
98
+ nodeResizeRequired : true ,
99
+ err : errors .New ("volume testEBSPV is not migrated to CSI" ),
100
+ },
101
+ }
102
+
103
+ for _ , tc := range testCases {
104
+ t .Run (tc .name , func (t * testing.T ) {
105
+ driverName := tc .driverName
106
+ client := csi .NewMockClient (driverName , true , true , true )
107
+ k8sClient , informerFactory := fakeK8s ()
108
+ resizer , err := NewResizerFromClient (client , 0 , k8sClient , informerFactory )
109
+ if err != nil {
110
+ t .Fatalf ("Failed to create resizer: %v" , err )
111
+ }
112
+
113
+ pv := tc .pv
114
+ expectedSize := quantityGB (2 )
115
+ newSize , nodeResizeRequired , err := resizer .Resize (pv , expectedSize )
116
+
117
+ if tc .err != nil {
118
+ if err == nil {
119
+ t .Fatalf ("Got wrong error, wanted: %v, got: %v" , tc .err , err )
120
+ }
121
+ } else {
122
+ if err != nil {
123
+ t .Fatalf ("Failed to resize the PV: %v" , err )
124
+ }
125
+
126
+ if newSize != expectedSize {
127
+ t .Fatalf ("newSize mismatches, wanted: %v, got: %v" , expectedSize , newSize )
128
+ }
129
+ if nodeResizeRequired != tc .nodeResizeRequired {
130
+ t .Fatalf ("nodeResizeRequired mismatches, wanted: %v, got: %v" , tc .nodeResizeRequired , nodeResizeRequired )
131
+ }
132
+ }
133
+ })
134
+ }
135
+ }
136
+
137
+ func TestCanSupport (t * testing.T ) {
138
+ testCases := []struct {
139
+ name string
140
+ driverName string
141
+ pv * v1.PersistentVolume
142
+ pvc * v1.PersistentVolumeClaim
143
+ canSupport bool
144
+ }{
145
+ {
146
+ name : "EBS PV/PVC is supported" ,
147
+ driverName : "ebs.csi.aws.com" ,
148
+ pv : createEBSPV (1 ),
149
+ pvc : createPVC ("ebs.csi.aws.com" ),
150
+ canSupport : true ,
151
+ },
152
+ {
153
+ name : "EBS PV/PVC is not supported when migartion is disabled" ,
154
+ driverName : "ebs.csi.aws.com" ,
155
+ pv : createEBSPV (1 ),
156
+ pvc : createPVC ("kubernetes.io/aws-ebs" ),
157
+ canSupport : false ,
158
+ },
159
+ {
160
+ name : "PD PV/PVC is supported" ,
161
+ driverName : "pd.csi.storage.gke.io" ,
162
+ pv : createGCEPDPV (1 ),
163
+ pvc : createPVC ("pd.csi.storage.gke.io" ),
164
+ canSupport : true ,
165
+ },
166
+ {
167
+ name : "unknown PV/PVC is not supported" ,
168
+ driverName : "ebs.csi.aws.com" ,
169
+ pv : createEBSPV (1 ),
170
+ pvc : createPVC ("unknown" ),
171
+ canSupport : false ,
172
+ },
173
+ }
174
+ for _ , tc := range testCases {
175
+ t .Run (tc .name , func (t * testing.T ) {
176
+ driverName := tc .driverName
177
+ client := csi .NewMockClient (driverName , true , true , true )
178
+ k8sClient , informerFactory := fakeK8s ()
179
+ resizer , err := NewResizerFromClient (client , 0 , k8sClient , informerFactory )
180
+ if err != nil {
181
+ t .Fatalf ("Failed to create resizer: %v" , err )
182
+ }
183
+
184
+ canSupport := resizer .CanSupport (tc .pv , tc .pvc )
185
+ if canSupport != tc .canSupport {
186
+ t .Fatalf ("Wrong canSupport, wanted: %v got: %v" , tc .canSupport , canSupport )
187
+ }
188
+ })
189
+ }
190
+ }
191
+
192
+ func quantityGB (i int ) resource.Quantity {
193
+ q := resource .NewQuantity (int64 (i * 1024 * 1024 ), resource .BinarySI )
194
+ return * q
195
+ }
196
+
197
+ func createPVC (resizerName string ) * v1.PersistentVolumeClaim {
198
+ request := quantityGB (2 )
199
+ capacity := quantityGB (1 )
200
+
201
+ return & v1.PersistentVolumeClaim {
202
+ ObjectMeta : metav1.ObjectMeta {
203
+ Name : "testPVC" ,
204
+ Namespace : "test" ,
205
+ Annotations : map [string ]string {
206
+ "volume.kubernetes.io/storage-resizer" : resizerName ,
207
+ },
208
+ },
209
+ Spec : v1.PersistentVolumeClaimSpec {
210
+ Resources : v1.ResourceRequirements {
211
+ Requests : map [v1.ResourceName ]resource.Quantity {
212
+ v1 .ResourceStorage : request ,
213
+ },
214
+ },
215
+ VolumeName : "testPV" ,
216
+ },
217
+ Status : v1.PersistentVolumeClaimStatus {
218
+ Phase : v1 .ClaimBound ,
219
+ Capacity : map [v1.ResourceName ]resource.Quantity {
220
+ v1 .ResourceStorage : capacity ,
221
+ },
222
+ },
223
+ }
224
+ }
225
+
226
+ func createPV (capacityGB int ) * v1.PersistentVolume {
227
+ capacity := quantityGB (capacityGB )
228
+
229
+ return & v1.PersistentVolume {
230
+ ObjectMeta : metav1.ObjectMeta {
231
+ Name : "testPV" ,
232
+ },
233
+ Spec : v1.PersistentVolumeSpec {
234
+ Capacity : map [v1.ResourceName ]resource.Quantity {
235
+ v1 .ResourceStorage : capacity ,
236
+ },
237
+ PersistentVolumeSource : v1.PersistentVolumeSource {
238
+ CSI : & v1.CSIPersistentVolumeSource {
239
+ Driver : "foo" ,
240
+ VolumeHandle : "foo" ,
241
+ },
242
+ },
243
+ },
244
+ }
245
+ }
246
+ func createEBSPV (capacityGB int ) * v1.PersistentVolume {
247
+ capacity := quantityGB (capacityGB )
248
+
249
+ return & v1.PersistentVolume {
250
+ ObjectMeta : metav1.ObjectMeta {
251
+ Name : "testEBSPV" ,
252
+ },
253
+ Spec : v1.PersistentVolumeSpec {
254
+ Capacity : map [v1.ResourceName ]resource.Quantity {
255
+ v1 .ResourceStorage : capacity ,
256
+ },
257
+ PersistentVolumeSource : v1.PersistentVolumeSource {
258
+ AWSElasticBlockStore : & v1.AWSElasticBlockStoreVolumeSource {
259
+ VolumeID : "testVolumeId" ,
260
+ },
261
+ },
262
+ },
263
+ }
264
+ }
265
+
266
+ func createGCEPDPV (capacityGB int ) * v1.PersistentVolume {
267
+ capacity := quantityGB (capacityGB )
268
+
269
+ return & v1.PersistentVolume {
270
+ ObjectMeta : metav1.ObjectMeta {
271
+ Name : "testPDPV" ,
272
+ },
273
+ Spec : v1.PersistentVolumeSpec {
274
+ Capacity : map [v1.ResourceName ]resource.Quantity {
275
+ v1 .ResourceStorage : capacity ,
276
+ },
277
+ PersistentVolumeSource : v1.PersistentVolumeSource {
278
+ GCEPersistentDisk : & v1.GCEPersistentDiskVolumeSource {},
279
+ },
280
+ },
281
+ }
282
+ }
283
+
284
+ func fakeK8s (objects ... runtime.Object ) (kubernetes.Interface , informers.SharedInformerFactory ) {
285
+ client := fake .NewSimpleClientset (objects ... )
71
286
informerFactory := informers .NewSharedInformerFactory (client , 0 )
72
287
return client , informerFactory
73
288
}
0 commit comments