mirror of https://github.com/k3s-io/k3s
Merge pull request #70862 from pohly/e2e-storage-tests
e2e storage tests: usable out-of-treepull/564/head
commit
e3bf5dbc5b
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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())
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue