@@ -62,48 +62,42 @@ type opCounts map[string]int64
62
62
63
63
// TestSuite represents an interface for a set of tests which works with TestDriver
64
64
type TestSuite interface {
65
- // getTestSuiteInfo returns the TestSuiteInfo for this TestSuite
66
- getTestSuiteInfo () TestSuiteInfo
67
- // defineTest defines tests of the testpattern for the driver.
65
+ // GetTestSuiteInfo returns the TestSuiteInfo for this TestSuite
66
+ GetTestSuiteInfo () TestSuiteInfo
67
+ // DefineTests defines tests of the testpattern for the driver.
68
68
// Called inside a Ginkgo context that reflects the current driver and test pattern,
69
69
// so the test suite can define tests directly with ginkgo.It.
70
- defineTests (TestDriver , testpatterns.TestPattern )
71
- // skipRedundantSuite will skip the test suite based on the given TestPattern and TestDriver
72
- skipRedundantSuite (TestDriver , testpatterns.TestPattern )
70
+ DefineTests (TestDriver , testpatterns.TestPattern )
71
+ // SkipRedundantSuite will skip the test suite based on the given TestPattern and TestDriver
72
+ SkipRedundantSuite (TestDriver , testpatterns.TestPattern )
73
73
}
74
74
75
75
// TestSuiteInfo represents a set of parameters for TestSuite
76
76
type TestSuiteInfo struct {
77
- name string // name of the TestSuite
78
- featureTag string // featureTag for the TestSuite
79
- testPatterns []testpatterns.TestPattern // Slice of TestPattern for the TestSuite
80
- supportedSizeRange volume.SizeRange // Size range supported by the test suite
81
- }
82
-
83
- // TestResource represents an interface for resources that is used by TestSuite
84
- type TestResource interface {
85
- // cleanupResource cleans up the test resources created when setting up the resource
86
- cleanupResource () error
77
+ Name string // name of the TestSuite
78
+ FeatureTag string // featureTag for the TestSuite
79
+ TestPatterns []testpatterns.TestPattern // Slice of TestPattern for the TestSuite
80
+ SupportedSizeRange volume.SizeRange // Size range supported by the test suite
87
81
}
88
82
89
83
func getTestNameStr (suite TestSuite , pattern testpatterns.TestPattern ) string {
90
- tsInfo := suite .getTestSuiteInfo ()
91
- return fmt .Sprintf ("[Testpattern: %s]%s %s%s" , pattern .Name , pattern .FeatureTag , tsInfo .name , tsInfo .featureTag )
84
+ tsInfo := suite .GetTestSuiteInfo ()
85
+ return fmt .Sprintf ("[Testpattern: %s]%s %s%s" , pattern .Name , pattern .FeatureTag , tsInfo .Name , tsInfo .FeatureTag )
92
86
}
93
87
94
88
// DefineTestSuite defines tests for all testpatterns and all testSuites for a driver
95
89
func DefineTestSuite (driver TestDriver , tsInits []func () TestSuite ) {
96
90
for _ , testSuiteInit := range tsInits {
97
91
suite := testSuiteInit ()
98
- for _ , pattern := range suite .getTestSuiteInfo ().testPatterns {
92
+ for _ , pattern := range suite .GetTestSuiteInfo ().TestPatterns {
99
93
p := pattern
100
94
ginkgo .Context (getTestNameStr (suite , p ), func () {
101
95
ginkgo .BeforeEach (func () {
102
96
// Skip unsupported tests to avoid unnecessary resource initialization
103
- suite .skipRedundantSuite (driver , p )
97
+ suite .SkipRedundantSuite (driver , p )
104
98
skipUnsupportedTest (driver , p )
105
99
})
106
- suite .defineTests (driver , p )
100
+ suite .DefineTests (driver , p )
107
101
})
108
102
}
109
103
}
@@ -117,7 +111,7 @@ func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite) {
117
111
// 3. Check if fsType is supported
118
112
// 4. Check with driver specific logic
119
113
//
120
- // Test suites can also skip tests inside their own defineTests function or in
114
+ // Test suites can also skip tests inside their own DefineTests function or in
121
115
// individual tests.
122
116
func skipUnsupportedTest (driver TestDriver , pattern testpatterns.TestPattern ) {
123
117
dInfo := driver .GetDriverInfo ()
@@ -170,54 +164,52 @@ func skipUnsupportedTest(driver TestDriver, pattern testpatterns.TestPattern) {
170
164
driver .SkipUnsupportedTest (pattern )
171
165
}
172
166
173
- // genericVolumeTestResource is a generic implementation of TestResource that wil be able to
167
+ // VolumeResource is a generic implementation of TestResource that wil be able to
174
168
// be used in most of TestSuites.
175
169
// See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource.
176
170
// Also, see subpath.go in the same directory for how to extend and use it.
177
- type genericVolumeTestResource struct {
178
- driver TestDriver
179
- config * PerTestConfig
180
- pattern testpatterns.TestPattern
181
- volType string
182
- volSource * v1.VolumeSource
183
- pvc * v1.PersistentVolumeClaim
184
- pv * v1.PersistentVolume
185
- sc * storagev1.StorageClass
186
-
187
- volume TestVolume
171
+ type VolumeResource struct {
172
+ Config * PerTestConfig
173
+ Pattern testpatterns.TestPattern
174
+ VolType string
175
+ VolSource * v1.VolumeSource
176
+ Pvc * v1.PersistentVolumeClaim
177
+ Pv * v1.PersistentVolume
178
+ Sc * storagev1.StorageClass
179
+
180
+ Volume TestVolume
188
181
}
189
182
190
- var _ TestResource = & genericVolumeTestResource {}
191
-
192
- func createGenericVolumeTestResource (driver TestDriver , config * PerTestConfig , pattern testpatterns.TestPattern , testVolumeSizeRange volume.SizeRange ) * genericVolumeTestResource {
193
- r := genericVolumeTestResource {
194
- driver : driver ,
195
- config : config ,
196
- pattern : pattern ,
183
+ // CreateVolumeResource constructs a VolumeResource for the current test. It knows how to deal with
184
+ // different test pattern volume types.
185
+ func CreateVolumeResource (driver TestDriver , config * PerTestConfig , pattern testpatterns.TestPattern , testVolumeSizeRange volume.SizeRange ) * VolumeResource {
186
+ r := VolumeResource {
187
+ Config : config ,
188
+ Pattern : pattern ,
197
189
}
198
190
dInfo := driver .GetDriverInfo ()
199
191
f := config .Framework
200
192
cs := f .ClientSet
201
193
202
194
// Create volume for pre-provisioned volume tests
203
- r .volume = CreateVolume (driver , config , pattern .VolType )
195
+ r .Volume = CreateVolume (driver , config , pattern .VolType )
204
196
205
197
switch pattern .VolType {
206
198
case testpatterns .InlineVolume :
207
199
framework .Logf ("Creating resource for inline volume" )
208
200
if iDriver , ok := driver .(InlineVolumeTestDriver ); ok {
209
- r .volSource = iDriver .GetVolumeSource (false , pattern .FsType , r .volume )
210
- r .volType = dInfo .Name
201
+ r .VolSource = iDriver .GetVolumeSource (false , pattern .FsType , r .Volume )
202
+ r .VolType = dInfo .Name
211
203
}
212
204
case testpatterns .PreprovisionedPV :
213
205
framework .Logf ("Creating resource for pre-provisioned PV" )
214
206
if pDriver , ok := driver .(PreprovisionedPVTestDriver ); ok {
215
- pvSource , volumeNodeAffinity := pDriver .GetPersistentVolumeSource (false , pattern .FsType , r .volume )
207
+ pvSource , volumeNodeAffinity := pDriver .GetPersistentVolumeSource (false , pattern .FsType , r .Volume )
216
208
if pvSource != nil {
217
- r .pv , r .pvc = createPVCPV (f , dInfo .Name , pvSource , volumeNodeAffinity , pattern .VolMode , dInfo .RequiredAccessModes )
218
- r .volSource = createVolumeSource (r .pvc .Name , false /* readOnly */ )
209
+ r .Pv , r .Pvc = createPVCPV (f , dInfo .Name , pvSource , volumeNodeAffinity , pattern .VolMode , dInfo .RequiredAccessModes )
210
+ r .VolSource = createVolumeSource (r .Pvc .Name , false /* readOnly */ )
219
211
}
220
- r .volType = fmt .Sprintf ("%s-preprovisionedPV" , dInfo .Name )
212
+ r .VolType = fmt .Sprintf ("%s-preprovisionedPV" , dInfo .Name )
221
213
}
222
214
case testpatterns .DynamicPV :
223
215
framework .Logf ("Creating resource for dynamic PV" )
@@ -227,32 +219,44 @@ func createGenericVolumeTestResource(driver TestDriver, config *PerTestConfig, p
227
219
claimSize , err := getSizeRangesIntersection (testVolumeSizeRange , driverVolumeSizeRange )
228
220
framework .ExpectNoError (err , "determine intersection of test size range %+v and driver size range %+v" , testVolumeSizeRange , driverVolumeSizeRange )
229
221
framework .Logf ("Using claimSize:%s, test suite supported size:%v, driver(%s) supported size:%v " , claimSize , testVolumeSizeRange , dDriver .GetDriverInfo ().Name , testVolumeSizeRange )
230
- r .sc = dDriver .GetDynamicProvisionStorageClass (r .config , pattern .FsType )
222
+ r .Sc = dDriver .GetDynamicProvisionStorageClass (r .Config , pattern .FsType )
231
223
232
224
if pattern .BindingMode != "" {
233
- r .sc .VolumeBindingMode = & pattern .BindingMode
225
+ r .Sc .VolumeBindingMode = & pattern .BindingMode
234
226
}
235
227
if pattern .AllowExpansion != false {
236
- r .sc .AllowVolumeExpansion = & pattern .AllowExpansion
228
+ r .Sc .AllowVolumeExpansion = & pattern .AllowExpansion
237
229
}
238
230
239
- ginkgo .By ("creating a StorageClass " + r .sc .Name )
231
+ ginkgo .By ("creating a StorageClass " + r .Sc .Name )
240
232
241
- r .sc , err = cs .StorageV1 ().StorageClasses ().Create (r .sc )
233
+ r .Sc , err = cs .StorageV1 ().StorageClasses ().Create (r .Sc )
242
234
framework .ExpectNoError (err )
243
235
244
- if r .sc != nil {
245
- r .pv , r .pvc = createPVCPVFromDynamicProvisionSC (
246
- f , dInfo .Name , claimSize , r .sc , pattern .VolMode , dInfo .RequiredAccessModes )
247
- r .volSource = createVolumeSource (r .pvc .Name , false /* readOnly */ )
236
+ if r .Sc != nil {
237
+ r .Pv , r .Pvc = createPVCPVFromDynamicProvisionSC (
238
+ f , dInfo .Name , claimSize , r .Sc , pattern .VolMode , dInfo .RequiredAccessModes )
239
+ r .VolSource = createVolumeSource (r .Pvc .Name , false /* readOnly */ )
240
+ }
241
+ r .VolType = fmt .Sprintf ("%s-dynamicPV" , dInfo .Name )
242
+ }
243
+ case testpatterns .CSIInlineVolume :
244
+ framework .Logf ("Creating resource for CSI ephemeral inline volume" )
245
+ if eDriver , ok := driver .(EphemeralTestDriver ); ok {
246
+ r .VolType = fmt .Sprintf ("%s-ephemeral" , dInfo .Name )
247
+ attributes , _ , _ := eDriver .GetVolume (config , 0 )
248
+ r .VolSource = & v1.VolumeSource {
249
+ CSI : & v1.CSIVolumeSource {
250
+ Driver : eDriver .GetCSIDriverName (config ),
251
+ VolumeAttributes : attributes ,
252
+ },
248
253
}
249
- r .volType = fmt .Sprintf ("%s-dynamicPV" , dInfo .Name )
250
254
}
251
255
default :
252
- framework .Failf ("genericVolumeTestResource doesn't support: %s" , pattern .VolType )
256
+ framework .Failf ("VolumeResource doesn't support: %s" , pattern .VolType )
253
257
}
254
258
255
- if r .volSource == nil {
259
+ if r .VolSource == nil {
256
260
framework .Skipf ("Driver %s doesn't support %v -- skipping" , dInfo .Name , pattern .VolType )
257
261
}
258
262
@@ -269,52 +273,52 @@ func createVolumeSource(pvcName string, readOnly bool) *v1.VolumeSource {
269
273
270
274
}
271
275
272
- // cleanupResource cleans up genericVolumeTestResource
273
- func (r * genericVolumeTestResource ) cleanupResource () error {
274
- f := r .config .Framework
276
+ // CleanupResource cleans up VolumeResource
277
+ func (r * VolumeResource ) CleanupResource () error {
278
+ f := r .Config .Framework
275
279
var cleanUpErrs []error
276
- if r .pvc != nil || r .pv != nil {
277
- switch r .pattern .VolType {
280
+ if r .Pvc != nil || r .Pv != nil {
281
+ switch r .Pattern .VolType {
278
282
case testpatterns .PreprovisionedPV :
279
283
ginkgo .By ("Deleting pv and pvc" )
280
- if errs := e2epv .PVPVCCleanup (f .ClientSet , f .Namespace .Name , r .pv , r .pvc ); len (errs ) != 0 {
284
+ if errs := e2epv .PVPVCCleanup (f .ClientSet , f .Namespace .Name , r .Pv , r .Pvc ); len (errs ) != 0 {
281
285
framework .Failf ("Failed to delete PVC or PV: %v" , utilerrors .NewAggregate (errs ))
282
286
}
283
287
case testpatterns .DynamicPV :
284
288
ginkgo .By ("Deleting pvc" )
285
289
// We only delete the PVC so that PV (and disk) can be cleaned up by dynamic provisioner
286
- if r .pv != nil && r .pv .Spec .PersistentVolumeReclaimPolicy != v1 .PersistentVolumeReclaimDelete {
290
+ if r .Pv != nil && r .Pv .Spec .PersistentVolumeReclaimPolicy != v1 .PersistentVolumeReclaimDelete {
287
291
framework .Failf ("Test framework does not currently support Dynamically Provisioned Persistent Volume %v specified with reclaim policy that isnt %v" ,
288
- r .pv .Name , v1 .PersistentVolumeReclaimDelete )
292
+ r .Pv .Name , v1 .PersistentVolumeReclaimDelete )
289
293
}
290
- if r .pvc != nil {
291
- err := e2epv .DeletePersistentVolumeClaim (f .ClientSet , r .pvc .Name , f .Namespace .Name )
294
+ if r .Pvc != nil {
295
+ err := e2epv .DeletePersistentVolumeClaim (f .ClientSet , r .Pvc .Name , f .Namespace .Name )
292
296
if err != nil {
293
- cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err , "Failed to delete PVC %v" , r .pvc .Name ))
297
+ cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err , "Failed to delete PVC %v" , r .Pvc .Name ))
294
298
}
295
- if r .pv != nil {
296
- err = framework .WaitForPersistentVolumeDeleted (f .ClientSet , r .pv .Name , 5 * time .Second , 5 * time .Minute )
299
+ if r .Pv != nil {
300
+ err = framework .WaitForPersistentVolumeDeleted (f .ClientSet , r .Pv .Name , 5 * time .Second , 5 * time .Minute )
297
301
if err != nil {
298
302
cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err ,
299
- "Persistent Volume %v not deleted by dynamic provisioner" , r .pv .Name ))
303
+ "Persistent Volume %v not deleted by dynamic provisioner" , r .Pv .Name ))
300
304
}
301
305
}
302
306
}
303
307
default :
304
- framework .Failf ("Found PVC (%v) or PV (%v) but not running Preprovisioned or Dynamic test pattern" , r .pvc , r .pv )
308
+ framework .Failf ("Found PVC (%v) or PV (%v) but not running Preprovisioned or Dynamic test pattern" , r .Pvc , r .Pv )
305
309
}
306
310
}
307
311
308
- if r .sc != nil {
312
+ if r .Sc != nil {
309
313
ginkgo .By ("Deleting sc" )
310
- if err := deleteStorageClass (f .ClientSet , r .sc .Name ); err != nil {
311
- cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err , "Failed to delete StorageClass %v" , r .sc .Name ))
314
+ if err := deleteStorageClass (f .ClientSet , r .Sc .Name ); err != nil {
315
+ cleanUpErrs = append (cleanUpErrs , errors .Wrapf (err , "Failed to delete StorageClass %v" , r .Sc .Name ))
312
316
}
313
317
}
314
318
315
319
// Cleanup volume for pre-provisioned volume tests
316
- if r .volume != nil {
317
- if err := tryFunc (r .volume .DeleteVolume ); err != nil {
320
+ if r .Volume != nil {
321
+ if err := tryFunc (r .Volume .DeleteVolume ); err != nil {
318
322
cleanUpErrs = append (cleanUpErrs , errors .Wrap (err , "Failed to delete Volume" ))
319
323
}
320
324
}
0 commit comments