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"],
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",

View File

@ -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 {