@@ -19,14 +19,13 @@ package sanity
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "strconv"
22
23
23
24
"google.golang.org/grpc/codes"
24
25
"google.golang.org/grpc/status"
25
26
26
27
"github.com/container-storage-interface/spec/lib/go/csi"
27
28
28
- "strconv"
29
-
30
29
. "github.com/onsi/ginkgo"
31
30
. "github.com/onsi/gomega"
32
31
)
@@ -171,10 +170,189 @@ var _ = DescribeSanity("Controller Service", func(sc *SanityContext) {
171
170
}
172
171
})
173
172
174
- // TODO: Add test to test for tokens
173
+ It ("should fail when an invalid starting_token is passed" , func () {
174
+ vols , err := c .ListVolumes (
175
+ context .Background (),
176
+ & csi.ListVolumesRequest {
177
+ StartingToken : "invalid-token" ,
178
+ },
179
+ )
180
+ Expect (err ).To (HaveOccurred ())
181
+ Expect (vols ).To (BeNil ())
182
+
183
+ serverError , ok := status .FromError (err )
184
+ Expect (ok ).To (BeTrue ())
185
+ Expect (serverError .Code ()).To (Equal (codes .Aborted ))
186
+ })
187
+
188
+ It ("should fail when the starting_token is greater than total number of vols" , func () {
189
+ // Get total number of volumes.
190
+ vols , err := c .ListVolumes (
191
+ context .Background (),
192
+ & csi.ListVolumesRequest {})
193
+ Expect (err ).NotTo (HaveOccurred ())
194
+ Expect (vols ).NotTo (BeNil ())
195
+
196
+ totalVols := len (vols .GetEntries ())
197
+
198
+ // Send starting_token that is greater than the total number of volumes.
199
+ vols , err = c .ListVolumes (
200
+ context .Background (),
201
+ & csi.ListVolumesRequest {
202
+ StartingToken : strconv .Itoa (totalVols + 5 ),
203
+ },
204
+ )
205
+ Expect (err ).To (HaveOccurred ())
206
+ Expect (vols ).To (BeNil ())
207
+
208
+ serverError , ok := status .FromError (err )
209
+ Expect (ok ).To (BeTrue ())
210
+ Expect (serverError .Code ()).To (Equal (codes .Aborted ))
211
+ })
212
+
213
+ It ("check the presence of new volumes in the volume list" , func () {
214
+ // List Volumes before creating new volume.
215
+ vols , err := c .ListVolumes (
216
+ context .Background (),
217
+ & csi.ListVolumesRequest {})
218
+ Expect (err ).NotTo (HaveOccurred ())
219
+ Expect (vols ).NotTo (BeNil ())
220
+
221
+ totalVols := len (vols .GetEntries ())
222
+
223
+ By ("creating a volume" )
224
+ name := "sanity"
225
+
226
+ // Create a new volume.
227
+ req := & csi.CreateVolumeRequest {
228
+ Name : name ,
229
+ VolumeCapabilities : []* csi.VolumeCapability {
230
+ {
231
+ AccessType : & csi.VolumeCapability_Mount {
232
+ Mount : & csi.VolumeCapability_MountVolume {},
233
+ },
234
+ AccessMode : & csi.VolumeCapability_AccessMode {
235
+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
236
+ },
237
+ },
238
+ },
239
+ Secrets : sc .Secrets .CreateVolumeSecret ,
240
+ }
175
241
176
- // TODO: Add test which checks list of volume is there when created,
177
- // and not there when deleted.
242
+ vol , err := c .CreateVolume (context .Background (), req )
243
+ Expect (err ).NotTo (HaveOccurred ())
244
+ Expect (vol ).NotTo (BeNil ())
245
+ Expect (vol .GetVolume ()).NotTo (BeNil ())
246
+ Expect (vol .GetVolume ().GetVolumeId ()).NotTo (BeEmpty ())
247
+
248
+ // List volumes and check for the newly created volume.
249
+ vols , err = c .ListVolumes (
250
+ context .Background (),
251
+ & csi.ListVolumesRequest {})
252
+ Expect (err ).NotTo (HaveOccurred ())
253
+ Expect (vols ).NotTo (BeNil ())
254
+ Expect (len (vols .GetEntries ())).To (Equal (totalVols + 1 ))
255
+
256
+ By ("cleaning up deleting the volume" )
257
+
258
+ delReq := & csi.DeleteVolumeRequest {
259
+ VolumeId : vol .GetVolume ().GetVolumeId (),
260
+ Secrets : sc .Secrets .DeleteVolumeSecret ,
261
+ }
262
+
263
+ _ , err = c .DeleteVolume (context .Background (), delReq )
264
+ Expect (err ).NotTo (HaveOccurred ())
265
+
266
+ // List volumes and check if the deleted volume exists in the volume list.
267
+ vols , err = c .ListVolumes (
268
+ context .Background (),
269
+ & csi.ListVolumesRequest {})
270
+ Expect (err ).NotTo (HaveOccurred ())
271
+ Expect (vols ).NotTo (BeNil ())
272
+ Expect (len (vols .GetEntries ())).To (Equal (totalVols ))
273
+ })
274
+
275
+ It ("should return next token when a limited number of entries are requested" , func () {
276
+ // minVolCount is the minimum number of volumes expected to exist,
277
+ // based on which paginated volume listing is performed.
278
+ minVolCount := 5
279
+ // maxEntried is the maximum entries in list volume request.
280
+ maxEntries := 2
281
+ // currentTotalVols is the total number of volumes at a given time. It
282
+ // is used to verify that all the volumes have been listed.
283
+ currentTotalVols := 0
284
+ // newVolIDs to keep a record of the newly created volume ids.
285
+ var newVolIDs []string
286
+
287
+ // Get the number of existing volumes.
288
+ vols , err := c .ListVolumes (
289
+ context .Background (),
290
+ & csi.ListVolumesRequest {})
291
+ Expect (err ).NotTo (HaveOccurred ())
292
+ Expect (vols ).NotTo (BeNil ())
293
+
294
+ initialTotalVols := len (vols .GetEntries ())
295
+ currentTotalVols = initialTotalVols
296
+
297
+ // Ensure minimum minVolCount volumes exist.
298
+ if initialTotalVols < minVolCount {
299
+
300
+ By ("creating required new volumes" )
301
+ requiredVols := minVolCount - initialTotalVols
302
+ name := "sanity"
303
+ for i := 1 ; i <= requiredVols ; i ++ {
304
+ req := & csi.CreateVolumeRequest {
305
+ Name : name + strconv .Itoa (i ),
306
+ VolumeCapabilities : []* csi.VolumeCapability {
307
+ {
308
+ AccessType : & csi.VolumeCapability_Mount {
309
+ Mount : & csi.VolumeCapability_MountVolume {},
310
+ },
311
+ AccessMode : & csi.VolumeCapability_AccessMode {
312
+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
313
+ },
314
+ },
315
+ },
316
+ Secrets : sc .Secrets .CreateVolumeSecret ,
317
+ }
318
+
319
+ vol , err := c .CreateVolume (context .Background (), req )
320
+ Expect (err ).NotTo (HaveOccurred ())
321
+ Expect (vol ).NotTo (BeNil ())
322
+ }
323
+
324
+ // Update the current total vols count.
325
+ currentTotalVols += requiredVols
326
+ }
327
+
328
+ // Request list volumes with max entries maxEntries.
329
+ vols , err = c .ListVolumes (
330
+ context .Background (),
331
+ & csi.ListVolumesRequest {
332
+ MaxEntries : int32 (maxEntries ),
333
+ })
334
+ Expect (err ).NotTo (HaveOccurred ())
335
+ Expect (vols ).NotTo (BeNil ())
336
+
337
+ nextToken := vols .GetNextToken ()
338
+
339
+ Expect (nextToken ).To (Equal (strconv .Itoa (maxEntries )))
340
+ Expect (len (vols .GetEntries ())).To (Equal (maxEntries ))
341
+
342
+ if initialTotalVols < minVolCount {
343
+
344
+ By ("cleaning up deleting the volumes" )
345
+ for _ , volID := range newVolIDs {
346
+ delReq := & csi.DeleteVolumeRequest {
347
+ VolumeId : volID ,
348
+ Secrets : sc .Secrets .DeleteVolumeSecret ,
349
+ }
350
+
351
+ _ , err := c .DeleteVolume (context .Background (), delReq )
352
+ Expect (err ).NotTo (HaveOccurred ())
353
+ }
354
+ }
355
+ })
178
356
})
179
357
180
358
Describe ("CreateVolume" , func () {
0 commit comments