Add an option to external storage e2es to use a copy of a pre-installed StorageClass

Change-Id: I9d7f0384d0071caa41a8d98eea4afa5b17ad0ea3
This commit is contained in:
Michelle Au 2020-02-03 16:05:47 -08:00
parent 845b232321
commit 0c40daddb0
2 changed files with 33 additions and 24 deletions

View File

@ -7,11 +7,11 @@ go_library(
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//staging/src/k8s.io/api/storage/v1:go_default_library", "//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/apis/meta/v1/unstructured:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime: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/runtime/schema:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets: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", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
"//test/e2e/framework:go_default_library", "//test/e2e/framework:go_default_library",
"//test/e2e/framework/config:go_default_library", "//test/e2e/framework/config:go_default_library",

View File

@ -23,11 +23,11 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
storagev1 "k8s.io/api/storage/v1" 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/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apiserver/pkg/storage/names"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/framework/config" "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 // This can be used when the storage class is meant to have
// additional parameters. // additional parameters.
FromFile string 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. // SnapshotClass must be set to enable snapshotting tests.
@ -233,7 +237,7 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern)
case "": case "":
supported = true supported = true
case testpatterns.DynamicPV: case testpatterns.DynamicPV:
if d.StorageClass.FromName || d.StorageClass.FromFile != "" { if d.StorageClass.FromName || d.StorageClass.FromFile != "" || d.StorageClass.FromExistingClassName != "" {
supported = true supported = true
} }
case testpatterns.CSIInlineVolume: case testpatterns.CSIInlineVolume:
@ -258,19 +262,21 @@ func (d *driverDefinition) SkipUnsupportedTest(pattern testpatterns.TestPattern)
} }
func (d *driverDefinition) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass { func (d *driverDefinition) GetDynamicProvisionStorageClass(config *testsuites.PerTestConfig, fsType string) *storagev1.StorageClass {
var (
sc *storagev1.StorageClass
err error
)
f := config.Framework f := config.Framework
if d.StorageClass.FromName { switch {
provisioner := d.DriverInfo.Name case d.StorageClass.FromName:
parameters := map[string]string{} sc = &storagev1.StorageClass{Provisioner: d.DriverInfo.Name}
ns := f.Namespace.Name case d.StorageClass.FromExistingClassName != "":
suffix := provisioner + "-sc" sc, err = f.ClientSet.StorageV1().StorageClasses().Get(d.StorageClass.FromExistingClassName, metav1.GetOptions{})
if fsType != "" { framework.ExpectNoError(err, "getting storage class %s", d.StorageClass.FromExistingClassName)
parameters["csi.storage.k8s.io/fstype"] = fsType case d.StorageClass.FromFile != "":
} var ok bool
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
items, err := utils.LoadFromManifests(d.StorageClass.FromFile) items, err := utils.LoadFromManifests(d.StorageClass.FromFile)
framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile) framework.ExpectNoError(err, "load storage class from %s", d.StorageClass.FromFile)
@ -279,18 +285,21 @@ func (d *driverDefinition) GetDynamicProvisionStorageClass(config *testsuites.Pe
err = utils.PatchItems(f, items...) err = utils.PatchItems(f, items...)
framework.ExpectNoError(err, "patch items") framework.ExpectNoError(err, "patch items")
sc, ok := items[0].(*storagev1.StorageClass) sc, ok = items[0].(*storagev1.StorageClass)
framework.ExpectEqual(ok, true, "storage class from %s", d.StorageClass.FromFile) 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 + "-") framework.ExpectNotEqual(sc, nil, "storage class is unexpectantly nil")
if fsType != "" { if fsType != "" {
if sc.Parameters == nil { if sc.Parameters == nil {
sc.Parameters = map[string]string{} 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 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 { func (d *driverDefinition) GetSnapshotClass(config *testsuites.PerTestConfig) *unstructured.Unstructured {