diff --git a/test/e2e/storage/external/BUILD b/test/e2e/storage/external/BUILD index 324c3ed0f8f..b87cd0d4ff1 100644 --- a/test/e2e/storage/external/BUILD +++ b/test/e2e/storage/external/BUILD @@ -7,11 +7,11 @@ go_library( visibility = ["//visibility:public"], deps = [ "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//test/e2e/framework:go_default_library", "//test/e2e/framework/config:go_default_library", diff --git a/test/e2e/storage/external/external.go b/test/e2e/storage/external/external.go index 04b058556b7..fdeb760efd6 100644 --- a/test/e2e/storage/external/external.go +++ b/test/e2e/storage/external/external.go @@ -23,11 +23,11 @@ import ( "github.com/pkg/errors" storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apiserver/pkg/storage/names" "k8s.io/client-go/kubernetes/scheme" "k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework/config" @@ -69,6 +69,10 @@ type driverDefinition struct { // This can be used when the storage class is meant to have // additional parameters. FromFile string + + // FromExistingClassName specifies the name of a pre-installed + // StorageClass that will be copied and used for the tests. + FromExistingClassName string } // SnapshotClass must be set to enable snapshotting tests. @@ -233,7 +237,7 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern) case "": supported = true case testpatterns.DynamicPV: - if d.StorageClass.FromName || d.StorageClass.FromFile != "" { + if d.StorageClass.FromName || d.StorageClass.FromFile != "" || d.StorageClass.FromExistingClassName != "" { supported = true } case testpatterns.CSIInlineVolume: @@ -258,39 +262,44 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern) } func (d *driverDefinition) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { + var ( + sc *storagev1.StorageClass + err error + ) + f := config.Framework - if d.StorageClass.FromName { - provisioner := d.DriverInfo.Name - parameters := map[string]string{} - ns := f.Namespace.Name - suffix := provisioner + "-sc" - if fsType != "" { - parameters["csi.storage.k8s.io/fstype"] = fsType - } + switch { + case d.StorageClass.FromName: + sc = &storagev1.StorageClass{Provisioner: d.DriverInfo.Name} + case d.StorageClass.FromExistingClassName != "": + sc, err = f.ClientSet.StorageV1().StorageClasses().Get(d.StorageClass.FromExistingClassName, metav1.GetOptions{}) + framework.ExpectNoError(err, "getting storage class %s", d.StorageClass.FromExistingClassName) + case d.StorageClass.FromFile != "": + var ok bool - return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix) + items, err := utils.LoadFromManifests(d.StorageClass.FromFile) + framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile) + framework.ExpectEqual(len(items), 1, "exactly one item from %s", d.StorageClass.FromFile) + + err = utils.PatchItems(f, items...) + framework.ExpectNoError(err, "patch items") + + sc, ok = items[0].(*storagev1.StorageClass) + framework.ExpectEqual(ok, true, "storage class from %s", d.StorageClass.FromFile) } - items, err := utils.LoadFromManifests(d.StorageClass.FromFile) - framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile) - framework.ExpectEqual(len(items), 1, "exactly one item from %s", d.StorageClass.FromFile) + framework.ExpectNotEqual(sc, nil, "storage class is unexpectantly nil") - err = utils.PatchItems(f, items...) - framework.ExpectNoError(err, "patch items") - - sc, ok := items[0].(*storagev1.StorageClass) - framework.ExpectEqual(ok, true, "storage class from %s", d.StorageClass.FromFile) - // Ensure that we can load more than once as required for - // GetDynamicProvisionStorageClass by adding a random suffix. - sc.Name = names.SimpleNameGenerator.GenerateName(sc.Name + "-") if fsType != "" { if sc.Parameters == nil { sc.Parameters = map[string]string{} } + // This limits the external storage test suite to only CSI drivers, which may need to be + // reconsidered if we eventually need to move in-tree storage tests out. sc.Parameters["csi.storage.k8s.io/fstype"] = fsType } - return sc + return testsuites.GetStorageClass(sc.Provisioner, sc.Parameters, sc.VolumeBindingMode, f.Namespace.Name, "e2e-sc") } func (d *driverDefinition) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured {