e2e/storage: introduce TestVolume interface

This increases type safety and makes the code easier to read because
it becomes obvious that the "test resource" passed to some functions
must be the result of a previous CreateVolume.

This makes it possible to remove:
- functions that never did anything (the DeleteVolume methods in
  drivers that never create a volume)
- type casts (in the DeleteVolume implementation)
- the unused DeleteVolume parameters
- the stand-alone DeleteVolume function (which would be just a non-nil
  check)

GetPersistentVolumeSource and GetVolumeSource could also become
methods on more specific interfaces - they don't actually use anything
from TestDriver instance which provides them.

The main motivation however is to reduce the number of methods which
might need an explicit test config parameter.
This commit is contained in:
Patrick Ohly 2018-12-28 23:22:06 +01:00
parent bf20886f4e
commit 1cb121d2a9
6 changed files with 203 additions and 253 deletions

View File

@ -69,9 +69,10 @@ type nfsDriver struct {
driverInfo testsuites.DriverInfo
}
type nfsTestResource struct {
type nfsVolume struct {
serverIP string
serverPod *v1.Pod
f *framework.Framework
}
var _ testsuites.TestDriver = &nfsDriver{}
@ -108,24 +109,24 @@ func (n *nfsDriver) GetDriverInfo() *testsuites.DriverInfo {
func (n *nfsDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (n *nfsDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
ntr, ok := testResource.(*nfsTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to NFS Test Resource")
func (n *nfsDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
nv, ok := volume.(*nfsVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to NFS test volume")
return &v1.VolumeSource{
NFS: &v1.NFSVolumeSource{
Server: ntr.serverIP,
Server: nv.serverIP,
Path: "/",
ReadOnly: readOnly,
},
}
}
func (n *nfsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
ntr, ok := testResource.(*nfsTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to NFS Test Resource")
func (n *nfsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
nv, ok := volume.(*nfsVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to NFS test volume")
return &v1.PersistentVolumeSource{
NFS: &v1.NFSVolumeSource{
Server: ntr.serverIP,
Server: nv.serverIP,
Path: "/",
ReadOnly: readOnly,
},
@ -175,7 +176,7 @@ func (n *nfsDriver) CleanupDriver() {
cs.RbacV1beta1().ClusterRoleBindings().Delete(clusterRoleBindingName, metav1.NewDeleteOptions(0))
}
func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := n.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
@ -189,9 +190,10 @@ func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
case testpatterns.PreprovisionedPV:
config, serverPod, serverIP := framework.NewNFSServer(cs, ns.Name, []string{})
n.driverInfo.Config.ServerConfig = &config
return &nfsTestResource{
return &nfsVolume{
serverIP: serverIP,
serverPod: serverPod,
f: f,
}
case testpatterns.DynamicPV:
// Do nothing
@ -201,22 +203,8 @@ func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
return nil
}
func (n *nfsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := n.driverInfo.Config.Framework
ntr, ok := testResource.(*nfsTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to NFS Test Resource")
switch volType {
case testpatterns.InlineVolume:
fallthrough
case testpatterns.PreprovisionedPV:
framework.CleanUpVolumeServer(f, ntr.serverPod)
case testpatterns.DynamicPV:
// Do nothing
default:
framework.Failf("Unsupported volType:%v is specified", volType)
}
func (v *nfsVolume) DeleteVolume() {
framework.CleanUpVolumeServer(v.f, v.serverPod)
}
// Gluster
@ -224,9 +212,10 @@ type glusterFSDriver struct {
driverInfo testsuites.DriverInfo
}
type glusterTestResource struct {
type glusterVolume struct {
prefix string
serverPod *v1.Pod
f *framework.Framework
}
var _ testsuites.TestDriver = &glusterFSDriver{}
@ -261,11 +250,11 @@ func (g *glusterFSDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern)
framework.SkipUnlessNodeOSDistroIs("gci", "ubuntu", "custom")
}
func (g *glusterFSDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
gtr, ok := testResource.(*glusterTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Gluster Test Resource")
func (g *glusterFSDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
gv, ok := volume.(*glusterVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Gluster test volume")
name := gtr.prefix + "-server"
name := gv.prefix + "-server"
return &v1.VolumeSource{
Glusterfs: &v1.GlusterfsVolumeSource{
EndpointsName: name,
@ -276,11 +265,11 @@ func (g *glusterFSDriver) GetVolumeSource(readOnly bool, fsType string, testReso
}
}
func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
gtr, ok := testResource.(*glusterTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Gluster Test Resource")
func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
gv, ok := volume.(*glusterVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Gluster test volume")
name := gtr.prefix + "-server"
name := gv.prefix + "-server"
return &v1.PersistentVolumeSource{
Glusterfs: &v1.GlusterfsPersistentVolumeSource{
EndpointsName: name,
@ -297,28 +286,26 @@ func (g *glusterFSDriver) CreateDriver() {
func (g *glusterFSDriver) CleanupDriver() {
}
func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := g.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, _ := framework.NewGlusterfsServer(cs, ns.Name)
g.driverInfo.Config.ServerConfig = &config
return &glusterTestResource{
return &glusterVolume{
prefix: config.Prefix,
serverPod: serverPod,
f: f,
}
}
func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := g.driverInfo.Config.Framework
func (v *glusterVolume) DeleteVolume() {
f := v.f
cs := f.ClientSet
ns := f.Namespace
gtr, ok := testResource.(*glusterTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Gluster Test Resource")
name := gtr.prefix + "-server"
name := v.prefix + "-server"
framework.Logf("Deleting Gluster endpoints %q...", name)
err := cs.CoreV1().Endpoints(ns.Name).Delete(name, nil)
@ -328,8 +315,8 @@ func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testRes
}
framework.Logf("Gluster endpoints %q not found, assuming deleted", name)
}
framework.Logf("Deleting Gluster server pod %q...", gtr.serverPod.Name)
err = framework.DeletePodWithWait(f, cs, gtr.serverPod)
framework.Logf("Deleting Gluster server pod %q...", v.serverPod.Name)
err = framework.DeletePodWithWait(f, cs, v.serverPod)
if err != nil {
framework.Failf("Gluster server pod delete failed: %v", err)
}
@ -340,9 +327,10 @@ func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testRes
type iSCSIDriver struct {
driverInfo testsuites.DriverInfo
}
type iSCSITestResource struct {
type iSCSIVolume struct {
serverPod *v1.Pod
serverIP string
f *framework.Framework
}
var _ testsuites.TestDriver = &iSCSIDriver{}
@ -383,13 +371,13 @@ func (i *iSCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
func (i *iSCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (i *iSCSIDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
itr, ok := testResource.(*iSCSITestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to iSCSI Test Resource")
func (i *iSCSIDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
iv, ok := volume.(*iSCSIVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to iSCSI test volume")
volSource := v1.VolumeSource{
ISCSI: &v1.ISCSIVolumeSource{
TargetPortal: itr.serverIP + ":3260",
TargetPortal: iv.serverIP + ":3260",
// from test/images/volume/iscsi/initiatorname.iscsi
IQN: "iqn.2003-01.org.linux-iscsi.f21.x8664:sn.4b0aae584f7c",
Lun: 0,
@ -402,13 +390,13 @@ func (i *iSCSIDriver) GetVolumeSource(readOnly bool, fsType string, testResource
return &volSource
}
func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
itr, ok := testResource.(*iSCSITestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to iSCSI Test Resource")
func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
iv, ok := volume.(*iSCSIVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to iSCSI test volume")
pvSource := v1.PersistentVolumeSource{
ISCSI: &v1.ISCSIPersistentVolumeSource{
TargetPortal: itr.serverIP + ":3260",
TargetPortal: iv.serverIP + ":3260",
IQN: "iqn.2003-01.org.linux-iscsi.f21.x8664:sn.4b0aae584f7c",
Lun: 0,
ReadOnly: readOnly,
@ -426,26 +414,22 @@ func (i *iSCSIDriver) CreateDriver() {
func (i *iSCSIDriver) CleanupDriver() {
}
func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := i.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, serverIP := framework.NewISCSIServer(cs, ns.Name)
i.driverInfo.Config.ServerConfig = &config
return &iSCSITestResource{
return &iSCSIVolume{
serverPod: serverPod,
serverIP: serverIP,
f: f,
}
}
func (i *iSCSIDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := i.driverInfo.Config.Framework
itr, ok := testResource.(*iSCSITestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to iSCSI Test Resource")
framework.CleanUpVolumeServer(f, itr.serverPod)
func (v *iSCSIVolume) DeleteVolume() {
framework.CleanUpVolumeServer(v.f, v.serverPod)
}
// Ceph RBD
@ -453,10 +437,11 @@ type rbdDriver struct {
driverInfo testsuites.DriverInfo
}
type rbdTestResource struct {
type rbdVolume struct {
serverPod *v1.Pod
serverIP string
secret *v1.Secret
f *framework.Framework
}
var _ testsuites.TestDriver = &rbdDriver{}
@ -497,18 +482,18 @@ func (r *rbdDriver) GetDriverInfo() *testsuites.DriverInfo {
func (r *rbdDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
rtr, ok := testResource.(*rbdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to RBD Test Resource")
func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
rv, ok := volume.(*rbdVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to RBD test volume")
volSource := v1.VolumeSource{
RBD: &v1.RBDVolumeSource{
CephMonitors: []string{rtr.serverIP},
CephMonitors: []string{rv.serverIP},
RBDPool: "rbd",
RBDImage: "foo",
RadosUser: "admin",
SecretRef: &v1.LocalObjectReference{
Name: rtr.secret.Name,
Name: rv.secret.Name,
},
ReadOnly: readOnly,
},
@ -519,21 +504,21 @@ func (r *rbdDriver) GetVolumeSource(readOnly bool, fsType string, testResource i
return &volSource
}
func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
f := r.driverInfo.Config.Framework
ns := f.Namespace
rtr, ok := testResource.(*rbdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to RBD Test Resource")
rv, ok := volume.(*rbdVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to RBD test volume")
pvSource := v1.PersistentVolumeSource{
RBD: &v1.RBDPersistentVolumeSource{
CephMonitors: []string{rtr.serverIP},
CephMonitors: []string{rv.serverIP},
RBDPool: "rbd",
RBDImage: "foo",
RadosUser: "admin",
SecretRef: &v1.SecretReference{
Name: rtr.secret.Name,
Name: rv.secret.Name,
Namespace: ns.Name,
},
ReadOnly: readOnly,
@ -551,27 +536,23 @@ func (r *rbdDriver) CreateDriver() {
func (r *rbdDriver) CleanupDriver() {
}
func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := r.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
r.driverInfo.Config.ServerConfig = &config
return &rbdTestResource{
return &rbdVolume{
serverPod: serverPod,
serverIP: serverIP,
secret: secret,
f: f,
}
}
func (r *rbdDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := r.driverInfo.Config.Framework
rtr, ok := testResource.(*rbdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to RBD Test Resource")
framework.CleanUpVolumeServerWithSecret(f, rtr.serverPod, rtr.secret)
func (v *rbdVolume) DeleteVolume() {
framework.CleanUpVolumeServerWithSecret(v.f, v.serverPod, v.secret)
}
// Ceph
@ -583,10 +564,11 @@ type cephFSDriver struct {
driverInfo testsuites.DriverInfo
}
type cephTestResource struct {
type cephVolume struct {
serverPod *v1.Pod
serverIP string
secret *v1.Secret
f *framework.Framework
}
var _ testsuites.TestDriver = &cephFSDriver{}
@ -621,35 +603,35 @@ func (c *cephFSDriver) GetDriverInfo() *testsuites.DriverInfo {
func (c *cephFSDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (c *cephFSDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
ctr, ok := testResource.(*cephTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Ceph Test Resource")
func (c *cephFSDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
cv, ok := volume.(*cephVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Ceph test volume")
return &v1.VolumeSource{
CephFS: &v1.CephFSVolumeSource{
Monitors: []string{ctr.serverIP + ":6789"},
Monitors: []string{cv.serverIP + ":6789"},
User: "kube",
SecretRef: &v1.LocalObjectReference{
Name: ctr.secret.Name,
Name: cv.secret.Name,
},
ReadOnly: readOnly,
},
}
}
func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
f := c.driverInfo.Config.Framework
ns := f.Namespace
ctr, ok := testResource.(*cephTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Ceph Test Resource")
cv, ok := volume.(*cephVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Ceph test volume")
return &v1.PersistentVolumeSource{
CephFS: &v1.CephFSPersistentVolumeSource{
Monitors: []string{ctr.serverIP + ":6789"},
Monitors: []string{cv.serverIP + ":6789"},
User: "kube",
SecretRef: &v1.SecretReference{
Name: ctr.secret.Name,
Name: cv.secret.Name,
Namespace: ns.Name,
},
ReadOnly: readOnly,
@ -663,27 +645,23 @@ func (c *cephFSDriver) CreateDriver() {
func (c *cephFSDriver) CleanupDriver() {
}
func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := c.driverInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
c.driverInfo.Config.ServerConfig = &config
return &cephTestResource{
return &cephVolume{
serverPod: serverPod,
serverIP: serverIP,
secret: secret,
f: f,
}
}
func (c *cephFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := c.driverInfo.Config.Framework
ctr, ok := testResource.(*cephTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Ceph Test Resource")
framework.CleanUpVolumeServerWithSecret(f, ctr.serverPod, ctr.secret)
func (v *cephVolume) DeleteVolume() {
framework.CleanUpVolumeServerWithSecret(v.f, v.serverPod, v.secret)
}
// Hostpath
@ -722,7 +700,7 @@ func (h *hostPathDriver) GetDriverInfo() *testsuites.DriverInfo {
func (h *hostPathDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (h *hostPathDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
func (h *hostPathDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
// hostPath doesn't support readOnly volume
if readOnly {
return nil
@ -740,7 +718,7 @@ func (h *hostPathDriver) CreateDriver() {
func (h *hostPathDriver) CleanupDriver() {
}
func (h *hostPathDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (h *hostPathDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := h.driverInfo.Config.Framework
cs := f.ClientSet
@ -751,9 +729,6 @@ func (h *hostPathDriver) CreateVolume(volType testpatterns.TestVolType) interfac
return nil
}
func (h *hostPathDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
}
// HostPathSymlink
type hostPathSymlinkDriver struct {
node v1.Node
@ -761,10 +736,11 @@ type hostPathSymlinkDriver struct {
driverInfo testsuites.DriverInfo
}
type hostPathSymlinkTestResource struct {
type hostPathSymlinkVolume struct {
targetPath string
sourcePath string
prepPod *v1.Pod
f *framework.Framework
}
var _ testsuites.TestDriver = &hostPathSymlinkDriver{}
@ -796,9 +772,9 @@ func (h *hostPathSymlinkDriver) GetDriverInfo() *testsuites.DriverInfo {
func (h *hostPathSymlinkDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (h *hostPathSymlinkDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
htr, ok := testResource.(*hostPathSymlinkTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Hostpath Symlink Test Resource")
func (h *hostPathSymlinkDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
hv, ok := volume.(*hostPathSymlinkVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Hostpath Symlink test volume")
// hostPathSymlink doesn't support readOnly volume
if readOnly {
@ -806,7 +782,7 @@ func (h *hostPathSymlinkDriver) GetVolumeSource(readOnly bool, fsType string, te
}
return &v1.VolumeSource{
HostPath: &v1.HostPathVolumeSource{
Path: htr.targetPath,
Path: hv.targetPath,
},
}
}
@ -817,7 +793,7 @@ func (h *hostPathSymlinkDriver) CreateDriver() {
func (h *hostPathSymlinkDriver) CleanupDriver() {
}
func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := h.driverInfo.Config.Framework
cs := f.ClientSet
@ -878,23 +854,21 @@ func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) i
err = framework.DeletePodWithWait(f, f.ClientSet, pod)
Expect(err).ToNot(HaveOccurred(), "while deleting hostPath init pod")
return &hostPathSymlinkTestResource{
return &hostPathSymlinkVolume{
sourcePath: sourcePath,
targetPath: targetPath,
prepPod: prepPod,
f: f,
}
}
func (h *hostPathSymlinkDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
f := h.driverInfo.Config.Framework
func (v *hostPathSymlinkVolume) DeleteVolume() {
f := v.f
htr, ok := testResource.(*hostPathSymlinkTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Hostpath Symlink Test Resource")
cmd := fmt.Sprintf("rm -rf %v&& rm -rf %v", v.targetPath, v.sourcePath)
v.prepPod.Spec.Containers[0].Command = []string{"/bin/sh", "-ec", cmd}
cmd := fmt.Sprintf("rm -rf %v&& rm -rf %v", htr.targetPath, htr.sourcePath)
htr.prepPod.Spec.Containers[0].Command = []string{"/bin/sh", "-ec", cmd}
pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(htr.prepPod)
pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(v.prepPod)
Expect(err).ToNot(HaveOccurred(), "while creating hostPath teardown pod")
err = framework.WaitForPodSuccessInNamespace(f.ClientSet, pod.Name, pod.Namespace)
@ -938,7 +912,7 @@ func (e *emptydirDriver) GetDriverInfo() *testsuites.DriverInfo {
func (e *emptydirDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
}
func (e *emptydirDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
func (e *emptydirDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
// emptydir doesn't support readOnly volume
if readOnly {
return nil
@ -948,13 +922,10 @@ func (e *emptydirDriver) GetVolumeSource(readOnly bool, fsType string, testResou
}
}
func (e *emptydirDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (e *emptydirDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
return nil
}
func (e *emptydirDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
}
func (e *emptydirDriver) CreateDriver() {
}
@ -970,7 +941,7 @@ type cinderDriver struct {
driverInfo testsuites.DriverInfo
}
type cinderTestResource struct {
type cinderVolume struct {
volumeName string
volumeID string
}
@ -1010,13 +981,13 @@ func (c *cinderDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
framework.SkipUnlessProviderIs("openstack")
}
func (c *cinderDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
ctr, ok := testResource.(*cinderTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Cinder Test Resource")
func (c *cinderDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
cv, ok := volume.(*cinderVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Cinder test volume")
volSource := v1.VolumeSource{
Cinder: &v1.CinderVolumeSource{
VolumeID: ctr.volumeID,
VolumeID: cv.volumeID,
ReadOnly: readOnly,
},
}
@ -1026,13 +997,13 @@ func (c *cinderDriver) GetVolumeSource(readOnly bool, fsType string, testResourc
return &volSource
}
func (c *cinderDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
ctr, ok := testResource.(*cinderTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Cinder Test Resource")
func (c *cinderDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
cv, ok := volume.(*cinderVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Cinder test volume")
pvSource := v1.PersistentVolumeSource{
Cinder: &v1.CinderPersistentVolumeSource{
VolumeID: ctr.volumeID,
VolumeID: cv.volumeID,
ReadOnly: readOnly,
},
}
@ -1064,7 +1035,7 @@ func (c *cinderDriver) CreateDriver() {
func (c *cinderDriver) CleanupDriver() {
}
func (c *cinderDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (c *cinderDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := c.driverInfo.Config.Framework
ns := f.Namespace
@ -1095,20 +1066,15 @@ func (c *cinderDriver) CreateVolume(volType testpatterns.TestVolType) interface{
}
framework.Logf("Volume ID: %s", volumeID)
Expect(volumeID).NotTo(Equal(""))
return &cinderTestResource{
return &cinderVolume{
volumeName: volumeName,
volumeID: volumeID,
}
}
func (c *cinderDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
ctr, ok := testResource.(*cinderTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Cinder Test Resource")
func (v *cinderVolume) DeleteVolume() {
name := v.volumeName
deleteCinderVolume(ctr.volumeName)
}
func deleteCinderVolume(name string) error {
// Try to delete the volume for several seconds - it takes
// a while for the plugin to detach it.
var output []byte
@ -1120,12 +1086,11 @@ func deleteCinderVolume(name string) error {
output, err = exec.Command("cinder", "delete", name).CombinedOutput()
if err == nil {
framework.Logf("Cinder volume %s deleted", name)
return nil
return
}
framework.Logf("Failed to delete volume %s: %v", name, err)
}
framework.Logf("Giving up deleting volume %s: %v\n%s", name, err, string(output[:]))
return err
}
// GCE
@ -1133,7 +1098,7 @@ type gcePdDriver struct {
driverInfo testsuites.DriverInfo
}
type gcePdTestResource struct {
type gcePdVolume struct {
volumeName string
}
@ -1177,12 +1142,12 @@ func (g *gcePdDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
framework.SkipUnlessProviderIs("gce", "gke")
}
func (g *gcePdDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
gtr, ok := testResource.(*gcePdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to GCE PD Test Resource")
func (g *gcePdDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
gv, ok := volume.(*gcePdVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to GCE PD test volume")
volSource := v1.VolumeSource{
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
PDName: gtr.volumeName,
PDName: gv.volumeName,
ReadOnly: readOnly,
},
}
@ -1192,12 +1157,12 @@ func (g *gcePdDriver) GetVolumeSource(readOnly bool, fsType string, testResource
return &volSource
}
func (g *gcePdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
gtr, ok := testResource.(*gcePdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to GCE PD Test Resource")
func (g *gcePdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
gv, ok := volume.(*gcePdVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to GCE PD test volume")
pvSource := v1.PersistentVolumeSource{
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
PDName: gtr.volumeName,
PDName: gv.volumeName,
ReadOnly: readOnly,
},
}
@ -1229,7 +1194,7 @@ func (g *gcePdDriver) CreateDriver() {
func (g *gcePdDriver) CleanupDriver() {
}
func (g *gcePdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (g *gcePdDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
if volType == testpatterns.InlineVolume {
// PD will be created in framework.TestContext.CloudConfig.Zone zone,
// so pods should be also scheduled there.
@ -1240,15 +1205,13 @@ func (g *gcePdDriver) CreateVolume(volType testpatterns.TestVolType) interface{}
By("creating a test gce pd volume")
vname, err := framework.CreatePDWithRetry()
Expect(err).NotTo(HaveOccurred())
return &gcePdTestResource{
return &gcePdVolume{
volumeName: vname,
}
}
func (g *gcePdDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
gtr, ok := testResource.(*gcePdTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to GCE PD Test Resource")
framework.DeletePDWithRetry(gtr.volumeName)
func (v *gcePdVolume) DeleteVolume() {
framework.DeletePDWithRetry(v.volumeName)
}
// vSphere
@ -1256,7 +1219,7 @@ type vSphereDriver struct {
driverInfo testsuites.DriverInfo
}
type vSphereTestResource struct {
type vSphereVolume struct {
volumePath string
nodeInfo *vspheretest.NodeInfo
}
@ -1295,9 +1258,9 @@ func (v *vSphereDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
framework.SkipUnlessProviderIs("vsphere")
}
func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
vtr, ok := testResource.(*vSphereTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to vSphere Test Resource")
func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
vsv, ok := volume.(*vSphereVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to vSphere test volume")
// vSphere driver doesn't seem to support readOnly volume
// TODO: check if it is correct
@ -1306,7 +1269,7 @@ func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, testResour
}
volSource := v1.VolumeSource{
VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{
VolumePath: vtr.volumePath,
VolumePath: vsv.volumePath,
},
}
if fsType != "" {
@ -1315,9 +1278,9 @@ func (v *vSphereDriver) GetVolumeSource(readOnly bool, fsType string, testResour
return &volSource
}
func (v *vSphereDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
vtr, ok := testResource.(*vSphereTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to vSphere Test Resource")
func (v *vSphereDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
vsv, ok := volume.(*vSphereVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to vSphere test volume")
// vSphere driver doesn't seem to support readOnly volume
// TODO: check if it is correct
@ -1326,7 +1289,7 @@ func (v *vSphereDriver) GetPersistentVolumeSource(readOnly bool, fsType string,
}
pvSource := v1.PersistentVolumeSource{
VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{
VolumePath: vtr.volumePath,
VolumePath: vsv.volumePath,
},
}
if fsType != "" {
@ -1357,23 +1320,20 @@ func (v *vSphereDriver) CreateDriver() {
func (v *vSphereDriver) CleanupDriver() {
}
func (v *vSphereDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (v *vSphereDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
f := v.driverInfo.Config.Framework
vspheretest.Bootstrap(f)
nodeInfo := vspheretest.GetReadySchedulableRandomNodeInfo()
volumePath, err := nodeInfo.VSphere.CreateVolume(&vspheretest.VolumeOptions{}, nodeInfo.DataCenterRef)
Expect(err).NotTo(HaveOccurred())
return &vSphereTestResource{
return &vSphereVolume{
volumePath: volumePath,
nodeInfo: nodeInfo,
}
}
func (v *vSphereDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
vtr, ok := testResource.(*vSphereTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to vSphere Test Resource")
vtr.nodeInfo.VSphere.DeleteVolume(vtr.volumePath, vtr.nodeInfo.DataCenterRef)
func (v *vSphereVolume) DeleteVolume() {
v.nodeInfo.VSphere.DeleteVolume(v.volumePath, v.nodeInfo.DataCenterRef)
}
// Azure
@ -1381,7 +1341,7 @@ type azureDriver struct {
driverInfo testsuites.DriverInfo
}
type azureTestResource struct {
type azureVolume struct {
volumeName string
}
@ -1421,16 +1381,16 @@ func (a *azureDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
framework.SkipUnlessProviderIs("azure")
}
func (a *azureDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
atr, ok := testResource.(*azureTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Azure Test Resource")
func (a *azureDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
av, ok := volume.(*azureVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Azure test volume")
diskName := atr.volumeName[(strings.LastIndex(atr.volumeName, "/") + 1):]
diskName := av.volumeName[(strings.LastIndex(av.volumeName, "/") + 1):]
volSource := v1.VolumeSource{
AzureDisk: &v1.AzureDiskVolumeSource{
DiskName: diskName,
DataDiskURI: atr.volumeName,
DataDiskURI: av.volumeName,
ReadOnly: &readOnly,
},
}
@ -1440,16 +1400,16 @@ func (a *azureDriver) GetVolumeSource(readOnly bool, fsType string, testResource
return &volSource
}
func (a *azureDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
atr, ok := testResource.(*azureTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Azure Test Resource")
func (a *azureDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
av, ok := volume.(*azureVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to Azure test volume")
diskName := atr.volumeName[(strings.LastIndex(atr.volumeName, "/") + 1):]
diskName := av.volumeName[(strings.LastIndex(av.volumeName, "/") + 1):]
pvSource := v1.PersistentVolumeSource{
AzureDisk: &v1.AzureDiskVolumeSource{
DiskName: diskName,
DataDiskURI: atr.volumeName,
DataDiskURI: av.volumeName,
ReadOnly: &readOnly,
},
}
@ -1481,20 +1441,17 @@ func (a *azureDriver) CreateDriver() {
func (a *azureDriver) CleanupDriver() {
}
func (a *azureDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (a *azureDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
By("creating a test azure disk volume")
volumeName, err := framework.CreatePDWithRetry()
Expect(err).NotTo(HaveOccurred())
return &azureTestResource{
return &azureVolume{
volumeName: volumeName,
}
}
func (a *azureDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
atr, ok := testResource.(*azureTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to Azure Test Resource")
framework.DeletePDWithRetry(atr.volumeName)
func (v *azureVolume) DeleteVolume() {
framework.DeletePDWithRetry(v.volumeName)
}
// AWS
@ -1545,7 +1502,7 @@ func (a *awsDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
// TODO: Fix authorization error in attach operation and uncomment below
/*
func (a *awsDriver) GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource {
func (a *awsDriver) GetVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) *v1.VolumeSource {
volSource := v1.VolumeSource{
AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{
VolumeID: a.volumeName,
@ -1558,7 +1515,7 @@ func (a *awsDriver) GetVolumeSource(readOnly bool, fsType string, testResource i
return &volSource
}
func (a *awsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
func (a *awsDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
pvSource := v1.PersistentVolumeSource{
AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{
VolumeID: a.volumeName,
@ -1596,14 +1553,14 @@ func (a *awsDriver) CleanupDriver() {
// TODO: Fix authorization error in attach operation and uncomment below
/*
func (a *awsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (a *awsDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
By("creating a test aws volume")
var err error
a.volumeName, err = framework.CreatePDWithRetry()
Expect(err).NotTo(HaveOccurred())
}
func (a *awsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
DeleteVolume() {
framework.DeletePDWithRetry(a.volumeName)
}
*/
@ -1619,6 +1576,11 @@ type localDriver struct {
ltrMgr utils.LocalTestResourceManager
}
type localVolume struct {
ltrMgr utils.LocalTestResourceManager
ltr *utils.LocalTestResource
}
var (
// capabilities
defaultLocalVolumeCapabilities = map[testsuites.Capability]bool{
@ -1727,29 +1689,24 @@ func (l *localDriver) randomNode() *v1.Node {
return &node
}
func (l *localDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
func (l *localDriver) CreateVolume(volType testpatterns.TestVolType) testsuites.TestVolume {
switch volType {
case testpatterns.PreprovisionedPV:
node := l.node
// assign this to schedule pod on this node
l.driverInfo.Config.ClientNodeName = node.Name
return l.ltrMgr.Create(node, l.volumeType, nil)
return &localVolume{
ltrMgr: l.ltrMgr,
ltr: l.ltrMgr.Create(node, l.volumeType, nil),
}
default:
framework.Failf("Unsupported volType: %v is specified", volType)
}
return nil
}
func (l *localDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
ltr, ok := testResource.(*utils.LocalTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to local Test Resource")
switch volType {
case testpatterns.PreprovisionedPV:
l.ltrMgr.Remove(ltr)
default:
framework.Failf("Unsupported volType: %v is specified", volType)
}
return
func (v *localVolume) DeleteVolume() {
v.ltrMgr.Remove(v.ltr)
}
func (l *localDriver) nodeAffinityForNode(node *v1.Node) *v1.VolumeNodeAffinity {
@ -1778,13 +1735,13 @@ func (l *localDriver) nodeAffinityForNode(node *v1.Node) *v1.VolumeNodeAffinity
}
}
func (l *localDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
ltr, ok := testResource.(*utils.LocalTestResource)
Expect(ok).To(BeTrue(), "Failed to cast test resource to local Test Resource")
func (l *localDriver) GetPersistentVolumeSource(readOnly bool, fsType string, volume testsuites.TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity) {
lv, ok := volume.(*localVolume)
Expect(ok).To(BeTrue(), "Failed to cast test volume to local test volume")
return &v1.PersistentVolumeSource{
Local: &v1.LocalVolumeSource{
Path: ltr.Path,
Path: lv.ltr.Path,
FSType: &fsType,
},
}, l.nodeAffinityForNode(ltr.Node)
}, l.nodeAffinityForNode(lv.ltr.Node)
}

View File

@ -147,7 +147,7 @@ type genericVolumeTestResource struct {
pv *v1.PersistentVolume
sc *storagev1.StorageClass
driverTestResource interface{}
volume TestVolume
}
var _ TestResource = &genericVolumeTestResource{}
@ -162,19 +162,19 @@ func (r *genericVolumeTestResource) setupResource(driver TestDriver, pattern tes
volType := pattern.VolType
// Create volume for pre-provisioned volume tests
r.driverTestResource = CreateVolume(driver, volType)
r.volume = CreateVolume(driver, volType)
switch volType {
case testpatterns.InlineVolume:
framework.Logf("Creating resource for inline volume")
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
r.volSource = iDriver.GetVolumeSource(false, fsType, r.driverTestResource)
r.volSource = iDriver.GetVolumeSource(false, fsType, r.volume)
r.volType = dInfo.Name
}
case testpatterns.PreprovisionedPV:
framework.Logf("Creating resource for pre-provisioned PV")
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
pvSource, volumeNodeAffinity := pDriver.GetPersistentVolumeSource(false, fsType, r.driverTestResource)
pvSource, volumeNodeAffinity := pDriver.GetPersistentVolumeSource(false, fsType, r.volume)
if pvSource != nil {
r.volSource, r.pv, r.pvc = createVolumeSourceWithPVCPV(f, dInfo.Name, pvSource, volumeNodeAffinity, false)
}
@ -241,7 +241,9 @@ func (r *genericVolumeTestResource) cleanupResource(driver TestDriver, pattern t
}
// Cleanup volume for pre-provisioned volume tests
DeleteVolume(driver, volType, r.driverTestResource)
if r.volume != nil {
r.volume.DeleteVolume()
}
}
func createVolumeSourceWithPVCPV(

View File

@ -37,7 +37,7 @@ func GetDriverNameWithFeatureTags(driver TestDriver) string {
}
// CreateVolume creates volume for test unless dynamicPV test
func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} {
func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) TestVolume {
switch volType {
case testpatterns.InlineVolume:
fallthrough
@ -53,22 +53,6 @@ func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface
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(

View File

@ -150,7 +150,7 @@ func (s *subPathTestResource) setupResource(driver TestDriver, pattern testpatte
switch volType {
case testpatterns.InlineVolume:
if iDriver, ok := driver.(InlineVolumeTestDriver); ok {
s.roVolSource = iDriver.GetVolumeSource(true, fsType, s.genericVolumeTestResource.driverTestResource)
s.roVolSource = iDriver.GetVolumeSource(true, fsType, s.genericVolumeTestResource.volume)
}
case testpatterns.PreprovisionedPV:
s.roVolSource = &v1.VolumeSource{

View File

@ -38,22 +38,28 @@ type TestDriver interface {
SkipUnsupportedTest(testpatterns.TestPattern)
}
// TestVolume is the result of PreprovisionedVolumeTestDriver.CreateVolume.
// The only common functionality is to delete it. Individual driver interfaces
// have additional methods that work with volumes created by them.
type TestVolume interface {
DeleteVolume()
}
// PreprovisionedVolumeTestDriver represents an interface for a TestDriver that has pre-provisioned volume
type PreprovisionedVolumeTestDriver interface {
TestDriver
// CreateVolume creates a pre-provisioned volume.
CreateVolume(testpatterns.TestVolType) interface{}
// DeleteVolume deletes a volume that is created in CreateVolume
DeleteVolume(testpatterns.TestVolType, interface{})
// CreateVolume creates a pre-provisioned volume of the desired volume type.
CreateVolume(volumeType testpatterns.TestVolType) TestVolume
}
// InlineVolumeTestDriver represents an interface for a TestDriver that supports InlineVolume
type InlineVolumeTestDriver interface {
PreprovisionedVolumeTestDriver
// GetVolumeSource returns a volumeSource for inline volume.
// It will set readOnly and fsType to the volumeSource, if TestDriver supports both of them.
// It will return nil, if the TestDriver doesn't support either of the parameters.
GetVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.VolumeSource
GetVolumeSource(readOnly bool, fsType string, testVolume TestVolume) *v1.VolumeSource
}
// PreprovisionedPVTestDriver represents an interface for a TestDriver that supports PreprovisionedPV
@ -63,7 +69,7 @@ type PreprovisionedPVTestDriver interface {
// It will set readOnly and fsType to the PersistentVolumeSource, if TestDriver supports both of them.
// It will return nil, if the TestDriver doesn't support either of the parameters.
// Volume node affinity is optional, it will be nil for volumes which does not have volume node affinity.
GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity)
GetPersistentVolumeSource(readOnly bool, fsType string, testVolume TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity)
}
// DynamicPVTestDriver represents an interface for a TestDriver that supports DynamicPV

View File

@ -146,7 +146,7 @@ type volumeModeTestResource struct {
pvc *v1.PersistentVolumeClaim
pv *v1.PersistentVolume
driverTestResource interface{}
volume TestVolume
}
var _ TestResource = &volumeModeTestResource{}
@ -168,7 +168,7 @@ func (s *volumeModeTestResource) setupResource(driver TestDriver, pattern testpa
)
// Create volume for pre-provisioned volume tests
s.driverTestResource = CreateVolume(driver, volType)
s.volume = CreateVolume(driver, volType)
switch volType {
case testpatterns.PreprovisionedPV:
@ -178,7 +178,7 @@ func (s *volumeModeTestResource) setupResource(driver TestDriver, pattern testpa
scName = fmt.Sprintf("%s-%s-sc-for-file", ns.Name, dInfo.Name)
}
if pDriver, ok := driver.(PreprovisionedPVTestDriver); ok {
pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, s.driverTestResource)
pvSource, volumeNodeAffinity = pDriver.GetPersistentVolumeSource(false, fsType, s.volume)
if pvSource == nil {
framework.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name)
}
@ -211,7 +211,6 @@ func (s *volumeModeTestResource) cleanupResource(driver TestDriver, pattern test
f := dInfo.Config.Framework
cs := f.ClientSet
ns := f.Namespace
volType := pattern.VolType
By("Deleting pv and pvc")
errs := framework.PVPVCCleanup(cs, ns.Name, s.pv, s.pvc)
@ -224,7 +223,9 @@ func (s *volumeModeTestResource) cleanupResource(driver TestDriver, pattern test
}
// Cleanup volume for pre-provisioned volume tests
DeleteVolume(driver, volType, s.driverTestResource)
if s.volume != nil {
s.volume.DeleteVolume()
}
}
type volumeModeTestInput struct {