Merge pull request #70862 from pohly/e2e-storage-tests

e2e storage tests: usable out-of-tree
pull/564/head
Kubernetes Prow Robot 2018-12-21 16:03:41 -08:00 committed by GitHub
commit e3bf5dbc5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 622 additions and 550 deletions

View File

@ -43,11 +43,11 @@ import (
)
// List of testDrivers to be executed in below loop
var csiTestDrivers = []func() drivers.TestDriver{
var csiTestDrivers = []func(config testsuites.TestConfig) testsuites.TestDriver{
drivers.InitHostPathCSIDriver,
drivers.InitGcePDCSIDriver,
drivers.InitGcePDExternalCSIDriver,
drivers.InitHostV0PathCSIDriver,
drivers.InitHostPathV0CSIDriver,
}
// List of testSuites to be executed in below loop
@ -81,7 +81,11 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
cancel context.CancelFunc
cs clientset.Interface
ns *v1.Namespace
config framework.VolumeTestConfig
// Common configuration options for each driver.
config = testsuites.TestConfig{
Framework: f,
Prefix: "csi",
}
)
BeforeEach(func() {
@ -89,10 +93,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
cancel = c
cs = f.ClientSet
ns = f.Namespace
config = framework.VolumeTestConfig{
Namespace: ns.Name,
Prefix: "csi",
}
// Debugging of the following tests heavily depends on the log output
// of the different containers. Therefore include all of that in log
// files (when using --report-dir, as in the CI) or the output stream
@ -125,13 +126,12 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
})
for _, initDriver := range csiTestDrivers {
curDriver := initDriver()
Context(drivers.GetDriverNameWithFeatureTags(curDriver), func() {
curDriver := initDriver(config)
Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() {
driver := curDriver
BeforeEach(func() {
// setupDriver
drivers.SetCommonDriverParameters(driver, f, config)
driver.CreateDriver()
})
@ -140,7 +140,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
driver.CleanupDriver()
})
testsuites.RunTestSuite(f, config, driver, csiTestSuites, csiTunePattern)
testsuites.RunTestSuite(f, driver, csiTestSuites, csiTunePattern)
})
}
@ -149,14 +149,17 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
var (
cs clientset.Interface
csics csiclient.Interface
driver drivers.TestDriver
driver testsuites.TestDriver
)
BeforeEach(func() {
cs = f.ClientSet
csics = f.CSIClientSet
driver = drivers.InitHostPathCSIDriver()
drivers.SetCommonDriverParameters(driver, f, config)
config := testsuites.TestConfig{
Framework: f,
Prefix: "csi-attach",
}
driver = drivers.InitHostPathCSIDriver(config)
driver.CreateDriver()
})
@ -193,7 +196,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
test := t
It(test.name, func() {
if test.driverExists {
csiDriver := createCSIDriver(csics, drivers.GetUniqueDriverName(driver), test.driverAttachable)
csiDriver := createCSIDriver(csics, testsuites.GetUniqueDriverName(driver), test.driverAttachable)
if csiDriver != nil {
defer csics.CsiV1alpha1().CSIDrivers().Delete(csiDriver.Name, nil)
}
@ -201,7 +204,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
By("Creating pod")
var sc *storagev1.StorageClass
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
if dDriver, ok := driver.(testsuites.DynamicPVTestDriver); ok {
sc = dDriver.GetDynamicProvisionStorageClass("")
}
nodeName := driver.GetDriverInfo().Config.ClientNodeName

View File

@ -3,7 +3,6 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = [
"base.go",
"csi.go",
"csi_objects.go",
"in_tree.go",
@ -24,6 +23,7 @@ go_library(
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
"//test/e2e/framework:go_default_library",
"//test/e2e/storage/testpatterns:go_default_library",
"//test/e2e/storage/testsuites:go_default_library",
"//test/e2e/storage/utils:go_default_library",
"//test/e2e/storage/vsphere:go_default_library",
"//test/utils/image:go_default_library",

View File

@ -44,74 +44,42 @@ import (
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
"k8s.io/kubernetes/test/e2e/storage/testsuites"
"k8s.io/kubernetes/test/e2e/storage/utils"
)
// hostpathCSI
type hostpathCSIDriver struct {
cleanup func()
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
manifests []string
}
var _ TestDriver = &hostpathCSIDriver{}
var _ DynamicPVTestDriver = &hostpathCSIDriver{}
// InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface
func InitHostPathCSIDriver() TestDriver {
func initHostPathCSIDriver(name string, config testsuites.TestConfig, manifests ...string) testsuites.TestDriver {
return &hostpathCSIDriver{
driverInfo: DriverInfo{
Name: "csi-hostpath",
driverInfo: testsuites.DriverInfo{
Name: name,
FeatureTag: "",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapPersistence: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
},
Config: config,
},
manifests: manifests,
}
}
func (h *hostpathCSIDriver) GetDriverInfo() *DriverInfo {
return &h.driverInfo
}
var _ testsuites.TestDriver = &hostpathCSIDriver{}
var _ testsuites.DynamicPVTestDriver = &hostpathCSIDriver{}
func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
provisioner := GetUniqueDriverName(h)
parameters := map[string]string{}
ns := h.driverInfo.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", provisioner)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (h *hostpathCSIDriver) CreateDriver() {
By("deploying csi hostpath driver")
f := h.driverInfo.Framework
cs := f.ClientSet
// pods should be scheduled on the node
nodes := framework.GetReadySchedulableNodesOrDie(cs)
node := nodes.Items[rand.Intn(len(nodes.Items))]
h.driverInfo.Config.ClientNodeName = node.Name
h.driverInfo.Config.ServerNodeName = node.Name
// TODO (?): the storage.csi.image.version and storage.csi.image.registry
// settings are ignored for this test. We could patch the image definitions.
o := utils.PatchCSIOptions{
OldDriverName: h.driverInfo.Name,
NewDriverName: GetUniqueDriverName(h),
DriverContainerName: "hostpath",
ProvisionerContainerName: "csi-provisioner",
NodeName: h.driverInfo.Config.ServerNodeName,
}
cleanup, err := h.driverInfo.Framework.CreateFromManifests(func(item interface{}) error {
return utils.PatchCSIDeployment(h.driverInfo.Framework, o, item)
},
// InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface
func InitHostPathCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return initHostPathCSIDriver("csi-hostpath", config,
"test/e2e/testing-manifests/storage-csi/driver-registrar/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml",
@ -120,84 +88,67 @@ func (h *hostpathCSIDriver) CreateDriver() {
"test/e2e/testing-manifests/storage-csi/hostpath/hostpath/csi-hostpathplugin.yaml",
"test/e2e/testing-manifests/storage-csi/hostpath/hostpath/e2e-test-rbac.yaml",
)
h.cleanup = cleanup
if err != nil {
framework.Failf("deploying csi hostpath driver: %v", err)
}
}
func (h *hostpathCSIDriver) CleanupDriver() {
if h.cleanup != nil {
By("uninstalling csi hostpath driver")
h.cleanup()
}
}
// hostpathV0CSIDriver
type hostpathV0CSIDriver struct {
cleanup func()
driverInfo DriverInfo
}
var _ TestDriver = &hostpathV0CSIDriver{}
var _ DynamicPVTestDriver = &hostpathV0CSIDriver{}
// InitHostPathV0CSIDriver returns hostpathV0CSIDriver that implements TestDriver interface
func InitHostV0PathCSIDriver() TestDriver {
return &hostpathV0CSIDriver{
driverInfo: DriverInfo{
Name: "csi-hostpath-v0",
FeatureTag: "",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapPersistence: true,
},
},
}
}
func (h *hostpathV0CSIDriver) GetDriverInfo() *DriverInfo {
func (h *hostpathCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
return &h.driverInfo
}
func (h *hostpathV0CSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (h *hostpathV0CSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
provisioner := GetUniqueDriverName(h)
func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
provisioner := testsuites.GetUniqueDriverName(h)
parameters := map[string]string{}
ns := h.driverInfo.Framework.Namespace.Name
ns := h.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", provisioner)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (h *hostpathV0CSIDriver) CreateDriver() {
By("deploying csi hostpath v0 driver")
f := h.driverInfo.Framework
func (h *hostpathCSIDriver) GetClaimSize() string {
return "5Gi"
}
func (h *hostpathCSIDriver) CreateDriver() {
By(fmt.Sprintf("deploying %s driver", h.driverInfo.Name))
f := h.driverInfo.Config.Framework
cs := f.ClientSet
// pods should be scheduled on the node
// The hostpath CSI driver only works when everything runs on the same node.
nodes := framework.GetReadySchedulableNodesOrDie(cs)
node := nodes.Items[rand.Intn(len(nodes.Items))]
h.driverInfo.Config.ClientNodeName = node.Name
h.driverInfo.Config.ServerNodeName = node.Name
nodeName := nodes.Items[rand.Intn(len(nodes.Items))].Name
h.driverInfo.Config.ClientNodeName = nodeName
// TODO (?): the storage.csi.image.version and storage.csi.image.registry
// settings are ignored for this test. We could patch the image definitions.
o := utils.PatchCSIOptions{
OldDriverName: h.driverInfo.Name,
NewDriverName: GetUniqueDriverName(h),
NewDriverName: testsuites.GetUniqueDriverName(h),
DriverContainerName: "hostpath",
ProvisionerContainerName: "csi-provisioner-v0",
NodeName: h.driverInfo.Config.ServerNodeName,
ProvisionerContainerName: "csi-provisioner",
NodeName: nodeName,
}
cleanup, err := h.driverInfo.Framework.CreateFromManifests(func(item interface{}) error {
return utils.PatchCSIDeployment(h.driverInfo.Framework, o, item)
cleanup, err := h.driverInfo.Config.Framework.CreateFromManifests(func(item interface{}) error {
return utils.PatchCSIDeployment(h.driverInfo.Config.Framework, o, item)
},
h.manifests...)
h.cleanup = cleanup
if err != nil {
framework.Failf("deploying %s driver: %v", h.driverInfo.Name, err)
}
}
func (h *hostpathCSIDriver) CleanupDriver() {
if h.cleanup != nil {
By(fmt.Sprintf("uninstalling %s driver", h.driverInfo.Name))
h.cleanup()
}
}
// InitHostPathV0CSIDriver returns a variant of hostpathCSIDriver with different manifests.
func InitHostPathV0CSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return initHostPathCSIDriver("csi-hostpath-v0", config,
"test/e2e/testing-manifests/storage-csi/driver-registrar/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml",
@ -206,32 +157,21 @@ func (h *hostpathV0CSIDriver) CreateDriver() {
"test/e2e/testing-manifests/storage-csi/hostpath/hostpath-v0/csi-hostpathplugin.yaml",
"test/e2e/testing-manifests/storage-csi/hostpath/hostpath-v0/e2e-test-rbac.yaml",
)
h.cleanup = cleanup
if err != nil {
framework.Failf("deploying csi hostpath v0 driver: %v", err)
}
}
func (h *hostpathV0CSIDriver) CleanupDriver() {
if h.cleanup != nil {
By("uninstalling csi hostpath v0 driver")
h.cleanup()
}
}
// gce-pd
type gcePDCSIDriver struct {
cleanup func()
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
var _ TestDriver = &gcePDCSIDriver{}
var _ DynamicPVTestDriver = &gcePDCSIDriver{}
var _ testsuites.TestDriver = &gcePDCSIDriver{}
var _ testsuites.DynamicPVTestDriver = &gcePDCSIDriver{}
// InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface
func InitGcePDCSIDriver() TestDriver {
func InitGcePDCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &gcePDCSIDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "pd.csi.storage.gke.io",
FeatureTag: "[Serial]",
MaxFileSize: testpatterns.FileSizeMedium,
@ -242,33 +182,39 @@ func InitGcePDCSIDriver() TestDriver {
"ext4",
"xfs",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (g *gcePDCSIDriver) GetDriverInfo() *DriverInfo {
func (g *gcePDCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
return &g.driverInfo
}
func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
f := g.driverInfo.Framework
f := g.driverInfo.Config.Framework
framework.SkipUnlessProviderIs("gce", "gke")
framework.SkipIfMultizone(f.ClientSet)
}
func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
ns := g.driverInfo.Framework.Namespace.Name
ns := g.driverInfo.Config.Framework.Namespace.Name
provisioner := g.driverInfo.Name
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
parameters := map[string]string{"type": "pd-standard"}
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (g *gcePDCSIDriver) GetClaimSize() string {
return "5Gi"
}
func (g *gcePDCSIDriver) CreateDriver() {
@ -281,13 +227,13 @@ func (g *gcePDCSIDriver) CreateDriver() {
// These are the options which would have to be used:
// o := utils.PatchCSIOptions{
// OldDriverName: g.driverInfo.Name,
// NewDriverName: GetUniqueDriverName(g),
// NewDriverName: testsuites.GetUniqueDriverName(g),
// DriverContainerName: "gce-driver",
// ProvisionerContainerName: "csi-external-provisioner",
// }
createGCESecrets(g.driverInfo.Framework.ClientSet, g.driverInfo.Config)
createGCESecrets(g.driverInfo.Config.Framework.ClientSet, g.driverInfo.Config.Framework.Namespace.Name)
cleanup, err := g.driverInfo.Framework.CreateFromManifests(nil,
cleanup, err := g.driverInfo.Config.Framework.CreateFromManifests(nil,
"test/e2e/testing-manifests/storage-csi/driver-registrar/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
"test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml",
@ -310,17 +256,18 @@ func (g *gcePDCSIDriver) CleanupDriver() {
// gcePd-external
type gcePDExternalCSIDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
var _ TestDriver = &gcePDExternalCSIDriver{}
var _ DynamicPVTestDriver = &gcePDExternalCSIDriver{}
var _ testsuites.TestDriver = &gcePDExternalCSIDriver{}
var _ testsuites.DynamicPVTestDriver = &gcePDExternalCSIDriver{}
// InitGcePDExternalCSIDriver returns gcePDExternalCSIDriver that implements TestDriver interface
func InitGcePDExternalCSIDriver() TestDriver {
func InitGcePDExternalCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &gcePDExternalCSIDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "pd.csi.storage.gke.io",
// TODO(#70258): this is temporary until we can figure out how to make e2e tests a library
FeatureTag: "[Feature: gcePD-external]",
MaxFileSize: testpatterns.FileSizeMedium,
@ -331,32 +278,38 @@ func InitGcePDExternalCSIDriver() TestDriver {
"ext4",
"xfs",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (g *gcePDExternalCSIDriver) GetDriverInfo() *DriverInfo {
func (g *gcePDExternalCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
return &g.driverInfo
}
func (g *gcePDExternalCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
framework.SkipUnlessProviderIs("gce", "gke")
framework.SkipIfMultizone(g.driverInfo.Framework.ClientSet)
framework.SkipIfMultizone(g.driverInfo.Config.Framework.ClientSet)
}
func (g *gcePDExternalCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
ns := g.driverInfo.Framework.Namespace.Name
ns := g.driverInfo.Config.Framework.Namespace.Name
provisioner := g.driverInfo.Name
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
parameters := map[string]string{"type": "pd-standard"}
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (g *gcePDExternalCSIDriver) GetClaimSize() string {
return "5Gi"
}
func (g *gcePDExternalCSIDriver) CreateDriver() {

View File

@ -80,7 +80,7 @@ func shredFile(filePath string) {
// createGCESecrets downloads the GCP IAM Key for the default compute service account
// and puts it in a secret for the GCE PD CSI Driver to consume
func createGCESecrets(client clientset.Interface, config framework.VolumeTestConfig) {
func createGCESecrets(client clientset.Interface, ns string) {
saEnv := "E2E_GOOGLE_APPLICATION_CREDENTIALS"
saFile := fmt.Sprintf("/tmp/%s/cloud-sa.json", string(uuid.NewUUID()))
@ -107,7 +107,7 @@ func createGCESecrets(client clientset.Interface, config framework.VolumeTestCon
s := &v1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "cloud-sa",
Namespace: config.Namespace,
Namespace: ns,
},
Type: v1.SecretTypeOpaque,
Data: map[string][]byte{
@ -115,7 +115,7 @@ func createGCESecrets(client clientset.Interface, config framework.VolumeTestCon
},
}
_, err = client.CoreV1().Secrets(config.Namespace).Create(s)
_, err = client.CoreV1().Secrets(ns).Create(s)
if !apierrors.IsAlreadyExists(err) {
framework.ExpectNoError(err, "Failed to create Secret %v", s.GetName())
}

View File

@ -55,6 +55,7 @@ import (
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
"k8s.io/kubernetes/test/e2e/storage/testsuites"
"k8s.io/kubernetes/test/e2e/storage/utils"
vspheretest "k8s.io/kubernetes/test/e2e/storage/vsphere"
imageutils "k8s.io/kubernetes/test/utils/image"
@ -65,7 +66,7 @@ type nfsDriver struct {
externalProvisionerPod *v1.Pod
externalPluginName string
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type nfsTestResource struct {
@ -73,16 +74,16 @@ type nfsTestResource struct {
serverPod *v1.Pod
}
var _ TestDriver = &nfsDriver{}
var _ PreprovisionedVolumeTestDriver = &nfsDriver{}
var _ InlineVolumeTestDriver = &nfsDriver{}
var _ PreprovisionedPVTestDriver = &nfsDriver{}
var _ DynamicPVTestDriver = &nfsDriver{}
var _ testsuites.TestDriver = &nfsDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &nfsDriver{}
var _ testsuites.InlineVolumeTestDriver = &nfsDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &nfsDriver{}
var _ testsuites.DynamicPVTestDriver = &nfsDriver{}
// InitNFSDriver returns nfsDriver that implements TestDriver interface
func InitNFSDriver() TestDriver {
func InitNFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &nfsDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "nfs",
MaxFileSize: testpatterns.FileSizeLarge,
SupportedFsType: sets.NewString(
@ -90,15 +91,17 @@ func InitNFSDriver() TestDriver {
),
SupportedMountOption: sets.NewString("proto=tcp", "relatime"),
RequiredMountOption: sets.NewString("vers=4.1"),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (n *nfsDriver) GetDriverInfo() *DriverInfo {
func (n *nfsDriver) GetDriverInfo() *testsuites.DriverInfo {
return &n.driverInfo
}
@ -132,18 +135,25 @@ func (n *nfsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, test
func (n *nfsDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
provisioner := n.externalPluginName
parameters := map[string]string{"mountOptions": "vers=4.1"}
ns := n.driverInfo.Framework.Namespace.Name
ns := n.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", n.driverInfo.Name)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (n *nfsDriver) GetClaimSize() string {
return "5Gi"
}
func (n *nfsDriver) CreateDriver() {
f := n.driverInfo.Framework
f := n.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
n.externalPluginName = fmt.Sprintf("example.com/nfs-%s", ns.Name)
// Reset config. It might have been modified by a previous CreateVolume call.
n.driverInfo.Config.ServerConfig = nil
// TODO(mkimuram): cluster-admin gives too much right but system:persistent-volume-provisioner
// is not enough. We should create new clusterrole for testing.
framework.BindClusterRole(cs.RbacV1beta1(), "cluster-admin", ns.Name,
@ -159,7 +169,7 @@ func (n *nfsDriver) CreateDriver() {
}
func (n *nfsDriver) CleanupDriver() {
f := n.driverInfo.Framework
f := n.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
@ -169,7 +179,7 @@ func (n *nfsDriver) CleanupDriver() {
}
func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := n.driverInfo.Framework
f := n.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
@ -181,7 +191,7 @@ func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
fallthrough
case testpatterns.PreprovisionedPV:
config, serverPod, serverIP := framework.NewNFSServer(cs, ns.Name, []string{})
n.driverInfo.Config = config
n.driverInfo.Config.ServerConfig = &config
return &nfsTestResource{
serverIP: serverIP,
serverPod: serverPod,
@ -195,7 +205,7 @@ func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
}
func (n *nfsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := n.driverInfo.Framework
f := n.driverInfo.Config.Framework
ntr, ok := testResource.(*nfsTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to NFS Test Resource")
@ -214,7 +224,7 @@ func (n *nfsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource
// Gluster
type glusterFSDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type glusterTestResource struct {
@ -222,29 +232,31 @@ type glusterTestResource struct {
serverPod *v1.Pod
}
var _ TestDriver = &glusterFSDriver{}
var _ PreprovisionedVolumeTestDriver = &glusterFSDriver{}
var _ InlineVolumeTestDriver = &glusterFSDriver{}
var _ PreprovisionedPVTestDriver = &glusterFSDriver{}
var _ testsuites.TestDriver = &glusterFSDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &glusterFSDriver{}
var _ testsuites.InlineVolumeTestDriver = &glusterFSDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &glusterFSDriver{}
// InitGlusterFSDriver returns glusterFSDriver that implements TestDriver interface
func InitGlusterFSDriver() TestDriver {
func InitGlusterFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &glusterFSDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "gluster",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (g *glusterFSDriver) GetDriverInfo() *DriverInfo {
func (g *glusterFSDriver) GetDriverInfo() *testsuites.DriverInfo {
return &g.driverInfo
}
@ -286,18 +298,20 @@ func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string
}
func (g *glusterFSDriver) CreateDriver() {
// Reset config. It might have been modified by a previous CreateVolume call.
g.driverInfo.Config.ServerConfig = nil
}
func (g *glusterFSDriver) CleanupDriver() {
}
func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := g.driverInfo.Framework
f := g.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, _ := framework.NewGlusterfsServer(cs, ns.Name)
g.driverInfo.Config = config
g.driverInfo.Config.ServerConfig = &config
return &glusterTestResource{
prefix: config.Prefix,
serverPod: serverPod,
@ -305,7 +319,7 @@ func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) interfa
}
func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := g.driverInfo.Framework
f := g.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
@ -332,22 +346,22 @@ func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testRes
// iSCSI
// The iscsiadm utility and iscsi target kernel modules must be installed on all nodes.
type iSCSIDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type iSCSITestResource struct {
serverPod *v1.Pod
serverIP string
}
var _ TestDriver = &iSCSIDriver{}
var _ PreprovisionedVolumeTestDriver = &iSCSIDriver{}
var _ InlineVolumeTestDriver = &iSCSIDriver{}
var _ PreprovisionedPVTestDriver = &iSCSIDriver{}
var _ testsuites.TestDriver = &iSCSIDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &iSCSIDriver{}
var _ testsuites.InlineVolumeTestDriver = &iSCSIDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &iSCSIDriver{}
// InitISCSIDriver returns iSCSIDriver that implements TestDriver interface
func InitISCSIDriver() TestDriver {
func InitISCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &iSCSIDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "iscsi",
FeatureTag: "[Feature:Volumes]",
MaxFileSize: testpatterns.FileSizeMedium,
@ -358,17 +372,19 @@ func InitISCSIDriver() TestDriver {
//"ext3",
"ext4",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapBlock: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (i *iSCSIDriver) GetDriverInfo() *DriverInfo {
func (i *iSCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
return &i.driverInfo
}
@ -413,18 +429,20 @@ func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, te
}
func (i *iSCSIDriver) CreateDriver() {
// Reset config. It might have been modified by a previous CreateVolume call.
i.driverInfo.Config.ServerConfig = nil
}
func (i *iSCSIDriver) CleanupDriver() {
}
func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := i.driverInfo.Framework
f := i.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, serverIP := framework.NewISCSIServer(cs, ns.Name)
i.driverInfo.Config = config
i.driverInfo.Config.ServerConfig = &config
return &iSCSITestResource{
serverPod: serverPod,
serverIP: serverIP,
@ -432,7 +450,7 @@ func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) interface{}
}
func (i *iSCSIDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := i.driverInfo.Framework
f := i.driverInfo.Config.Framework
itr, ok := testResource.(*iSCSITestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to iSCSI Test Resource")
@ -442,7 +460,7 @@ func (i *iSCSIDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc
// Ceph RBD
type rbdDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type rbdTestResource struct {
@ -451,15 +469,15 @@ type rbdTestResource struct {
secret *v1.Secret
}
var _ TestDriver = &rbdDriver{}
var _ PreprovisionedVolumeTestDriver = &rbdDriver{}
var _ InlineVolumeTestDriver = &rbdDriver{}
var _ PreprovisionedPVTestDriver = &rbdDriver{}
var _ testsuites.TestDriver = &rbdDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &rbdDriver{}
var _ testsuites.InlineVolumeTestDriver = &rbdDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &rbdDriver{}
// InitRbdDriver returns rbdDriver that implements TestDriver interface
func InitRbdDriver() TestDriver {
func InitRbdDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &rbdDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "rbd",
FeatureTag: "[Feature:Volumes]",
MaxFileSize: testpatterns.FileSizeMedium,
@ -470,17 +488,19 @@ func InitRbdDriver() TestDriver {
//"ext3",
"ext4",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapBlock: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (r *rbdDriver) GetDriverInfo() *DriverInfo {
func (r *rbdDriver) GetDriverInfo() *testsuites.DriverInfo {
return &r.driverInfo
}
@ -510,7 +530,7 @@ func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, testResource i
}
func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.PersistentVolumeSource {
f := r.driverInfo.Framework
f := r.driverInfo.Config.Framework
ns := f.Namespace
rtr, ok := testResource.(*rbdTestResource)
@ -536,18 +556,20 @@ func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, test
}
func (r *rbdDriver) CreateDriver() {
// Reset config. It might have been modified by a previous CreateVolume call.
r.driverInfo.Config.ServerConfig = nil
}
func (r *rbdDriver) CleanupDriver() {
}
func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := r.driverInfo.Framework
f := r.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
r.driverInfo.Config = config
r.driverInfo.Config.ServerConfig = &config
return &rbdTestResource{
serverPod: serverPod,
serverIP: serverIP,
@ -556,7 +578,7 @@ func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
}
func (r *rbdDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := r.driverInfo.Framework
f := r.driverInfo.Config.Framework
rtr, ok := testResource.(*rbdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to RBD Test Resource")
@ -570,7 +592,7 @@ type cephFSDriver struct {
serverPod *v1.Pod
secret *v1.Secret
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type cephTestResource struct {
@ -579,30 +601,32 @@ type cephTestResource struct {
secret *v1.Secret
}
var _ TestDriver = &cephFSDriver{}
var _ PreprovisionedVolumeTestDriver = &cephFSDriver{}
var _ InlineVolumeTestDriver = &cephFSDriver{}
var _ PreprovisionedPVTestDriver = &cephFSDriver{}
var _ testsuites.TestDriver = &cephFSDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &cephFSDriver{}
var _ testsuites.InlineVolumeTestDriver = &cephFSDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &cephFSDriver{}
// InitCephFSDriver returns cephFSDriver that implements TestDriver interface
func InitCephFSDriver() TestDriver {
func InitCephFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &cephFSDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "ceph",
FeatureTag: "[Feature:Volumes]",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (c *cephFSDriver) GetDriverInfo() *DriverInfo {
func (c *cephFSDriver) GetDriverInfo() *testsuites.DriverInfo {
return &c.driverInfo
}
@ -626,7 +650,7 @@ func (c *cephFSDriver) GetVolumeSource(readOnly bool, fsType string, testResourc
}
func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.PersistentVolumeSource {
f := c.driverInfo.Framework
f := c.driverInfo.Config.Framework
ns := f.Namespace
ctr, ok := testResource.(*cephTestResource)
@ -646,18 +670,20 @@ func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, t
}
func (c *cephFSDriver) CreateDriver() {
// Reset config. It might have been modified by a previous CreateVolume call.
c.driverInfo.Config.ServerConfig = nil
}
func (c *cephFSDriver) CleanupDriver() {
}
func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := c.driverInfo.Framework
f := c.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
c.driverInfo.Config = config
c.driverInfo.Config.ServerConfig = &config
return &cephTestResource{
serverPod: serverPod,
serverIP: serverIP,
@ -666,7 +692,7 @@ func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{
}
func (c *cephFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := c.driverInfo.Framework
f := c.driverInfo.Config.Framework
ctr, ok := testResource.(*cephTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Ceph Test Resource")
@ -678,30 +704,32 @@ func (c *cephFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResour
type hostPathDriver struct {
node v1.Node
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
var _ TestDriver = &hostPathDriver{}
var _ PreprovisionedVolumeTestDriver = &hostPathDriver{}
var _ InlineVolumeTestDriver = &hostPathDriver{}
var _ testsuites.TestDriver = &hostPathDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathDriver{}
var _ testsuites.InlineVolumeTestDriver = &hostPathDriver{}
// InitHostPathDriver returns hostPathDriver that implements TestDriver interface
func InitHostPathDriver() TestDriver {
func InitHostPathDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &hostPathDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "hostPath",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapPersistence: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
},
Config: config,
},
}
}
func (h *hostPathDriver) GetDriverInfo() *DriverInfo {
func (h *hostPathDriver) GetDriverInfo() *testsuites.DriverInfo {
return &h.driverInfo
}
@ -727,7 +755,7 @@ func (h *hostPathDriver) CleanupDriver() {
}
func (h *hostPathDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := h.driverInfo.Framework
f := h.driverInfo.Config.Framework
cs := f.ClientSet
// pods should be scheduled on the node
@ -744,7 +772,7 @@ func (h *hostPathDriver) DeleteVolume(volType testpatterns.TestVolType, testReso
type hostPathSymlinkDriver struct {
node v1.Node
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type hostPathSymlinkTestResource struct {
@ -753,27 +781,29 @@ type hostPathSymlinkTestResource struct {
prepPod *v1.Pod
}
var _ TestDriver = &hostPathSymlinkDriver{}
var _ PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{}
var _ InlineVolumeTestDriver = &hostPathSymlinkDriver{}
var _ testsuites.TestDriver = &hostPathSymlinkDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{}
var _ testsuites.InlineVolumeTestDriver = &hostPathSymlinkDriver{}
// InitHostPathSymlinkDriver returns hostPathSymlinkDriver that implements TestDriver interface
func InitHostPathSymlinkDriver() TestDriver {
func InitHostPathSymlinkDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &hostPathSymlinkDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "hostPathSymlink",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapPersistence: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
},
Config: config,
},
}
}
func (h *hostPathSymlinkDriver) GetDriverInfo() *DriverInfo {
func (h *hostPathSymlinkDriver) GetDriverInfo() *testsuites.DriverInfo {
return &h.driverInfo
}
@ -802,7 +832,7 @@ func (h *hostPathSymlinkDriver) CleanupDriver() {
}
func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := h.driverInfo.Framework
f := h.driverInfo.Config.Framework
cs := f.ClientSet
sourcePath := fmt.Sprintf("/tmp/%v", f.Namespace.Name)
@ -870,7 +900,7 @@ func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) i
}
func (h *hostPathSymlinkDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := h.driverInfo.Framework
f := h.driverInfo.Config.Framework
htr, ok := testResource.(*hostPathSymlinkTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Hostpath Symlink Test Resource")
@ -890,30 +920,32 @@ func (h *hostPathSymlinkDriver) DeleteVolume(volType testpatterns.TestVolType, t
// emptydir
type emptydirDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
var _ TestDriver = &emptydirDriver{}
var _ PreprovisionedVolumeTestDriver = &emptydirDriver{}
var _ InlineVolumeTestDriver = &emptydirDriver{}
var _ testsuites.TestDriver = &emptydirDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &emptydirDriver{}
var _ testsuites.InlineVolumeTestDriver = &emptydirDriver{}
// InitEmptydirDriver returns emptydirDriver that implements TestDriver interface
func InitEmptydirDriver() TestDriver {
func InitEmptydirDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &emptydirDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "emptydir",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
),
Capabilities: map[Capability]bool{
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (e *emptydirDriver) GetDriverInfo() *DriverInfo {
func (e *emptydirDriver) GetDriverInfo() *testsuites.DriverInfo {
return &e.driverInfo
}
@ -949,7 +981,7 @@ func (e *emptydirDriver) CleanupDriver() {
// and that the usual OpenStack authentication env. variables are set
// (OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME at least).
type cinderDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type cinderTestResource struct {
@ -957,32 +989,34 @@ type cinderTestResource struct {
volumeID string
}
var _ TestDriver = &cinderDriver{}
var _ PreprovisionedVolumeTestDriver = &cinderDriver{}
var _ InlineVolumeTestDriver = &cinderDriver{}
var _ PreprovisionedPVTestDriver = &cinderDriver{}
var _ DynamicPVTestDriver = &cinderDriver{}
var _ testsuites.TestDriver = &cinderDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &cinderDriver{}
var _ testsuites.InlineVolumeTestDriver = &cinderDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &cinderDriver{}
var _ testsuites.DynamicPVTestDriver = &cinderDriver{}
// InitCinderDriver returns cinderDriver that implements TestDriver interface
func InitCinderDriver() TestDriver {
func InitCinderDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &cinderDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "cinder",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
"ext3",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (c *cinderDriver) GetDriverInfo() *DriverInfo {
func (c *cinderDriver) GetDriverInfo() *testsuites.DriverInfo {
return &c.driverInfo
}
@ -1028,10 +1062,14 @@ func (c *cinderDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1
if fsType != "" {
parameters["fsType"] = fsType
}
ns := c.driverInfo.Framework.Namespace.Name
ns := c.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", c.driverInfo.Name)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (c *cinderDriver) GetClaimSize() string {
return "5Gi"
}
func (c *cinderDriver) CreateDriver() {
@ -1041,7 +1079,7 @@ func (c *cinderDriver) CleanupDriver() {
}
func (c *cinderDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := c.driverInfo.Framework
f := c.driverInfo.Config.Framework
ns := f.Namespace
// We assume that namespace.Name is a random string
@ -1106,23 +1144,23 @@ func deleteCinderVolume(name string) error {
// GCE
type gcePdDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type gcePdTestResource struct {
volumeName string
}
var _ TestDriver = &gcePdDriver{}
var _ PreprovisionedVolumeTestDriver = &gcePdDriver{}
var _ InlineVolumeTestDriver = &gcePdDriver{}
var _ PreprovisionedPVTestDriver = &gcePdDriver{}
var _ DynamicPVTestDriver = &gcePdDriver{}
var _ testsuites.TestDriver = &gcePdDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &gcePdDriver{}
var _ testsuites.InlineVolumeTestDriver = &gcePdDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &gcePdDriver{}
var _ testsuites.DynamicPVTestDriver = &gcePdDriver{}
// InitGceDriver returns gcePdDriver that implements TestDriver interface
func InitGcePdDriver() TestDriver {
func InitGcePdDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &gcePdDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "gcepd",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
@ -1133,17 +1171,19 @@ func InitGcePdDriver() TestDriver {
"xfs",
),
SupportedMountOption: sets.NewString("debug", "nouid32"),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapBlock: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (g *gcePdDriver) GetDriverInfo() *DriverInfo {
func (g *gcePdDriver) GetDriverInfo() *testsuites.DriverInfo {
return &g.driverInfo
}
@ -1190,10 +1230,14 @@ func (g *gcePdDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.
if fsType != "" {
parameters["fsType"] = fsType
}
ns := g.driverInfo.Framework.Namespace.Name
ns := g.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (h *gcePdDriver) GetClaimSize() string {
return "5Gi"
}
func (g *gcePdDriver) CreateDriver() {
@ -1206,7 +1250,7 @@ func (g *gcePdDriver) CreateVolume(volType testpatterns.TestVolType) interface{}
if volType == testpatterns.InlineVolume {
// PD will be created in framework.TestContext.CloudConfig.Zone zone,
// so pods should be also scheduled there.
g.driverInfo.Config.NodeSelector = map[string]string{
g.driverInfo.Config.ClientNodeSelector = map[string]string{
kubeletapis.LabelZoneFailureDomain: framework.TestContext.CloudConfig.Zone,
}
}
@ -1226,7 +1270,7 @@ func (g *gcePdDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc
// vSphere
type vSphereDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type vSphereTestResource struct {
@ -1234,31 +1278,33 @@ type vSphereTestResource struct {
nodeInfo *vspheretest.NodeInfo
}
var _ TestDriver = &vSphereDriver{}
var _ PreprovisionedVolumeTestDriver = &vSphereDriver{}
var _ InlineVolumeTestDriver = &vSphereDriver{}
var _ PreprovisionedPVTestDriver = &vSphereDriver{}
var _ DynamicPVTestDriver = &vSphereDriver{}
var _ testsuites.TestDriver = &vSphereDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &vSphereDriver{}
var _ testsuites.InlineVolumeTestDriver = &vSphereDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &vSphereDriver{}
var _ testsuites.DynamicPVTestDriver = &vSphereDriver{}
// InitVSphereDriver returns vSphereDriver that implements TestDriver interface
func InitVSphereDriver() TestDriver {
func InitVSphereDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &vSphereDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "vSphere",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
"ext4",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (v *vSphereDriver) GetDriverInfo() *DriverInfo {
func (v *vSphereDriver) GetDriverInfo() *testsuites.DriverInfo {
return &v.driverInfo
}
@ -1312,10 +1358,14 @@ func (v *vSphereDriver) GetDynamicProvisionStorageClass(fsType string) *storagev
if fsType != "" {
parameters["fsType"] = fsType
}
ns := v.driverInfo.Framework.Namespace.Name
ns := v.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", v.driverInfo.Name)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (v *vSphereDriver) GetClaimSize() string {
return "5Gi"
}
func (v *vSphereDriver) CreateDriver() {
@ -1325,7 +1375,7 @@ func (v *vSphereDriver) CleanupDriver() {
}
func (v *vSphereDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
f := v.driverInfo.Framework
f := v.driverInfo.Config.Framework
vspheretest.Bootstrap(f)
nodeInfo := vspheretest.GetReadySchedulableRandomNodeInfo()
volumePath, err := nodeInfo.VSphere.CreateVolume(&vspheretest.VolumeOptions{}, nodeInfo.DataCenterRef)
@ -1345,40 +1395,42 @@ func (v *vSphereDriver) DeleteVolume(volType testpatterns.TestVolType, testResou
// Azure
type azureDriver struct {
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
type azureTestResource struct {
volumeName string
}
var _ TestDriver = &azureDriver{}
var _ PreprovisionedVolumeTestDriver = &azureDriver{}
var _ InlineVolumeTestDriver = &azureDriver{}
var _ PreprovisionedPVTestDriver = &azureDriver{}
var _ DynamicPVTestDriver = &azureDriver{}
var _ testsuites.TestDriver = &azureDriver{}
var _ testsuites.PreprovisionedVolumeTestDriver = &azureDriver{}
var _ testsuites.InlineVolumeTestDriver = &azureDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &azureDriver{}
var _ testsuites.DynamicPVTestDriver = &azureDriver{}
// InitAzureDriver returns azureDriver that implements TestDriver interface
func InitAzureDriver() TestDriver {
func InitAzureDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &azureDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "azure",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
"", // Default fsType
"ext4",
),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapBlock: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (a *azureDriver) GetDriverInfo() *DriverInfo {
func (a *azureDriver) GetDriverInfo() *testsuites.DriverInfo {
return &a.driverInfo
}
@ -1430,10 +1482,14 @@ func (a *azureDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.
if fsType != "" {
parameters["fsType"] = fsType
}
ns := a.driverInfo.Framework.Namespace.Name
ns := a.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", a.driverInfo.Name)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (a *azureDriver) GetClaimSize() string {
return "5Gi"
}
func (a *azureDriver) CreateDriver() {
@ -1462,21 +1518,21 @@ func (a *azureDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc
type awsDriver struct {
volumeName string
driverInfo DriverInfo
driverInfo testsuites.DriverInfo
}
var _ TestDriver = &awsDriver{}
var _ testsuites.TestDriver = &awsDriver{}
// TODO: Fix authorization error in attach operation and uncomment below
//var _ PreprovisionedVolumeTestDriver = &awsDriver{}
//var _ InlineVolumeTestDriver = &awsDriver{}
//var _ PreprovisionedPVTestDriver = &awsDriver{}
var _ DynamicPVTestDriver = &awsDriver{}
//var _ testsuites.PreprovisionedVolumeTestDriver = &awsDriver{}
//var _ testsuites.InlineVolumeTestDriver = &awsDriver{}
//var _ testsuites.PreprovisionedPVTestDriver = &awsDriver{}
var _ testsuites.DynamicPVTestDriver = &awsDriver{}
// InitAwsDriver returns awsDriver that implements TestDriver interface
func InitAwsDriver() TestDriver {
func InitAwsDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &awsDriver{
driverInfo: DriverInfo{
driverInfo: testsuites.DriverInfo{
Name: "aws",
MaxFileSize: testpatterns.FileSizeMedium,
SupportedFsType: sets.NewString(
@ -1484,17 +1540,19 @@ func InitAwsDriver() TestDriver {
"ext3",
),
SupportedMountOption: sets.NewString("debug", "nouid32"),
Capabilities: map[Capability]bool{
CapPersistence: true,
CapFsGroup: true,
CapBlock: true,
CapExec: true,
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
testsuites.CapFsGroup: true,
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
func (a *awsDriver) GetDriverInfo() *DriverInfo {
func (a *awsDriver) GetDriverInfo() *testsuites.DriverInfo {
return &a.driverInfo
}
@ -1537,10 +1595,14 @@ func (a *awsDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.St
if fsType != "" {
parameters["fsType"] = fsType
}
ns := a.driverInfo.Framework.Namespace.Name
ns := a.driverInfo.Config.Framework.Namespace.Name
suffix := fmt.Sprintf("%s-sc", a.driverInfo.Name)
return getStorageClass(provisioner, parameters, nil, ns, suffix)
return testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
}
func (a *awsDriver) GetClaimSize() string {
return "5Gi"
}
func (a *awsDriver) CreateDriver() {

View File

@ -18,7 +18,6 @@ package storage
import (
. "github.com/onsi/ginkgo"
"k8s.io/api/core/v1"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
@ -27,7 +26,7 @@ import (
)
// List of testDrivers to be executed in below loop
var testDrivers = []func() drivers.TestDriver{
var testDrivers = []func(config testsuites.TestConfig) testsuites.TestDriver{
drivers.InitNFSDriver,
drivers.InitGlusterFSDriver,
drivers.InitISCSIDriver,
@ -61,26 +60,20 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() {
f := framework.NewDefaultFramework("volumes")
var (
ns *v1.Namespace
config framework.VolumeTestConfig
// Common configuration options for all drivers.
config = testsuites.TestConfig{
Framework: f,
Prefix: "in-tree",
}
)
BeforeEach(func() {
ns = f.Namespace
config = framework.VolumeTestConfig{
Namespace: ns.Name,
Prefix: "volume",
}
})
for _, initDriver := range testDrivers {
curDriver := initDriver()
Context(drivers.GetDriverNameWithFeatureTags(curDriver), func() {
curDriver := initDriver(config)
Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() {
driver := curDriver
BeforeEach(func() {
// setupDriver
drivers.SetCommonDriverParameters(driver, f, config)
driver.CreateDriver()
})
@ -89,7 +82,7 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() {
driver.CleanupDriver()
})
testsuites.RunTestSuite(f, config, driver, testSuites, intreeTunePattern)
testsuites.RunTestSuite(f, driver, testSuites, intreeTunePattern)
})
}
})

View File

@ -4,8 +4,10 @@ go_library(
name = "go_default_library",
srcs = [
"base.go",
"driveroperations.go",
"provisioning.go",
"subpath.go",
"testdriver.go",
"volume_io.go",
"volumemode.go",
"volumes.go",
@ -20,10 +22,10 @@ go_library(
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
"//test/e2e/framework:go_default_library",
"//test/e2e/storage/drivers:go_default_library",
"//test/e2e/storage/testpatterns:go_default_library",
"//test/e2e/storage/utils:go_default_library",
"//test/utils/image:go_default_library",

View File

@ -30,7 +30,6 @@ import (
utilerrors "k8s.io/apimachinery/pkg/util/errors"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
)
@ -39,9 +38,9 @@ type TestSuite interface {
// getTestSuiteInfo returns the TestSuiteInfo for this TestSuite
getTestSuiteInfo() TestSuiteInfo
// skipUnsupportedTest skips the test if this TestSuite is not suitable to be tested with the combination of TestPattern and TestDriver
skipUnsupportedTest(testpatterns.TestPattern, drivers.TestDriver)
skipUnsupportedTest(testpatterns.TestPattern, TestDriver)
// execTest executes test of the testpattern for the driver
execTest(drivers.TestDriver, testpatterns.TestPattern)
execTest(TestDriver, testpatterns.TestPattern)
}
// TestSuiteInfo represents a set of parameters for TestSuite
@ -55,9 +54,9 @@ type TestSuiteInfo struct {
type TestResource interface {
// setupResource sets up test resources to be used for the tests with the
// combination of TestDriver and TestPattern
setupResource(drivers.TestDriver, testpatterns.TestPattern)
setupResource(TestDriver, testpatterns.TestPattern)
// cleanupResource clean up the test resources created in SetupResource
cleanupResource(drivers.TestDriver, testpatterns.TestPattern)
cleanupResource(TestDriver, testpatterns.TestPattern)
}
func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string {
@ -66,7 +65,7 @@ func getTestNameStr(suite TestSuite, pattern testpatterns.TestPattern) string {
}
// RunTestSuite runs all testpatterns of all testSuites for a driver
func RunTestSuite(f *framework.Framework, config framework.VolumeTestConfig, driver drivers.TestDriver, tsInits []func() TestSuite, tunePatternFunc func([]testpatterns.TestPattern) []testpatterns.TestPattern) {
func RunTestSuite(f *framework.Framework, driver TestDriver, tsInits []func() TestSuite, tunePatternFunc func([]testpatterns.TestPattern) []testpatterns.TestPattern) {
for _, testSuiteInit := range tsInits {
suite := testSuiteInit()
patterns := tunePatternFunc(suite.getTestSuiteInfo().testPatterns)
@ -84,18 +83,18 @@ func RunTestSuite(f *framework.Framework, config framework.VolumeTestConfig, dri
// 2. Check if fsType is supported by driver
// 3. Check with driver specific logic
// 4. Check with testSuite specific logic
func skipUnsupportedTest(suite TestSuite, driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func skipUnsupportedTest(suite TestSuite, driver TestDriver, pattern testpatterns.TestPattern) {
dInfo := driver.GetDriverInfo()
// 1. Check if Whether volType is supported by driver from its interface
var isSupported bool
switch pattern.VolType {
case testpatterns.InlineVolume:
_, isSupported = driver.(drivers.InlineVolumeTestDriver)
_, isSupported = driver.(InlineVolumeTestDriver)
case testpatterns.PreprovisionedPV:
_, isSupported = driver.(drivers.PreprovisionedPVTestDriver)
_, isSupported = driver.(PreprovisionedPVTestDriver)
case testpatterns.DynamicPV:
_, isSupported = driver.(drivers.DynamicPVTestDriver)
_, isSupported = driver.(DynamicPVTestDriver)
default:
isSupported = false
}
@ -121,7 +120,7 @@ func skipUnsupportedTest(suite TestSuite, driver drivers.TestDriver, pattern tes
// See volume_io.go or volumes.go in test/e2e/storage/testsuites/ for how to use this resource.
// Also, see subpath.go in the same directory for how to extend and use it.
type genericVolumeTestResource struct {
driver drivers.TestDriver
driver TestDriver
volType string
volSource *v1.VolumeSource
pvc *v1.PersistentVolumeClaim
@ -134,27 +133,27 @@ type genericVolumeTestResource struct {
var _ TestResource = &genericVolumeTestResource{}
// setupResource sets up genericVolumeTestResource
func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (r *genericVolumeTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) {
r.driver = driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
cs := f.ClientSet
fsType := pattern.FsType
volType := pattern.VolType
// Create volume for pre-provisioned volume tests
r.driverTestResource = drivers.CreateVolume(driver, volType)
r.driverTestResource = CreateVolume(driver, volType)
switch volType {
case testpatterns.InlineVolume:
framework.Logf("Creating resource for inline volume")
if iDriver, ok := driver.(drivers.InlineVolumeTestDriver); ok {
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
r.volSource = iDriver.GetVolumeSource(false, fsType, r.driverTestResource)
r.volType = dInfo.Name
}
case testpatterns.PreprovisionedPV:
framework.Logf("Creating resource for pre-provisioned PV")
if pDriver, ok := driver.(drivers.PreprovisionedPVTestDriver); ok {
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
pvSource := pDriver.GetPersistentVolumeSource(false, fsType, r.driverTestResource)
if pvSource != nil {
r.volSource, r.pv, r.pvc = createVolumeSourceWithPVCPV(f, dInfo.Name, pvSource, false)
@ -163,8 +162,8 @@ func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pat
}
case testpatterns.DynamicPV:
framework.Logf("Creating resource for dynamic PV")
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
claimSize := "5Gi"
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
claimSize := dDriver.GetClaimSize()
r.sc = dDriver.GetDynamicProvisionStorageClass(fsType)
By("creating a StorageClass " + r.sc.Name)
@ -188,9 +187,9 @@ func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pat
}
// cleanupResource cleans up genericVolumeTestResource
func (r *genericVolumeTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (r *genericVolumeTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) {
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
volType := pattern.VolType
if r.pvc != nil || r.pv != nil {
@ -222,7 +221,7 @@ func (r *genericVolumeTestResource) cleanupResource(driver drivers.TestDriver, p
}
// Cleanup volume for pre-provisioned volume tests
drivers.DeleteVolume(driver, volType, r.driverTestResource)
DeleteVolume(driver, volType, r.driverTestResource)
}
func createVolumeSourceWithPVCPV(
@ -324,3 +323,24 @@ func deleteStorageClass(cs clientset.Interface, className string) {
Expect(err).NotTo(HaveOccurred())
}
}
// convertTestConfig returns a framework test config with the
// parameters specified for the testsuite or (if available) the
// dynamically created config for the volume server.
//
// This is done because TestConfig is the public API for
// the testsuites package whereas framework.VolumeTestConfig is merely
// an implementation detail. It contains fields that have no effect,
// which makes it unsuitable for use in the testsuits public API.
func convertTestConfig(in *TestConfig) framework.VolumeTestConfig {
if in.ServerConfig != nil {
return *in.ServerConfig
}
return framework.VolumeTestConfig{
Namespace: in.Framework.Namespace.Name,
Prefix: in.Prefix,
ClientNodeName: in.ClientNodeName,
NodeSelector: in.ClientNodeSelector,
}
}

View File

@ -0,0 +1,101 @@
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package testsuites
import (
"fmt"
storagev1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
)
// GetDriverNameWithFeatureTags returns driver name with feature tags
// For example)
// - [Driver: nfs]
// - [Driver: rbd][Feature:Volumes]
func GetDriverNameWithFeatureTags(driver TestDriver) string {
dInfo := driver.GetDriverInfo()
return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag)
}
// CreateVolume creates volume for test unless dynamicPV test
func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} {
switch volType {
case testpatterns.InlineVolume:
fallthrough
case testpatterns.PreprovisionedPV:
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
return pDriver.CreateVolume(volType)
}
case testpatterns.DynamicPV:
// No need to create volume
default:
framework.Failf("Invalid volType specified: %v", volType)
}
return nil
}
// DeleteVolume deletes volume for test unless dynamicPV test
func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResource interface{}) {
switch volType {
case testpatterns.InlineVolume:
fallthrough
case testpatterns.PreprovisionedPV:
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
pDriver.DeleteVolume(volType, testResource)
}
case testpatterns.DynamicPV:
// No need to delete volume
default:
framework.Failf("Invalid volType specified: %v", volType)
}
}
// GetStorageClass constructs a new StorageClass instance
// with a unique name that is based on namespace + suffix.
func GetStorageClass(
provisioner string,
parameters map[string]string,
bindingMode *storagev1.VolumeBindingMode,
ns string,
suffix string,
) *storagev1.StorageClass {
if bindingMode == nil {
defaultBindingMode := storagev1.VolumeBindingImmediate
bindingMode = &defaultBindingMode
}
return &storagev1.StorageClass{
TypeMeta: metav1.TypeMeta{
Kind: "StorageClass",
},
ObjectMeta: metav1.ObjectMeta{
// Name must be unique, so let's base it on namespace name
Name: ns + "-" + suffix,
},
Provisioner: provisioner,
Parameters: parameters,
VolumeBindingMode: bindingMode,
}
}
// GetUniqueDriverName returns unique driver name that can be used parallelly in tests
func GetUniqueDriverName(driver TestDriver) string {
return fmt.Sprintf("%s-%s", driver.GetDriverInfo().Name, driver.GetDriverInfo().Config.Framework.UniqueName)
}

View File

@ -31,7 +31,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
imageutils "k8s.io/kubernetes/test/utils/image"
)
@ -74,10 +73,10 @@ func (p *provisioningTestSuite) getTestSuiteInfo() TestSuiteInfo {
return p.tsInfo
}
func (p *provisioningTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) {
func (p *provisioningTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) {
}
func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns.TestPattern) (provisioningTestResource, provisioningTestInput) {
func createProvisioningTestInput(driver TestDriver, pattern testpatterns.TestPattern) (provisioningTestResource, provisioningTestInput) {
// Setup test resource for driver and testpattern
resource := provisioningTestResource{}
resource.setupResource(driver, pattern)
@ -87,7 +86,7 @@ func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns
ClaimSize: resource.claimSize,
ExpectedSize: resource.claimSize,
},
cs: driver.GetDriverInfo().Framework.ClientSet,
cs: driver.GetDriverInfo().Config.Framework.ClientSet,
pvc: resource.pvc,
sc: resource.sc,
dInfo: driver.GetDriverInfo(),
@ -100,7 +99,7 @@ func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns
return resource, input
}
func (p *provisioningTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (p *provisioningTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) {
Context(getTestNameStr(p, pattern), func() {
var (
resource provisioningTestResource
@ -132,7 +131,7 @@ func (p *provisioningTestSuite) execTest(driver drivers.TestDriver, pattern test
}
type provisioningTestResource struct {
driver drivers.TestDriver
driver TestDriver
claimSize string
sc *storage.StorageClass
@ -141,18 +140,18 @@ type provisioningTestResource struct {
var _ TestResource = &provisioningTestResource{}
func (p *provisioningTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (p *provisioningTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) {
// Setup provisioningTest resource
switch pattern.VolType {
case testpatterns.DynamicPV:
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
p.sc = dDriver.GetDynamicProvisionStorageClass("")
if p.sc == nil {
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", driver.GetDriverInfo().Name)
}
p.driver = driver
p.claimSize = "5Gi"
p.pvc = getClaim(p.claimSize, driver.GetDriverInfo().Framework.Namespace.Name)
p.claimSize = dDriver.GetClaimSize()
p.pvc = getClaim(p.claimSize, driver.GetDriverInfo().Config.Framework.Namespace.Name)
p.pvc.Spec.StorageClassName = &p.sc.Name
framework.Logf("In creating storage class object and pvc object for driver - sc: %v, pvc: %v", p.sc, p.pvc)
}
@ -161,7 +160,7 @@ func (p *provisioningTestResource) setupResource(driver drivers.TestDriver, patt
}
}
func (p *provisioningTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (p *provisioningTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) {
}
type provisioningTestInput struct {
@ -169,7 +168,7 @@ type provisioningTestInput struct {
cs clientset.Interface
pvc *v1.PersistentVolumeClaim
sc *storage.StorageClass
dInfo *drivers.DriverInfo
dInfo *DriverInfo
}
func testProvisioning(input *provisioningTestInput) {
@ -187,7 +186,7 @@ func testProvisioning(input *provisioningTestInput) {
})
It("should create and delete block persistent volumes", func() {
if !input.dInfo.Capabilities[drivers.CapBlock] {
if !input.dInfo.Capabilities[CapBlock] {
framework.Skipf("Driver %q does not support BlockVolume - skipping", input.dInfo.Name)
}
block := v1.PersistentVolumeBlock

View File

@ -27,7 +27,6 @@ import (
"k8s.io/apimachinery/pkg/util/rand"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
"k8s.io/kubernetes/test/e2e/storage/utils"
imageutils "k8s.io/kubernetes/test/utils/image"
@ -72,13 +71,13 @@ func (s *subPathTestSuite) getTestSuiteInfo() TestSuiteInfo {
return s.tsInfo
}
func (s *subPathTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) {
func (s *subPathTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) {
}
func createSubPathTestInput(pattern testpatterns.TestPattern, resource subPathTestResource) subPathTestInput {
driver := resource.driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
subPath := f.Namespace.Name
subPathDir := filepath.Join(volumePath, subPath)
@ -95,7 +94,7 @@ func createSubPathTestInput(pattern testpatterns.TestPattern, resource subPathTe
}
}
func (s *subPathTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (s *subPathTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) {
Context(getTestNameStr(s, pattern), func() {
var (
resource subPathTestResource
@ -137,10 +136,10 @@ type subPathTestResource struct {
var _ TestResource = &subPathTestResource{}
func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (s *subPathTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) {
s.driver = driver
dInfo := s.driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
fsType := pattern.FsType
volType := pattern.VolType
@ -150,7 +149,7 @@ func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern t
// Setup subPath test dependent resource
switch volType {
case testpatterns.InlineVolume:
if iDriver, ok := driver.(drivers.InlineVolumeTestDriver); ok {
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
s.roVolSource = iDriver.GetVolumeSource(true, fsType, s.genericVolumeTestResource.driverTestResource)
}
case testpatterns.PreprovisionedPV:
@ -175,16 +174,16 @@ func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern t
config := dInfo.Config
s.pod = SubpathTestPod(f, subPath, s.volType, s.volSource, true)
s.pod.Spec.NodeName = config.ClientNodeName
s.pod.Spec.NodeSelector = config.NodeSelector
s.pod.Spec.NodeSelector = config.ClientNodeSelector
s.formatPod = volumeFormatPod(f, s.volSource)
s.formatPod.Spec.NodeName = config.ClientNodeName
s.formatPod.Spec.NodeSelector = config.NodeSelector
s.formatPod.Spec.NodeSelector = config.ClientNodeSelector
}
func (s *subPathTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (s *subPathTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) {
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
// Cleanup subPath test dependent resource
By("Deleting pod")

View File

@ -14,14 +14,11 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package drivers
package testsuites
import (
"fmt"
"k8s.io/api/core/v1"
storagev1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
@ -74,6 +71,11 @@ type DynamicPVTestDriver interface {
// It will set fsType to the StorageClass, if TestDriver supports it.
// It will return nil, if the TestDriver doesn't support it.
GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass
// GetClaimSize returns the size of the volume that is to be provisioned ("5Gi", "1Mi").
// The size must be chosen so that the resulting volume is large enough for all
// enabled tests and within the range supported by the underlying storage.
GetClaimSize() string
}
// Capability represents a feature that a volume plugin supports
@ -97,95 +99,35 @@ type DriverInfo struct {
RequiredMountOption sets.String // Map of string for required mount option (Optional)
Capabilities map[Capability]bool // Map that represents plugin capabilities
// Parameters below will be set inside test loop by using SetCommonDriverParameters.
// Drivers that implement TestDriver is required to set all the above parameters
// and return DriverInfo on GetDriverInfo() call.
Framework *framework.Framework // Framework for the test
Config framework.VolumeTestConfig // VolumeTestConfig for thet test
Config TestConfig // Test configuration for the current test.
}
// GetDriverNameWithFeatureTags returns driver name with feature tags
// For example)
// - [Driver: nfs]
// - [Driver: rbd][Feature:Volumes]
func GetDriverNameWithFeatureTags(driver TestDriver) string {
dInfo := driver.GetDriverInfo()
// TestConfig represents parameters that control test execution.
// They can still be modified after defining tests, for example
// in a BeforeEach or when creating the driver.
type TestConfig struct {
// Some short word that gets inserted into dynamically
// generated entities (pods, paths) as first part of the name
// to make debugging easier. Can be the same for different
// tests inside the test suite.
Prefix string
return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag)
}
// CreateVolume creates volume for test unless dynamicPV test
func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} {
switch volType {
case testpatterns.InlineVolume:
fallthrough
case testpatterns.PreprovisionedPV:
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
return pDriver.CreateVolume(volType)
}
case testpatterns.DynamicPV:
// No need to create volume
default:
framework.Failf("Invalid volType specified: %v", volType)
}
return nil
}
// DeleteVolume deletes volume for test unless dynamicPV test
func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResource interface{}) {
switch volType {
case testpatterns.InlineVolume:
fallthrough
case testpatterns.PreprovisionedPV:
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
pDriver.DeleteVolume(volType, testResource)
}
case testpatterns.DynamicPV:
// No need to delete volume
default:
framework.Failf("Invalid volType specified: %v", volType)
}
}
// SetCommonDriverParameters sets a common driver parameters to TestDriver
// This function is intended to be called in BeforeEach() inside test loop.
func SetCommonDriverParameters(
driver TestDriver,
f *framework.Framework,
config framework.VolumeTestConfig,
) {
dInfo := driver.GetDriverInfo()
dInfo.Framework = f
dInfo.Config = config
}
func getStorageClass(
provisioner string,
parameters map[string]string,
bindingMode *storagev1.VolumeBindingMode,
ns string,
suffix string,
) *storagev1.StorageClass {
if bindingMode == nil {
defaultBindingMode := storagev1.VolumeBindingImmediate
bindingMode = &defaultBindingMode
}
return &storagev1.StorageClass{
TypeMeta: metav1.TypeMeta{
Kind: "StorageClass",
},
ObjectMeta: metav1.ObjectMeta{
// Name must be unique, so let's base it on namespace name
Name: ns + "-" + suffix,
},
Provisioner: provisioner,
Parameters: parameters,
VolumeBindingMode: bindingMode,
}
}
// GetUniqueDriverName returns unique driver name that can be used parallelly in tests
func GetUniqueDriverName(driver TestDriver) string {
return fmt.Sprintf("%s-%s", driver.GetDriverInfo().Name, driver.GetDriverInfo().Framework.UniqueName)
// The framework instance allocated for the current test.
Framework *framework.Framework
// If non-empty, then pods using a volume will be scheduled
// onto the node with this name. Otherwise Kubernetes will
// pick a node.
ClientNodeName string
// Some tests also support scheduling pods onto nodes with
// these label/value pairs. As not all tests use this field,
// a driver that absolutely needs the pods on a specific
// node must use ClientNodeName.
ClientNodeSelector map[string]string
// Some test drivers initialize a storage server. This is
// the configuration that then has to be used to run tests.
// The values above are ignored for such tests.
ServerConfig *framework.VolumeTestConfig
}

View File

@ -35,7 +35,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clientset "k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
"k8s.io/kubernetes/test/e2e/storage/utils"
)
@ -75,14 +74,14 @@ func (t *volumeIOTestSuite) getTestSuiteInfo() TestSuiteInfo {
return t.tsInfo
}
func (t *volumeIOTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) {
func (t *volumeIOTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) {
}
func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericVolumeTestResource) volumeIOTestInput {
var fsGroup *int64
driver := resource.driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
fileSizes := createFileSizes(dInfo.MaxFileSize)
volSource := resource.volSource
@ -90,7 +89,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
}
if dInfo.Capabilities[drivers.CapFsGroup] {
if dInfo.Capabilities[CapFsGroup] {
fsGroupVal := int64(1234)
fsGroup = &fsGroupVal
}
@ -98,7 +97,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV
return volumeIOTestInput{
f: f,
name: dInfo.Name,
config: dInfo.Config,
config: &dInfo.Config,
volSource: *volSource,
testFile: fmt.Sprintf("%s_io_test_%s", dInfo.Name, f.Namespace.Name),
podSec: v1.PodSecurityContext{
@ -108,7 +107,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV
}
}
func (t *volumeIOTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (t *volumeIOTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) {
Context(getTestNameStr(t, pattern), func() {
var (
resource genericVolumeTestResource
@ -143,7 +142,7 @@ func (t *volumeIOTestSuite) execTest(driver drivers.TestDriver, pattern testpatt
type volumeIOTestInput struct {
f *framework.Framework
name string
config framework.VolumeTestConfig
config *TestConfig
volSource v1.VolumeSource
testFile string
podSec v1.PodSecurityContext
@ -155,7 +154,7 @@ func execTestVolumeIO(input *volumeIOTestInput) {
f := input.f
cs := f.ClientSet
err := testVolumeIO(f, cs, input.config, input.volSource, &input.podSec, input.testFile, input.fileSizes)
err := testVolumeIO(f, cs, convertTestConfig(input.config), input.volSource, &input.podSec, input.testFile, input.fileSizes)
Expect(err).NotTo(HaveOccurred())
})
}

View File

@ -27,7 +27,6 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
"k8s.io/kubernetes/test/e2e/storage/utils"
)
@ -62,13 +61,13 @@ func (t *volumeModeTestSuite) getTestSuiteInfo() TestSuiteInfo {
return t.tsInfo
}
func (t *volumeModeTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) {
func (t *volumeModeTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) {
}
func createVolumeModeTestInput(pattern testpatterns.TestPattern, resource volumeModeTestResource) volumeModeTestInput {
driver := resource.driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
return volumeModeTestInput{
f: f,
@ -78,13 +77,13 @@ func createVolumeModeTestInput(pattern testpatterns.TestPattern, resource volume
testVolType: pattern.VolType,
nodeName: dInfo.Config.ClientNodeName,
volMode: pattern.VolMode,
isBlockSupported: dInfo.Capabilities[drivers.CapBlock],
isBlockSupported: dInfo.Capabilities[CapBlock],
}
}
func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver drivers.TestDriver) func(*volumeModeTestInput) {
func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver TestDriver) func(*volumeModeTestInput) {
dInfo := driver.GetDriverInfo()
isBlockSupported := dInfo.Capabilities[drivers.CapBlock]
isBlockSupported := dInfo.Capabilities[CapBlock]
volMode := pattern.VolMode
volType := pattern.VolType
@ -105,7 +104,7 @@ func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver drivers.Test
return nil
}
func (t *volumeModeTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (t *volumeModeTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) {
Context(getTestNameStr(t, pattern), func() {
var (
resource volumeModeTestResource
@ -141,7 +140,7 @@ func (t *volumeModeTestSuite) execTest(driver drivers.TestDriver, pattern testpa
}
type volumeModeTestResource struct {
driver drivers.TestDriver
driver TestDriver
sc *storagev1.StorageClass
pvc *v1.PersistentVolumeClaim
@ -152,10 +151,10 @@ type volumeModeTestResource struct {
var _ TestResource = &volumeModeTestResource{}
func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (s *volumeModeTestResource) setupResource(driver TestDriver, pattern testpatterns.TestPattern) {
s.driver = driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
ns := f.Namespace
fsType := pattern.FsType
volBindMode := storagev1.VolumeBindingImmediate
@ -168,7 +167,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter
)
// Create volume for pre-provisioned volume tests
s.driverTestResource = drivers.CreateVolume(driver, volType)
s.driverTestResource = CreateVolume(driver, volType)
switch volType {
case testpatterns.PreprovisionedPV:
@ -177,7 +176,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter
} else if volMode == v1.PersistentVolumeFilesystem {
scName = fmt.Sprintf("%s-%s-sc-for-file", ns.Name, dInfo.Name)
}
if pDriver, ok := driver.(drivers.PreprovisionedPVTestDriver); ok {
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
pvSource = pDriver.GetPersistentVolumeSource(false, fsType, s.driverTestResource)
if pvSource == nil {
framework.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name)
@ -189,14 +188,14 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter
s.pvc = framework.MakePersistentVolumeClaim(pvcConfig, ns.Name)
}
case testpatterns.DynamicPV:
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
s.sc = dDriver.GetDynamicProvisionStorageClass(fsType)
if s.sc == nil {
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name)
}
s.sc.VolumeBindingMode = &volBindMode
claimSize := "5Gi"
claimSize := dDriver.GetClaimSize()
s.pvc = getClaim(claimSize, ns.Name)
s.pvc.Spec.StorageClassName = &s.sc.Name
s.pvc.Spec.VolumeMode = &volMode
@ -206,9 +205,9 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter
}
}
func (s *volumeModeTestResource) cleanupResource(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (s *volumeModeTestResource) cleanupResource(driver TestDriver, pattern testpatterns.TestPattern) {
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
volType := pattern.VolType
@ -224,7 +223,7 @@ func (s *volumeModeTestResource) cleanupResource(driver drivers.TestDriver, patt
}
// Cleanup volume for pre-provisioned volume tests
drivers.DeleteVolume(driver, volType, s.driverTestResource)
DeleteVolume(driver, volType, s.driverTestResource)
}
type volumeModeTestInput struct {

View File

@ -31,7 +31,6 @@ import (
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/storage/drivers"
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
imageutils "k8s.io/kubernetes/test/utils/image"
)
@ -73,19 +72,19 @@ func (t *volumesTestSuite) getTestSuiteInfo() TestSuiteInfo {
return t.tsInfo
}
func (t *volumesTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver drivers.TestDriver) {
func (t *volumesTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern, driver TestDriver) {
}
func skipPersistenceTest(driver drivers.TestDriver) {
func skipPersistenceTest(driver TestDriver) {
dInfo := driver.GetDriverInfo()
if !dInfo.Capabilities[drivers.CapPersistence] {
if !dInfo.Capabilities[CapPersistence] {
framework.Skipf("Driver %q does not provide persistency - skipping", dInfo.Name)
}
}
func skipExecTest(driver drivers.TestDriver) {
func skipExecTest(driver TestDriver) {
dInfo := driver.GetDriverInfo()
if !dInfo.Capabilities[drivers.CapExec] {
if !dInfo.Capabilities[CapExec] {
framework.Skipf("Driver %q does not support exec - skipping", dInfo.Name)
}
}
@ -94,14 +93,14 @@ func createVolumesTestInput(pattern testpatterns.TestPattern, resource genericVo
var fsGroup *int64
driver := resource.driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
volSource := resource.volSource
if volSource == nil {
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
}
if dInfo.Capabilities[drivers.CapFsGroup] {
if dInfo.Capabilities[CapFsGroup] {
fsGroupVal := int64(1234)
fsGroup = &fsGroupVal
}
@ -109,7 +108,7 @@ func createVolumesTestInput(pattern testpatterns.TestPattern, resource genericVo
return volumesTestInput{
f: f,
name: dInfo.Name,
config: dInfo.Config,
config: &dInfo.Config,
fsGroup: fsGroup,
resource: resource,
tests: []framework.VolumeTest{
@ -124,7 +123,7 @@ func createVolumesTestInput(pattern testpatterns.TestPattern, resource genericVo
}
}
func (t *volumesTestSuite) execTest(driver drivers.TestDriver, pattern testpatterns.TestPattern) {
func (t *volumesTestSuite) execTest(driver TestDriver, pattern testpatterns.TestPattern) {
Context(getTestNameStr(t, pattern), func() {
var (
resource genericVolumeTestResource
@ -159,7 +158,7 @@ func (t *volumesTestSuite) execTest(driver drivers.TestDriver, pattern testpatte
type volumesTestInput struct {
f *framework.Framework
name string
config framework.VolumeTestConfig
config *TestConfig
fsGroup *int64
tests []framework.VolumeTest
resource genericVolumeTestResource
@ -169,19 +168,20 @@ func testVolumes(input *volumesTestInput) {
It("should be mountable", func() {
f := input.f
cs := f.ClientSet
defer framework.VolumeTestCleanup(f, input.config)
defer framework.VolumeTestCleanup(f, convertTestConfig(input.config))
skipPersistenceTest(input.resource.driver)
volumeTest := input.tests
framework.InjectHtml(cs, input.config, volumeTest[0].Volume, volumeTest[0].ExpectedContent)
framework.TestVolumeClient(cs, input.config, input.fsGroup, input.tests)
config := convertTestConfig(input.config)
framework.InjectHtml(cs, config, volumeTest[0].Volume, volumeTest[0].ExpectedContent)
framework.TestVolumeClient(cs, config, input.fsGroup, input.tests)
})
It("should allow exec of files on the volume", func() {
f := input.f
skipExecTest(input.resource.driver)
testScriptInPod(f, input.resource.volType, input.resource.volSource, input.config.NodeSelector)
testScriptInPod(f, input.resource.volType, input.resource.volSource, input.resource.driver.GetDriverInfo().Config.ClientNodeSelector)
})
}

View File

@ -29,7 +29,7 @@ spec:
spec:
serviceAccountName: csi-provisioner
containers:
- name: csi-provisioner-v0
- name: csi-provisioner
image: quay.io/k8scsi/csi-provisioner:v0.4.1
args:
- "--provisioner=csi-hostpath-v0"