e2e/storage: refactor test config

Exposing framework.VolumeTestConfig as part of the testsuite package
API was confusing because it was unclear which of the values in it
really have an effect. How it was set also was a bit awkward: a test
driver had a copy that had to be overwritten at test runtime and then
might have been updated and/or overwritten again by the driver.

Now testsuites has its own test config structure. It contains the
values that might have to be set dynamically at runtime. Instead of
overwriting a copy of that struct inside the test driver, the test
driver takes some common defaults (specifically, the framework pointer
and the prefix) when it gets initialized and then manages its own
copy. For example, the hostpath driver has to lock the pods to a
single node.

framework.VolumeTestConfig is still used internally and test drivers
can decide to run tests with a fully populated instance if needed (for
example, after setting up an NFS server).
This commit is contained in:
Patrick Ohly 2018-11-09 15:46:46 +01:00
parent dfcf2ca345
commit 3253e9ab6b
13 changed files with 211 additions and 138 deletions

View File

@ -43,7 +43,7 @@ import (
)
// List of testDrivers to be executed in below loop
var csiTestDrivers = []func() testsuites.TestDriver{
var csiTestDrivers = []func(config testsuites.TestConfig) testsuites.TestDriver{
drivers.InitHostPathCSIDriver,
drivers.InitGcePDCSIDriver,
drivers.InitGcePDExternalCSIDriver,
@ -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()
curDriver := initDriver(config)
Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() {
driver := curDriver
BeforeEach(func() {
// setupDriver
testsuites.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)
})
}
@ -155,8 +155,11 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
BeforeEach(func() {
cs = f.ClientSet
csics = f.CSIClientSet
driver = drivers.InitHostPathCSIDriver()
testsuites.SetCommonDriverParameters(driver, f, config)
config := testsuites.TestConfig{
Framework: f,
Prefix: "csi-attach",
}
driver = drivers.InitHostPathCSIDriver(config)
driver.CreateDriver()
})

View File

@ -55,7 +55,7 @@ type hostpathCSIDriver struct {
manifests []string
}
func initHostPathCSIDriver(name string, manifests ...string) testsuites.TestDriver {
func initHostPathCSIDriver(name string, config testsuites.TestConfig, manifests ...string) testsuites.TestDriver {
return &hostpathCSIDriver{
driverInfo: testsuites.DriverInfo{
Name: name,
@ -67,6 +67,8 @@ func initHostPathCSIDriver(name string, manifests ...string) testsuites.TestDriv
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
},
Config: config,
},
manifests: manifests,
}
@ -76,8 +78,8 @@ var _ testsuites.TestDriver = &hostpathCSIDriver{}
var _ testsuites.DynamicPVTestDriver = &hostpathCSIDriver{}
// InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface
func InitHostPathCSIDriver() testsuites.TestDriver {
return initHostPathCSIDriver("csi-hostpath",
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",
@ -98,7 +100,7 @@ func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern
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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
@ -110,14 +112,13 @@ func (h *hostpathCSIDriver) GetClaimSize() string {
func (h *hostpathCSIDriver) CreateDriver() {
By(fmt.Sprintf("deploying %s driver", h.driverInfo.Name))
f := h.driverInfo.Framework
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.
@ -126,10 +127,10 @@ func (h *hostpathCSIDriver) CreateDriver() {
NewDriverName: testsuites.GetUniqueDriverName(h),
DriverContainerName: "hostpath",
ProvisionerContainerName: "csi-provisioner",
NodeName: h.driverInfo.Config.ServerNodeName,
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
@ -146,8 +147,8 @@ func (h *hostpathCSIDriver) CleanupDriver() {
}
// InitHostPathV0CSIDriver returns a variant of hostpathCSIDriver with different manifests.
func InitHostPathV0CSIDriver() testsuites.TestDriver {
return initHostPathCSIDriver("csi-hostpath-v0",
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",
@ -168,7 +169,7 @@ var _ testsuites.TestDriver = &gcePDCSIDriver{}
var _ testsuites.DynamicPVTestDriver = &gcePDCSIDriver{}
// InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface
func InitGcePDCSIDriver() testsuites.TestDriver {
func InitGcePDCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &gcePDCSIDriver{
driverInfo: testsuites.DriverInfo{
Name: "pd.csi.storage.gke.io",
@ -186,6 +187,8 @@ func InitGcePDCSIDriver() testsuites.TestDriver {
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -195,13 +198,13 @@ func (g *gcePDCSIDriver) GetDriverInfo() *testsuites.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)
@ -228,9 +231,9 @@ func (g *gcePDCSIDriver) CreateDriver() {
// 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",
@ -260,7 +263,7 @@ var _ testsuites.TestDriver = &gcePDExternalCSIDriver{}
var _ testsuites.DynamicPVTestDriver = &gcePDExternalCSIDriver{}
// InitGcePDExternalCSIDriver returns gcePDExternalCSIDriver that implements TestDriver interface
func InitGcePDExternalCSIDriver() testsuites.TestDriver {
func InitGcePDExternalCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &gcePDExternalCSIDriver{
driverInfo: testsuites.DriverInfo{
Name: "pd.csi.storage.gke.io",
@ -280,6 +283,8 @@ func InitGcePDExternalCSIDriver() testsuites.TestDriver {
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -290,11 +295,11 @@ func (g *gcePDExternalCSIDriver) GetDriverInfo() *testsuites.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)

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

@ -81,7 +81,7 @@ var _ testsuites.PreprovisionedPVTestDriver = &nfsDriver{}
var _ testsuites.DynamicPVTestDriver = &nfsDriver{}
// InitNFSDriver returns nfsDriver that implements TestDriver interface
func InitNFSDriver() testsuites.TestDriver {
func InitNFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &nfsDriver{
driverInfo: testsuites.DriverInfo{
Name: "nfs",
@ -95,6 +95,8 @@ func InitNFSDriver() testsuites.TestDriver {
testsuites.CapPersistence: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -133,7 +135,7 @@ 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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
@ -144,11 +146,14 @@ func (n *nfsDriver) GetClaimSize() string {
}
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,
@ -164,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
@ -174,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
@ -186,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,
@ -200,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")
@ -233,7 +238,7 @@ var _ testsuites.InlineVolumeTestDriver = &glusterFSDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &glusterFSDriver{}
// InitGlusterFSDriver returns glusterFSDriver that implements TestDriver interface
func InitGlusterFSDriver() testsuites.TestDriver {
func InitGlusterFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &glusterFSDriver{
driverInfo: testsuites.DriverInfo{
Name: "gluster",
@ -245,6 +250,8 @@ func InitGlusterFSDriver() testsuites.TestDriver {
testsuites.CapPersistence: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -291,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,
@ -310,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
@ -350,7 +359,7 @@ var _ testsuites.InlineVolumeTestDriver = &iSCSIDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &iSCSIDriver{}
// InitISCSIDriver returns iSCSIDriver that implements TestDriver interface
func InitISCSIDriver() testsuites.TestDriver {
func InitISCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &iSCSIDriver{
driverInfo: testsuites.DriverInfo{
Name: "iscsi",
@ -369,6 +378,8 @@ func InitISCSIDriver() testsuites.TestDriver {
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -418,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,
@ -437,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")
@ -462,7 +475,7 @@ var _ testsuites.InlineVolumeTestDriver = &rbdDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &rbdDriver{}
// InitRbdDriver returns rbdDriver that implements TestDriver interface
func InitRbdDriver() testsuites.TestDriver {
func InitRbdDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &rbdDriver{
driverInfo: testsuites.DriverInfo{
Name: "rbd",
@ -481,6 +494,8 @@ func InitRbdDriver() testsuites.TestDriver {
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -515,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)
@ -541,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,
@ -561,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")
@ -590,7 +607,7 @@ var _ testsuites.InlineVolumeTestDriver = &cephFSDriver{}
var _ testsuites.PreprovisionedPVTestDriver = &cephFSDriver{}
// InitCephFSDriver returns cephFSDriver that implements TestDriver interface
func InitCephFSDriver() testsuites.TestDriver {
func InitCephFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &cephFSDriver{
driverInfo: testsuites.DriverInfo{
Name: "ceph",
@ -603,6 +620,8 @@ func InitCephFSDriver() testsuites.TestDriver {
testsuites.CapPersistence: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -631,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)
@ -651,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,
@ -671,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")
@ -691,7 +712,7 @@ var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathDriver{}
var _ testsuites.InlineVolumeTestDriver = &hostPathDriver{}
// InitHostPathDriver returns hostPathDriver that implements TestDriver interface
func InitHostPathDriver() testsuites.TestDriver {
func InitHostPathDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &hostPathDriver{
driverInfo: testsuites.DriverInfo{
Name: "hostPath",
@ -702,6 +723,8 @@ func InitHostPathDriver() testsuites.TestDriver {
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
},
Config: config,
},
}
}
@ -732,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
@ -763,7 +786,7 @@ var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{}
var _ testsuites.InlineVolumeTestDriver = &hostPathSymlinkDriver{}
// InitHostPathSymlinkDriver returns hostPathSymlinkDriver that implements TestDriver interface
func InitHostPathSymlinkDriver() testsuites.TestDriver {
func InitHostPathSymlinkDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &hostPathSymlinkDriver{
driverInfo: testsuites.DriverInfo{
Name: "hostPathSymlink",
@ -774,6 +797,8 @@ func InitHostPathSymlinkDriver() testsuites.TestDriver {
Capabilities: map[testsuites.Capability]bool{
testsuites.CapPersistence: true,
},
Config: config,
},
}
}
@ -807,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)
@ -875,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")
@ -903,7 +928,7 @@ var _ testsuites.PreprovisionedVolumeTestDriver = &emptydirDriver{}
var _ testsuites.InlineVolumeTestDriver = &emptydirDriver{}
// InitEmptydirDriver returns emptydirDriver that implements TestDriver interface
func InitEmptydirDriver() testsuites.TestDriver {
func InitEmptydirDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &emptydirDriver{
driverInfo: testsuites.DriverInfo{
Name: "emptydir",
@ -914,6 +939,8 @@ func InitEmptydirDriver() testsuites.TestDriver {
Capabilities: map[testsuites.Capability]bool{
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -969,7 +996,7 @@ var _ testsuites.PreprovisionedPVTestDriver = &cinderDriver{}
var _ testsuites.DynamicPVTestDriver = &cinderDriver{}
// InitCinderDriver returns cinderDriver that implements TestDriver interface
func InitCinderDriver() testsuites.TestDriver {
func InitCinderDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &cinderDriver{
driverInfo: testsuites.DriverInfo{
Name: "cinder",
@ -983,6 +1010,8 @@ func InitCinderDriver() testsuites.TestDriver {
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -1033,7 +1062,7 @@ 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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
@ -1050,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
@ -1129,7 +1158,7 @@ var _ testsuites.PreprovisionedPVTestDriver = &gcePdDriver{}
var _ testsuites.DynamicPVTestDriver = &gcePdDriver{}
// InitGceDriver returns gcePdDriver that implements TestDriver interface
func InitGcePdDriver() testsuites.TestDriver {
func InitGcePdDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &gcePdDriver{
driverInfo: testsuites.DriverInfo{
Name: "gcepd",
@ -1148,6 +1177,8 @@ func InitGcePdDriver() testsuites.TestDriver {
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -1199,7 +1230,7 @@ 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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
@ -1219,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,
}
}
@ -1254,7 +1285,7 @@ var _ testsuites.PreprovisionedPVTestDriver = &vSphereDriver{}
var _ testsuites.DynamicPVTestDriver = &vSphereDriver{}
// InitVSphereDriver returns vSphereDriver that implements TestDriver interface
func InitVSphereDriver() testsuites.TestDriver {
func InitVSphereDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &vSphereDriver{
driverInfo: testsuites.DriverInfo{
Name: "vSphere",
@ -1268,6 +1299,8 @@ func InitVSphereDriver() testsuites.TestDriver {
testsuites.CapFsGroup: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -1325,7 +1358,7 @@ 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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
@ -1342,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)
@ -1376,7 +1409,7 @@ var _ testsuites.PreprovisionedPVTestDriver = &azureDriver{}
var _ testsuites.DynamicPVTestDriver = &azureDriver{}
// InitAzureDriver returns azureDriver that implements TestDriver interface
func InitAzureDriver() testsuites.TestDriver {
func InitAzureDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &azureDriver{
driverInfo: testsuites.DriverInfo{
Name: "azure",
@ -1391,6 +1424,8 @@ func InitAzureDriver() testsuites.TestDriver {
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -1447,7 +1482,7 @@ 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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)
@ -1495,7 +1530,7 @@ var _ testsuites.TestDriver = &awsDriver{}
var _ testsuites.DynamicPVTestDriver = &awsDriver{}
// InitAwsDriver returns awsDriver that implements TestDriver interface
func InitAwsDriver() testsuites.TestDriver {
func InitAwsDriver(config testsuites.TestConfig) testsuites.TestDriver {
return &awsDriver{
driverInfo: testsuites.DriverInfo{
Name: "aws",
@ -1511,6 +1546,8 @@ func InitAwsDriver() testsuites.TestDriver {
testsuites.CapBlock: true,
testsuites.CapExec: true,
},
Config: config,
},
}
}
@ -1558,7 +1595,7 @@ 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 testsuites.GetStorageClass(provisioner, parameters, nil, ns, suffix)

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() testsuites.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()
curDriver := initDriver(config)
Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() {
driver := curDriver
BeforeEach(func() {
// setupDriver
testsuites.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

@ -65,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 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)
@ -136,7 +136,7 @@ var _ TestResource = &genericVolumeTestResource{}
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
@ -189,7 +189,7 @@ func (r *genericVolumeTestResource) setupResource(driver TestDriver, pattern tes
// cleanupResource cleans up genericVolumeTestResource
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 {
@ -323,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

@ -68,19 +68,6 @@ func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResou
}
}
// 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
}
// GetStorageClass constructs a new StorageClass instance
// with a unique name that is based on namespace + suffix.
func GetStorageClass(
@ -110,5 +97,5 @@ func GetStorageClass(
// 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)
return fmt.Sprintf("%s-%s", driver.GetDriverInfo().Name, driver.GetDriverInfo().Config.Framework.UniqueName)
}

View File

@ -86,7 +86,7 @@ func createProvisioningTestInput(driver TestDriver, pattern testpatterns.TestPat
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(),
@ -151,7 +151,7 @@ func (p *provisioningTestResource) setupResource(driver TestDriver, pattern test
}
p.driver = driver
p.claimSize = dDriver.GetClaimSize()
p.pvc = getClaim(p.claimSize, driver.GetDriverInfo().Framework.Namespace.Name)
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)
}

View File

@ -77,7 +77,7 @@ func (s *subPathTestSuite) skipUnsupportedTest(pattern testpatterns.TestPattern,
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)
@ -139,7 +139,7 @@ var _ TestResource = &subPathTestResource{}
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
@ -174,16 +174,16 @@ func (s *subPathTestResource) setupResource(driver TestDriver, pattern testpatte
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 TestDriver, pattern testpatterns.TestPattern) {
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
// Cleanup subPath test dependent resource
By("Deleting pod")

View File

@ -99,9 +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.
}
// 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
// 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

@ -81,7 +81,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV
var fsGroup *int64
driver := resource.driver
dInfo := driver.GetDriverInfo()
f := dInfo.Framework
f := dInfo.Config.Framework
fileSizes := createFileSizes(dInfo.MaxFileSize)
volSource := resource.volSource
@ -97,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{
@ -142,7 +142,7 @@ func (t *volumeIOTestSuite) execTest(driver TestDriver, pattern testpatterns.Tes
type volumeIOTestInput struct {
f *framework.Framework
name string
config framework.VolumeTestConfig
config *TestConfig
volSource v1.VolumeSource
testFile string
podSec v1.PodSecurityContext
@ -154,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

@ -67,7 +67,7 @@ func (t *volumeModeTestSuite) skipUnsupportedTest(pattern testpatterns.TestPatte
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,
@ -154,7 +154,7 @@ var _ TestResource = &volumeModeTestResource{}
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
@ -207,7 +207,7 @@ func (s *volumeModeTestResource) setupResource(driver TestDriver, pattern testpa
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

View File

@ -93,7 +93,7 @@ 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 {
@ -108,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{
@ -158,7 +158,7 @@ func (t *volumesTestSuite) execTest(driver TestDriver, pattern testpatterns.Test
type volumesTestInput struct {
f *framework.Framework
name string
config framework.VolumeTestConfig
config *TestConfig
fsGroup *int64
tests []framework.VolumeTest
resource genericVolumeTestResource
@ -168,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)
})
}