From 0c40daddb0c75a635609cff7d4e473cd88014c77 Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Mon, 3 Feb 2020 16:05:47 -0800 Subject: [PATCH] Add an option to external storage e2es to use a copy of a pre-installed StorageClass Change-Id: I9d7f0384d0071caa41a8d98eea4afa5b17ad0ea3 --- test/e2e/storage/external/BUILD | 2 +- test/e2e/storage/external/external.go | 55 ++++++++++++++++----------- 2 files changed, 33 insertions(+), 24 deletions(-) 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 {