Skip to content

Commit 0c40dad

Browse files
committed
Add an option to external storage e2es to use a copy of a pre-installed StorageClass
Change-Id: I9d7f0384d0071caa41a8d98eea4afa5b17ad0ea3
1 parent 845b232 commit 0c40dad

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

test/e2e/storage/external/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ go_library(
77
visibility = ["//visibility:public"],
88
deps = [
99
"//staging/src/k8s.io/api/storage/v1:go_default_library",
10+
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
1011
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
1112
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
1213
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
1314
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
14-
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
1515
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
1616
"//test/e2e/framework:go_default_library",
1717
"//test/e2e/framework/config:go_default_library",

test/e2e/storage/external/external.go

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ import (
2323
"github.com/pkg/errors"
2424

2525
storagev1 "k8s.io/api/storage/v1"
26+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2627
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2728
"k8s.io/apimachinery/pkg/runtime"
2829
"k8s.io/apimachinery/pkg/runtime/schema"
2930
"k8s.io/apimachinery/pkg/util/sets"
30-
"k8s.io/apiserver/pkg/storage/names"
3131
"k8s.io/client-go/kubernetes/scheme"
3232
"k8s.io/kubernetes/test/e2e/framework"
3333
"k8s.io/kubernetes/test/e2e/framework/config"
@@ -69,6 +69,10 @@ type driverDefinition struct {
6969
// This can be used when the storage class is meant to have
7070
// additional parameters.
7171
FromFile string
72+
73+
// FromExistingClassName specifies the name of a pre-installed
74+
// StorageClass that will be copied and used for the tests.
75+
FromExistingClassName string
7276
}
7377

7478
// SnapshotClass must be set to enable snapshotting tests.
@@ -233,7 +237,7 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern)
233237
case "":
234238
supported = true
235239
case testpatterns.DynamicPV:
236-
if d.StorageClass.FromName || d.StorageClass.FromFile != "" {
240+
if d.StorageClass.FromName || d.StorageClass.FromFile != "" || d.StorageClass.FromExistingClassName != "" {
237241
supported = true
238242
}
239243
case testpatterns.CSIInlineVolume:
@@ -258,39 +262,44 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern)
258262
}
259263

260264
func (d *driverDefinition) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass {
265+
var (
266+
sc *storagev1.StorageClass
267+
err error
268+
)
269+
261270
f := config.Framework
262271

263-
if d.StorageClass.FromName {
264-
provisioner := d.DriverInfo.Name
265-
parameters := map[string]string{}
266-
ns := f.Namespace.Name
267-
suffix := provisioner + "-sc"
268-
if fsType != "" {
269-
parameters["csi.storage.k8s.io/fstype"] = fsType
270-
}
272+
switch {
273+
case d.StorageClass.FromName:
274+
sc = &storagev1.StorageClass{Provisioner: d.DriverInfo.Name}
275+
case d.StorageClass.FromExistingClassName != "":
276+
sc, err = f.ClientSet.StorageV1().StorageClasses().Get(d.StorageClass.FromExistingClassName, metav1.GetOptions{})
277+
framework.ExpectNoError(err, "getting storage class %s", d.StorageClass.FromExistingClassName)
278+
case d.StorageClass.FromFile != "":
279+
var ok bool
271280

272-
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
273-
}
281+
items, err := utils.LoadFromManifests(d.StorageClass.FromFile)
282+
framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile)
283+
framework.ExpectEqual(len(items), 1, "exactly one item from %s", d.StorageClass.FromFile)
284+
285+
err = utils.PatchItems(f, items...)
286+
framework.ExpectNoError(err, "patch items")
274287

275-
items, err := utils.LoadFromManifests(d.StorageClass.FromFile)
276-
framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile)
277-
framework.ExpectEqual(len(items), 1, "exactly one item from %s", d.StorageClass.FromFile)
288+
sc, ok = items[0].(*storagev1.StorageClass)
289+
framework.ExpectEqual(ok, true, "storage class from %s", d.StorageClass.FromFile)
290+
}
278291

279-
err = utils.PatchItems(f, items...)
280-
framework.ExpectNoError(err, "patch items")
292+
framework.ExpectNotEqual(sc, nil, "storage class is unexpectantly nil")
281293

282-
sc, ok := items[0].(*storagev1.StorageClass)
283-
framework.ExpectEqual(ok, true, "storage class from %s", d.StorageClass.FromFile)
284-
// Ensure that we can load more than once as required for
285-
// GetDynamicProvisionStorageClass by adding a random suffix.
286-
sc.Name = names.SimpleNameGenerator.GenerateName(sc.Name + "-")
287294
if fsType != "" {
288295
if sc.Parameters == nil {
289296
sc.Parameters = map[string]string{}
290297
}
298+
// This limits the external storage test suite to only CSI drivers, which may need to be
299+
// reconsidered if we eventually need to move in-tree storage tests out.
291300
sc.Parameters["csi.storage.k8s.io/fstype"] = fsType
292301
}
293-
return sc
302+
return testsuites.GetStorageClass(sc.Provisioner, sc.Parameters, sc.VolumeBindingMode, f.Namespace.Name, "e2e-sc")
294303
}
295304

296305
func (d *driverDefinition) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured {

0 commit comments

Comments
 (0)