@@ -93,6 +93,169 @@ func TestCreateVolume(t *testing.T) {
93
93
},
94
94
},
95
95
96
+ {
97
+ name : "csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER" ,
98
+ testFunc : func (t * testing.T ) {
99
+ req := & csi.CreateVolumeRequest {
100
+ Name : "random-vol-name" ,
101
+ CapacityRange : stdCapRange ,
102
+ VolumeCapabilities : []* csi.VolumeCapability {
103
+ {
104
+ AccessType : & csi.VolumeCapability_Mount {
105
+ Mount : & csi.VolumeCapability_MountVolume {},
106
+ },
107
+ AccessMode : & csi.VolumeCapability_AccessMode {
108
+ Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER ,
109
+ },
110
+ },
111
+ },
112
+ Parameters : nil ,
113
+ }
114
+
115
+ ctx := context .Background ()
116
+ mockDisk := & cloud.Disk {
117
+ VolumeID : req .Name ,
118
+ CapacityGiB : util .BytesToGiB (stdVolSize ),
119
+ Shareable : true ,
120
+ }
121
+ mockDiskOpts := & cloud.DiskOptions {
122
+ Shareable : true ,
123
+ CapacityBytes : stdVolSize ,
124
+ }
125
+
126
+ mockCtl := gomock .NewController (t )
127
+ defer mockCtl .Finish ()
128
+
129
+ mockCloud := mocks .NewMockCloud (mockCtl )
130
+ mockCloud .EXPECT ().GetDiskByName (gomock .Eq (req .Name )).Return (nil , nil )
131
+ mockCloud .EXPECT ().CreateDisk (gomock .Eq (req .Name ), mockDiskOpts ).Return (mockDisk , nil )
132
+
133
+ powervsDriver := controllerService {
134
+ cloud : mockCloud ,
135
+ driverOptions : & Options {},
136
+ volumeLocks : util .NewVolumeLocks (),
137
+ }
138
+
139
+ _ , err := powervsDriver .CreateVolume (ctx , req )
140
+ if err != nil {
141
+ srvErr , ok := status .FromError (err )
142
+ if ! ok {
143
+ t .Fatalf ("Could not get error status code from error: %v" , srvErr )
144
+ }
145
+ t .Fatalf ("Unexpected error: %v" , srvErr .Code ())
146
+ }
147
+
148
+ },
149
+ },
150
+ {
151
+ name : "csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY" ,
152
+ testFunc : func (t * testing.T ) {
153
+ req := & csi.CreateVolumeRequest {
154
+ Name : "random-vol-name" ,
155
+ CapacityRange : stdCapRange ,
156
+ VolumeCapabilities : []* csi.VolumeCapability {
157
+ {
158
+ AccessType : & csi.VolumeCapability_Mount {
159
+ Mount : & csi.VolumeCapability_MountVolume {},
160
+ },
161
+ AccessMode : & csi.VolumeCapability_AccessMode {
162
+ Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ,
163
+ },
164
+ },
165
+ },
166
+ Parameters : nil ,
167
+ }
168
+
169
+ ctx := context .Background ()
170
+ mockDisk := & cloud.Disk {
171
+ VolumeID : req .Name ,
172
+ CapacityGiB : util .BytesToGiB (stdVolSize ),
173
+ Shareable : true ,
174
+ }
175
+ mockDiskOpts := & cloud.DiskOptions {
176
+ Shareable : true ,
177
+ CapacityBytes : stdVolSize ,
178
+ }
179
+
180
+ mockCtl := gomock .NewController (t )
181
+ defer mockCtl .Finish ()
182
+
183
+ mockCloud := mocks .NewMockCloud (mockCtl )
184
+ mockCloud .EXPECT ().GetDiskByName (gomock .Eq (req .Name )).Return (nil , nil )
185
+ mockCloud .EXPECT ().CreateDisk (gomock .Eq (req .Name ), mockDiskOpts ).Return (mockDisk , nil )
186
+
187
+ powervsDriver := controllerService {
188
+ cloud : mockCloud ,
189
+ driverOptions : & Options {},
190
+ volumeLocks : util .NewVolumeLocks (),
191
+ }
192
+
193
+ _ , err := powervsDriver .CreateVolume (ctx , req )
194
+ if err != nil {
195
+ srvErr , ok := status .FromError (err )
196
+ if ! ok {
197
+ t .Fatalf ("Could not get error status code from error: %v" , srvErr )
198
+ }
199
+ t .Fatalf ("Unexpected error: %v" , srvErr .Code ())
200
+ }
201
+
202
+ },
203
+ },
204
+ {
205
+ name : "csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER" ,
206
+ testFunc : func (t * testing.T ) {
207
+ req := & csi.CreateVolumeRequest {
208
+ Name : "random-vol-name" ,
209
+ CapacityRange : stdCapRange ,
210
+ VolumeCapabilities : []* csi.VolumeCapability {
211
+ {
212
+ AccessType : & csi.VolumeCapability_Mount {
213
+ Mount : & csi.VolumeCapability_MountVolume {},
214
+ },
215
+ AccessMode : & csi.VolumeCapability_AccessMode {
216
+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
217
+ },
218
+ },
219
+ },
220
+ Parameters : nil ,
221
+ }
222
+
223
+ ctx := context .Background ()
224
+ mockDisk := & cloud.Disk {
225
+ VolumeID : req .Name ,
226
+ CapacityGiB : util .BytesToGiB (stdVolSize ),
227
+ Shareable : false ,
228
+ }
229
+ mockDiskOpts := & cloud.DiskOptions {
230
+ Shareable : false ,
231
+ CapacityBytes : stdVolSize ,
232
+ }
233
+
234
+ mockCtl := gomock .NewController (t )
235
+ defer mockCtl .Finish ()
236
+
237
+ mockCloud := mocks .NewMockCloud (mockCtl )
238
+ mockCloud .EXPECT ().GetDiskByName (gomock .Eq (req .Name )).Return (nil , nil )
239
+ mockCloud .EXPECT ().CreateDisk (gomock .Eq (req .Name ), mockDiskOpts ).Return (mockDisk , nil )
240
+
241
+ powervsDriver := controllerService {
242
+ cloud : mockCloud ,
243
+ driverOptions : & Options {},
244
+ volumeLocks : util .NewVolumeLocks (),
245
+ }
246
+
247
+ _ , err := powervsDriver .CreateVolume (ctx , req )
248
+ if err != nil {
249
+ srvErr , ok := status .FromError (err )
250
+ if ! ok {
251
+ t .Fatalf ("Could not get error status code from error: %v" , srvErr )
252
+ }
253
+ t .Fatalf ("Unexpected error: %v" , srvErr .Code ())
254
+ }
255
+
256
+ },
257
+ },
258
+
96
259
{
97
260
name : "fail no name" ,
98
261
testFunc : func (t * testing.T ) {
@@ -1220,6 +1383,66 @@ func TestControllerExpandVolume(t *testing.T) {
1220
1383
}
1221
1384
}
1222
1385
1386
+ func TestIsShareableVolume (t * testing.T ) {
1387
+ testCases := []struct {
1388
+ name string
1389
+ expectedShareable bool
1390
+ testVolCap []* csi.VolumeCapability
1391
+ }{
1392
+ {
1393
+ name : "Test csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER" ,
1394
+ expectedShareable : false ,
1395
+ testVolCap : []* csi.VolumeCapability {
1396
+ {
1397
+ AccessType : & csi.VolumeCapability_Mount {
1398
+ Mount : & csi.VolumeCapability_MountVolume {},
1399
+ },
1400
+ AccessMode : & csi.VolumeCapability_AccessMode {
1401
+ Mode : csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ,
1402
+ },
1403
+ },
1404
+ },
1405
+ },
1406
+ {
1407
+ name : "Test csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER" ,
1408
+ expectedShareable : true ,
1409
+ testVolCap : []* csi.VolumeCapability {
1410
+ {
1411
+ AccessType : & csi.VolumeCapability_Mount {
1412
+ Mount : & csi.VolumeCapability_MountVolume {},
1413
+ },
1414
+ AccessMode : & csi.VolumeCapability_AccessMode {
1415
+ Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER ,
1416
+ },
1417
+ },
1418
+ },
1419
+ },
1420
+ {
1421
+ name : "Test csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY" ,
1422
+ expectedShareable : true ,
1423
+ testVolCap : []* csi.VolumeCapability {
1424
+ {
1425
+ AccessType : & csi.VolumeCapability_Mount {
1426
+ Mount : & csi.VolumeCapability_MountVolume {},
1427
+ },
1428
+ AccessMode : & csi.VolumeCapability_AccessMode {
1429
+ Mode : csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ,
1430
+ },
1431
+ },
1432
+ },
1433
+ },
1434
+ }
1435
+
1436
+ for _ , tc := range testCases {
1437
+ t .Run (tc .name , func (t * testing.T ) {
1438
+ if res := isShareableVolume (tc .testVolCap ); res != tc .expectedShareable {
1439
+ t .Fatalf ("Volume capability: %s expected value for shareable : %t got: %t" , tc .testVolCap [0 ].AccessMode .GetMode ().String (), tc .expectedShareable , res )
1440
+ }
1441
+ })
1442
+ }
1443
+
1444
+ }
1445
+
1223
1446
func checkExpectedErrorCode (t * testing.T , err error , expectedCode codes.Code ) {
1224
1447
if err == nil {
1225
1448
t .Fatalf ("Expected operation to fail but got no error" )
0 commit comments