mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-10 13:42:02 +00:00
Merge pull request #70862 from pohly/e2e-storage-tests
e2e storage tests: usable out-of-tree
This commit is contained in:
@@ -43,11 +43,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// List of testDrivers to be executed in below loop
|
// 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.InitHostPathCSIDriver,
|
||||||
drivers.InitGcePDCSIDriver,
|
drivers.InitGcePDCSIDriver,
|
||||||
drivers.InitGcePDExternalCSIDriver,
|
drivers.InitGcePDExternalCSIDriver,
|
||||||
drivers.InitHostV0PathCSIDriver,
|
drivers.InitHostPathV0CSIDriver,
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of testSuites to be executed in below loop
|
// List of testSuites to be executed in below loop
|
||||||
@@ -81,7 +81,11 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
|
|||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
ns *v1.Namespace
|
ns *v1.Namespace
|
||||||
config framework.VolumeTestConfig
|
// Common configuration options for each driver.
|
||||||
|
config = testsuites.TestConfig{
|
||||||
|
Framework: f,
|
||||||
|
Prefix: "csi",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
@@ -89,10 +93,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
|
|||||||
cancel = c
|
cancel = c
|
||||||
cs = f.ClientSet
|
cs = f.ClientSet
|
||||||
ns = f.Namespace
|
ns = f.Namespace
|
||||||
config = framework.VolumeTestConfig{
|
|
||||||
Namespace: ns.Name,
|
|
||||||
Prefix: "csi",
|
|
||||||
}
|
|
||||||
// Debugging of the following tests heavily depends on the log output
|
// Debugging of the following tests heavily depends on the log output
|
||||||
// of the different containers. Therefore include all of that in log
|
// of the different containers. Therefore include all of that in log
|
||||||
// files (when using --report-dir, as in the CI) or the output stream
|
// 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 {
|
for _, initDriver := range csiTestDrivers {
|
||||||
curDriver := initDriver()
|
curDriver := initDriver(config)
|
||||||
Context(drivers.GetDriverNameWithFeatureTags(curDriver), func() {
|
Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() {
|
||||||
driver := curDriver
|
driver := curDriver
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
// setupDriver
|
// setupDriver
|
||||||
drivers.SetCommonDriverParameters(driver, f, config)
|
|
||||||
driver.CreateDriver()
|
driver.CreateDriver()
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -140,7 +140,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
|
|||||||
driver.CleanupDriver()
|
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 (
|
var (
|
||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
csics csiclient.Interface
|
csics csiclient.Interface
|
||||||
driver drivers.TestDriver
|
driver testsuites.TestDriver
|
||||||
)
|
)
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
cs = f.ClientSet
|
cs = f.ClientSet
|
||||||
csics = f.CSIClientSet
|
csics = f.CSIClientSet
|
||||||
driver = drivers.InitHostPathCSIDriver()
|
config := testsuites.TestConfig{
|
||||||
drivers.SetCommonDriverParameters(driver, f, config)
|
Framework: f,
|
||||||
|
Prefix: "csi-attach",
|
||||||
|
}
|
||||||
|
driver = drivers.InitHostPathCSIDriver(config)
|
||||||
driver.CreateDriver()
|
driver.CreateDriver()
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -193,7 +196,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
|
|||||||
test := t
|
test := t
|
||||||
It(test.name, func() {
|
It(test.name, func() {
|
||||||
if test.driverExists {
|
if test.driverExists {
|
||||||
csiDriver := createCSIDriver(csics, drivers.GetUniqueDriverName(driver), test.driverAttachable)
|
csiDriver := createCSIDriver(csics, testsuites.GetUniqueDriverName(driver), test.driverAttachable)
|
||||||
if csiDriver != nil {
|
if csiDriver != nil {
|
||||||
defer csics.CsiV1alpha1().CSIDrivers().Delete(csiDriver.Name, nil)
|
defer csics.CsiV1alpha1().CSIDrivers().Delete(csiDriver.Name, nil)
|
||||||
}
|
}
|
||||||
@@ -201,7 +204,7 @@ var _ = utils.SIGDescribe("CSI Volumes", func() {
|
|||||||
|
|
||||||
By("Creating pod")
|
By("Creating pod")
|
||||||
var sc *storagev1.StorageClass
|
var sc *storagev1.StorageClass
|
||||||
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
|
if dDriver, ok := driver.(testsuites.DynamicPVTestDriver); ok {
|
||||||
sc = dDriver.GetDynamicProvisionStorageClass("")
|
sc = dDriver.GetDynamicProvisionStorageClass("")
|
||||||
}
|
}
|
||||||
nodeName := driver.GetDriverInfo().Config.ClientNodeName
|
nodeName := driver.GetDriverInfo().Config.ClientNodeName
|
||||||
|
@@ -3,7 +3,6 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
|||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = [
|
srcs = [
|
||||||
"base.go",
|
|
||||||
"csi.go",
|
"csi.go",
|
||||||
"csi_objects.go",
|
"csi_objects.go",
|
||||||
"in_tree.go",
|
"in_tree.go",
|
||||||
@@ -24,6 +23,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//test/e2e/framework:go_default_library",
|
"//test/e2e/framework:go_default_library",
|
||||||
"//test/e2e/storage/testpatterns: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/utils:go_default_library",
|
||||||
"//test/e2e/storage/vsphere:go_default_library",
|
"//test/e2e/storage/vsphere:go_default_library",
|
||||||
"//test/utils/image:go_default_library",
|
"//test/utils/image:go_default_library",
|
||||||
|
@@ -44,74 +44,42 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
||||||
|
"k8s.io/kubernetes/test/e2e/storage/testsuites"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/utils"
|
"k8s.io/kubernetes/test/e2e/storage/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// hostpathCSI
|
// hostpathCSI
|
||||||
type hostpathCSIDriver struct {
|
type hostpathCSIDriver struct {
|
||||||
cleanup func()
|
cleanup func()
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
|
manifests []string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &hostpathCSIDriver{}
|
func initHostPathCSIDriver(name string, config testsuites.TestConfig, manifests ...string) testsuites.TestDriver {
|
||||||
var _ DynamicPVTestDriver = &hostpathCSIDriver{}
|
|
||||||
|
|
||||||
// InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface
|
|
||||||
func InitHostPathCSIDriver() TestDriver {
|
|
||||||
return &hostpathCSIDriver{
|
return &hostpathCSIDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "csi-hostpath",
|
Name: name,
|
||||||
FeatureTag: "",
|
FeatureTag: "",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
|
manifests: manifests,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hostpathCSIDriver) GetDriverInfo() *DriverInfo {
|
var _ testsuites.TestDriver = &hostpathCSIDriver{}
|
||||||
return &h.driverInfo
|
var _ testsuites.DynamicPVTestDriver = &hostpathCSIDriver{}
|
||||||
}
|
|
||||||
|
|
||||||
func (h *hostpathCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
|
// InitHostPathCSIDriver returns hostpathCSIDriver that implements TestDriver interface
|
||||||
}
|
func InitHostPathCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
|
return initHostPathCSIDriver("csi-hostpath", config,
|
||||||
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)
|
|
||||||
},
|
|
||||||
"test/e2e/testing-manifests/storage-csi/driver-registrar/rbac.yaml",
|
"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-attacher/rbac.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/external-provisioner/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/csi-hostpathplugin.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/hostpath/hostpath/e2e-test-rbac.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() {
|
func (h *hostpathCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
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 {
|
|
||||||
return &h.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 {
|
func (h *hostpathCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
|
||||||
provisioner := GetUniqueDriverName(h)
|
provisioner := testsuites.GetUniqueDriverName(h)
|
||||||
parameters := map[string]string{}
|
parameters := map[string]string{}
|
||||||
ns := h.driverInfo.Framework.Namespace.Name
|
ns := h.driverInfo.Config.Framework.Namespace.Name
|
||||||
suffix := fmt.Sprintf("%s-sc", provisioner)
|
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() {
|
func (h *hostpathCSIDriver) GetClaimSize() string {
|
||||||
By("deploying csi hostpath v0 driver")
|
return "5Gi"
|
||||||
f := h.driverInfo.Framework
|
}
|
||||||
|
|
||||||
|
func (h *hostpathCSIDriver) CreateDriver() {
|
||||||
|
By(fmt.Sprintf("deploying %s driver", h.driverInfo.Name))
|
||||||
|
f := h.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
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)
|
nodes := framework.GetReadySchedulableNodesOrDie(cs)
|
||||||
node := nodes.Items[rand.Intn(len(nodes.Items))]
|
nodeName := nodes.Items[rand.Intn(len(nodes.Items))].Name
|
||||||
h.driverInfo.Config.ClientNodeName = node.Name
|
h.driverInfo.Config.ClientNodeName = nodeName
|
||||||
h.driverInfo.Config.ServerNodeName = node.Name
|
|
||||||
|
|
||||||
// TODO (?): the storage.csi.image.version and storage.csi.image.registry
|
// TODO (?): the storage.csi.image.version and storage.csi.image.registry
|
||||||
// settings are ignored for this test. We could patch the image definitions.
|
// settings are ignored for this test. We could patch the image definitions.
|
||||||
o := utils.PatchCSIOptions{
|
o := utils.PatchCSIOptions{
|
||||||
OldDriverName: h.driverInfo.Name,
|
OldDriverName: h.driverInfo.Name,
|
||||||
NewDriverName: GetUniqueDriverName(h),
|
NewDriverName: testsuites.GetUniqueDriverName(h),
|
||||||
DriverContainerName: "hostpath",
|
DriverContainerName: "hostpath",
|
||||||
ProvisionerContainerName: "csi-provisioner-v0",
|
ProvisionerContainerName: "csi-provisioner",
|
||||||
NodeName: h.driverInfo.Config.ServerNodeName,
|
NodeName: nodeName,
|
||||||
}
|
}
|
||||||
cleanup, err := h.driverInfo.Framework.CreateFromManifests(func(item interface{}) error {
|
cleanup, err := h.driverInfo.Config.Framework.CreateFromManifests(func(item interface{}) error {
|
||||||
return utils.PatchCSIDeployment(h.driverInfo.Framework, o, item)
|
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/driver-registrar/rbac.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
|
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/external-provisioner/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/csi-hostpathplugin.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/hostpath/hostpath-v0/e2e-test-rbac.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
|
// gce-pd
|
||||||
type gcePDCSIDriver struct {
|
type gcePDCSIDriver struct {
|
||||||
cleanup func()
|
cleanup func()
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &gcePDCSIDriver{}
|
var _ testsuites.TestDriver = &gcePDCSIDriver{}
|
||||||
var _ DynamicPVTestDriver = &gcePDCSIDriver{}
|
var _ testsuites.DynamicPVTestDriver = &gcePDCSIDriver{}
|
||||||
|
|
||||||
// InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface
|
// InitGcePDCSIDriver returns gcePDCSIDriver that implements TestDriver interface
|
||||||
func InitGcePDCSIDriver() TestDriver {
|
func InitGcePDCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &gcePDCSIDriver{
|
return &gcePDCSIDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "pd.csi.storage.gke.io",
|
Name: "pd.csi.storage.gke.io",
|
||||||
FeatureTag: "[Serial]",
|
FeatureTag: "[Serial]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
@@ -242,33 +182,39 @@ func InitGcePDCSIDriver() TestDriver {
|
|||||||
"ext4",
|
"ext4",
|
||||||
"xfs",
|
"xfs",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gcePDCSIDriver) GetDriverInfo() *DriverInfo {
|
func (g *gcePDCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &g.driverInfo
|
return &g.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
|
func (g *gcePDCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
|
||||||
f := g.driverInfo.Framework
|
f := g.driverInfo.Config.Framework
|
||||||
framework.SkipUnlessProviderIs("gce", "gke")
|
framework.SkipUnlessProviderIs("gce", "gke")
|
||||||
framework.SkipIfMultizone(f.ClientSet)
|
framework.SkipIfMultizone(f.ClientSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gcePDCSIDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
|
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
|
provisioner := g.driverInfo.Name
|
||||||
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
|
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
|
||||||
|
|
||||||
parameters := map[string]string{"type": "pd-standard"}
|
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() {
|
func (g *gcePDCSIDriver) CreateDriver() {
|
||||||
@@ -281,13 +227,13 @@ func (g *gcePDCSIDriver) CreateDriver() {
|
|||||||
// These are the options which would have to be used:
|
// These are the options which would have to be used:
|
||||||
// o := utils.PatchCSIOptions{
|
// o := utils.PatchCSIOptions{
|
||||||
// OldDriverName: g.driverInfo.Name,
|
// OldDriverName: g.driverInfo.Name,
|
||||||
// NewDriverName: GetUniqueDriverName(g),
|
// NewDriverName: testsuites.GetUniqueDriverName(g),
|
||||||
// DriverContainerName: "gce-driver",
|
// DriverContainerName: "gce-driver",
|
||||||
// ProvisionerContainerName: "csi-external-provisioner",
|
// 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/driver-registrar/rbac.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
|
"test/e2e/testing-manifests/storage-csi/external-attacher/rbac.yaml",
|
||||||
"test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml",
|
"test/e2e/testing-manifests/storage-csi/external-provisioner/rbac.yaml",
|
||||||
@@ -310,17 +256,18 @@ func (g *gcePDCSIDriver) CleanupDriver() {
|
|||||||
|
|
||||||
// gcePd-external
|
// gcePd-external
|
||||||
type gcePDExternalCSIDriver struct {
|
type gcePDExternalCSIDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &gcePDExternalCSIDriver{}
|
var _ testsuites.TestDriver = &gcePDExternalCSIDriver{}
|
||||||
var _ DynamicPVTestDriver = &gcePDExternalCSIDriver{}
|
var _ testsuites.DynamicPVTestDriver = &gcePDExternalCSIDriver{}
|
||||||
|
|
||||||
// InitGcePDExternalCSIDriver returns gcePDExternalCSIDriver that implements TestDriver interface
|
// InitGcePDExternalCSIDriver returns gcePDExternalCSIDriver that implements TestDriver interface
|
||||||
func InitGcePDExternalCSIDriver() TestDriver {
|
func InitGcePDExternalCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &gcePDExternalCSIDriver{
|
return &gcePDExternalCSIDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "pd.csi.storage.gke.io",
|
Name: "pd.csi.storage.gke.io",
|
||||||
|
|
||||||
// TODO(#70258): this is temporary until we can figure out how to make e2e tests a library
|
// TODO(#70258): this is temporary until we can figure out how to make e2e tests a library
|
||||||
FeatureTag: "[Feature: gcePD-external]",
|
FeatureTag: "[Feature: gcePD-external]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
@@ -331,32 +278,38 @@ func InitGcePDExternalCSIDriver() TestDriver {
|
|||||||
"ext4",
|
"ext4",
|
||||||
"xfs",
|
"xfs",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gcePDExternalCSIDriver) GetDriverInfo() *DriverInfo {
|
func (g *gcePDExternalCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &g.driverInfo
|
return &g.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gcePDExternalCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
|
func (g *gcePDExternalCSIDriver) SkipUnsupportedTest(pattern testpatterns.TestPattern) {
|
||||||
framework.SkipUnlessProviderIs("gce", "gke")
|
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 {
|
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
|
provisioner := g.driverInfo.Name
|
||||||
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
|
suffix := fmt.Sprintf("%s-sc", g.driverInfo.Name)
|
||||||
|
|
||||||
parameters := map[string]string{"type": "pd-standard"}
|
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() {
|
func (g *gcePDExternalCSIDriver) CreateDriver() {
|
||||||
|
@@ -80,7 +80,7 @@ func shredFile(filePath string) {
|
|||||||
|
|
||||||
// createGCESecrets downloads the GCP IAM Key for the default compute service account
|
// 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
|
// 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"
|
saEnv := "E2E_GOOGLE_APPLICATION_CREDENTIALS"
|
||||||
saFile := fmt.Sprintf("/tmp/%s/cloud-sa.json", string(uuid.NewUUID()))
|
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{
|
s := &v1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "cloud-sa",
|
Name: "cloud-sa",
|
||||||
Namespace: config.Namespace,
|
Namespace: ns,
|
||||||
},
|
},
|
||||||
Type: v1.SecretTypeOpaque,
|
Type: v1.SecretTypeOpaque,
|
||||||
Data: map[string][]byte{
|
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) {
|
if !apierrors.IsAlreadyExists(err) {
|
||||||
framework.ExpectNoError(err, "Failed to create Secret %v", s.GetName())
|
framework.ExpectNoError(err, "Failed to create Secret %v", s.GetName())
|
||||||
}
|
}
|
||||||
|
@@ -55,6 +55,7 @@ import (
|
|||||||
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
||||||
|
"k8s.io/kubernetes/test/e2e/storage/testsuites"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/utils"
|
"k8s.io/kubernetes/test/e2e/storage/utils"
|
||||||
vspheretest "k8s.io/kubernetes/test/e2e/storage/vsphere"
|
vspheretest "k8s.io/kubernetes/test/e2e/storage/vsphere"
|
||||||
imageutils "k8s.io/kubernetes/test/utils/image"
|
imageutils "k8s.io/kubernetes/test/utils/image"
|
||||||
@@ -65,7 +66,7 @@ type nfsDriver struct {
|
|||||||
externalProvisionerPod *v1.Pod
|
externalProvisionerPod *v1.Pod
|
||||||
externalPluginName string
|
externalPluginName string
|
||||||
|
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type nfsTestResource struct {
|
type nfsTestResource struct {
|
||||||
@@ -73,16 +74,16 @@ type nfsTestResource struct {
|
|||||||
serverPod *v1.Pod
|
serverPod *v1.Pod
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &nfsDriver{}
|
var _ testsuites.TestDriver = &nfsDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &nfsDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &nfsDriver{}
|
||||||
var _ InlineVolumeTestDriver = &nfsDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &nfsDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &nfsDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &nfsDriver{}
|
||||||
var _ DynamicPVTestDriver = &nfsDriver{}
|
var _ testsuites.DynamicPVTestDriver = &nfsDriver{}
|
||||||
|
|
||||||
// InitNFSDriver returns nfsDriver that implements TestDriver interface
|
// InitNFSDriver returns nfsDriver that implements TestDriver interface
|
||||||
func InitNFSDriver() TestDriver {
|
func InitNFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &nfsDriver{
|
return &nfsDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "nfs",
|
Name: "nfs",
|
||||||
MaxFileSize: testpatterns.FileSizeLarge,
|
MaxFileSize: testpatterns.FileSizeLarge,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
@@ -90,15 +91,17 @@ func InitNFSDriver() TestDriver {
|
|||||||
),
|
),
|
||||||
SupportedMountOption: sets.NewString("proto=tcp", "relatime"),
|
SupportedMountOption: sets.NewString("proto=tcp", "relatime"),
|
||||||
RequiredMountOption: sets.NewString("vers=4.1"),
|
RequiredMountOption: sets.NewString("vers=4.1"),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *nfsDriver) GetDriverInfo() *DriverInfo {
|
func (n *nfsDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &n.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 {
|
func (n *nfsDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass {
|
||||||
provisioner := n.externalPluginName
|
provisioner := n.externalPluginName
|
||||||
parameters := map[string]string{"mountOptions": "vers=4.1"}
|
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)
|
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() {
|
func (n *nfsDriver) CreateDriver() {
|
||||||
f := n.driverInfo.Framework
|
f := n.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
n.externalPluginName = fmt.Sprintf("example.com/nfs-%s", ns.Name)
|
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
|
// TODO(mkimuram): cluster-admin gives too much right but system:persistent-volume-provisioner
|
||||||
// is not enough. We should create new clusterrole for testing.
|
// is not enough. We should create new clusterrole for testing.
|
||||||
framework.BindClusterRole(cs.RbacV1beta1(), "cluster-admin", ns.Name,
|
framework.BindClusterRole(cs.RbacV1beta1(), "cluster-admin", ns.Name,
|
||||||
@@ -159,7 +169,7 @@ func (n *nfsDriver) CreateDriver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (n *nfsDriver) CleanupDriver() {
|
func (n *nfsDriver) CleanupDriver() {
|
||||||
f := n.driverInfo.Framework
|
f := n.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
@@ -169,7 +179,7 @@ func (n *nfsDriver) CleanupDriver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := n.driverInfo.Framework
|
f := n.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
@@ -181,7 +191,7 @@ func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
config, serverPod, serverIP := framework.NewNFSServer(cs, ns.Name, []string{})
|
config, serverPod, serverIP := framework.NewNFSServer(cs, ns.Name, []string{})
|
||||||
n.driverInfo.Config = config
|
n.driverInfo.Config.ServerConfig = &config
|
||||||
return &nfsTestResource{
|
return &nfsTestResource{
|
||||||
serverIP: serverIP,
|
serverIP: serverIP,
|
||||||
serverPod: serverPod,
|
serverPod: serverPod,
|
||||||
@@ -195,7 +205,7 @@ func (n *nfsDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (n *nfsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
func (n *nfsDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
f := n.driverInfo.Framework
|
f := n.driverInfo.Config.Framework
|
||||||
|
|
||||||
ntr, ok := testResource.(*nfsTestResource)
|
ntr, ok := testResource.(*nfsTestResource)
|
||||||
Expect(ok).To(BeTrue(), "Failed to cast test resource to NFS Test Resource")
|
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
|
// Gluster
|
||||||
type glusterFSDriver struct {
|
type glusterFSDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type glusterTestResource struct {
|
type glusterTestResource struct {
|
||||||
@@ -222,29 +232,31 @@ type glusterTestResource struct {
|
|||||||
serverPod *v1.Pod
|
serverPod *v1.Pod
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &glusterFSDriver{}
|
var _ testsuites.TestDriver = &glusterFSDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &glusterFSDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &glusterFSDriver{}
|
||||||
var _ InlineVolumeTestDriver = &glusterFSDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &glusterFSDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &glusterFSDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &glusterFSDriver{}
|
||||||
|
|
||||||
// InitGlusterFSDriver returns glusterFSDriver that implements TestDriver interface
|
// InitGlusterFSDriver returns glusterFSDriver that implements TestDriver interface
|
||||||
func InitGlusterFSDriver() TestDriver {
|
func InitGlusterFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &glusterFSDriver{
|
return &glusterFSDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "gluster",
|
Name: "gluster",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *glusterFSDriver) GetDriverInfo() *DriverInfo {
|
func (g *glusterFSDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &g.driverInfo
|
return &g.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,18 +298,20 @@ func (g *glusterFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *glusterFSDriver) CreateDriver() {
|
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) CleanupDriver() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := g.driverInfo.Framework
|
f := g.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
config, serverPod, _ := framework.NewGlusterfsServer(cs, ns.Name)
|
config, serverPod, _ := framework.NewGlusterfsServer(cs, ns.Name)
|
||||||
g.driverInfo.Config = config
|
g.driverInfo.Config.ServerConfig = &config
|
||||||
return &glusterTestResource{
|
return &glusterTestResource{
|
||||||
prefix: config.Prefix,
|
prefix: config.Prefix,
|
||||||
serverPod: serverPod,
|
serverPod: serverPod,
|
||||||
@@ -305,7 +319,7 @@ func (g *glusterFSDriver) CreateVolume(volType testpatterns.TestVolType) interfa
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
f := g.driverInfo.Framework
|
f := g.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
@@ -332,22 +346,22 @@ func (g *glusterFSDriver) DeleteVolume(volType testpatterns.TestVolType, testRes
|
|||||||
// iSCSI
|
// iSCSI
|
||||||
// The iscsiadm utility and iscsi target kernel modules must be installed on all nodes.
|
// The iscsiadm utility and iscsi target kernel modules must be installed on all nodes.
|
||||||
type iSCSIDriver struct {
|
type iSCSIDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
type iSCSITestResource struct {
|
type iSCSITestResource struct {
|
||||||
serverPod *v1.Pod
|
serverPod *v1.Pod
|
||||||
serverIP string
|
serverIP string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &iSCSIDriver{}
|
var _ testsuites.TestDriver = &iSCSIDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &iSCSIDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &iSCSIDriver{}
|
||||||
var _ InlineVolumeTestDriver = &iSCSIDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &iSCSIDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &iSCSIDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &iSCSIDriver{}
|
||||||
|
|
||||||
// InitISCSIDriver returns iSCSIDriver that implements TestDriver interface
|
// InitISCSIDriver returns iSCSIDriver that implements TestDriver interface
|
||||||
func InitISCSIDriver() TestDriver {
|
func InitISCSIDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &iSCSIDriver{
|
return &iSCSIDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "iscsi",
|
Name: "iscsi",
|
||||||
FeatureTag: "[Feature:Volumes]",
|
FeatureTag: "[Feature:Volumes]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
@@ -358,17 +372,19 @@ func InitISCSIDriver() TestDriver {
|
|||||||
//"ext3",
|
//"ext3",
|
||||||
"ext4",
|
"ext4",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapBlock: true,
|
testsuites.CapBlock: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *iSCSIDriver) GetDriverInfo() *DriverInfo {
|
func (i *iSCSIDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &i.driverInfo
|
return &i.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,18 +429,20 @@ func (i *iSCSIDriver) GetPersistentVolumeSource(readOnly bool, fsType string, te
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (i *iSCSIDriver) CreateDriver() {
|
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) CleanupDriver() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := i.driverInfo.Framework
|
f := i.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
config, serverPod, serverIP := framework.NewISCSIServer(cs, ns.Name)
|
config, serverPod, serverIP := framework.NewISCSIServer(cs, ns.Name)
|
||||||
i.driverInfo.Config = config
|
i.driverInfo.Config.ServerConfig = &config
|
||||||
return &iSCSITestResource{
|
return &iSCSITestResource{
|
||||||
serverPod: serverPod,
|
serverPod: serverPod,
|
||||||
serverIP: serverIP,
|
serverIP: serverIP,
|
||||||
@@ -432,7 +450,7 @@ func (i *iSCSIDriver) CreateVolume(volType testpatterns.TestVolType) interface{}
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (i *iSCSIDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
func (i *iSCSIDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
f := i.driverInfo.Framework
|
f := i.driverInfo.Config.Framework
|
||||||
|
|
||||||
itr, ok := testResource.(*iSCSITestResource)
|
itr, ok := testResource.(*iSCSITestResource)
|
||||||
Expect(ok).To(BeTrue(), "Failed to cast test resource to iSCSI Test Resource")
|
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
|
// Ceph RBD
|
||||||
type rbdDriver struct {
|
type rbdDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type rbdTestResource struct {
|
type rbdTestResource struct {
|
||||||
@@ -451,15 +469,15 @@ type rbdTestResource struct {
|
|||||||
secret *v1.Secret
|
secret *v1.Secret
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &rbdDriver{}
|
var _ testsuites.TestDriver = &rbdDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &rbdDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &rbdDriver{}
|
||||||
var _ InlineVolumeTestDriver = &rbdDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &rbdDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &rbdDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &rbdDriver{}
|
||||||
|
|
||||||
// InitRbdDriver returns rbdDriver that implements TestDriver interface
|
// InitRbdDriver returns rbdDriver that implements TestDriver interface
|
||||||
func InitRbdDriver() TestDriver {
|
func InitRbdDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &rbdDriver{
|
return &rbdDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "rbd",
|
Name: "rbd",
|
||||||
FeatureTag: "[Feature:Volumes]",
|
FeatureTag: "[Feature:Volumes]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
@@ -470,17 +488,19 @@ func InitRbdDriver() TestDriver {
|
|||||||
//"ext3",
|
//"ext3",
|
||||||
"ext4",
|
"ext4",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapBlock: true,
|
testsuites.CapBlock: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *rbdDriver) GetDriverInfo() *DriverInfo {
|
func (r *rbdDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &r.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 {
|
func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.PersistentVolumeSource {
|
||||||
f := r.driverInfo.Framework
|
f := r.driverInfo.Config.Framework
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
rtr, ok := testResource.(*rbdTestResource)
|
rtr, ok := testResource.(*rbdTestResource)
|
||||||
@@ -536,18 +556,20 @@ func (r *rbdDriver) GetPersistentVolumeSource(readOnly bool, fsType string, test
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *rbdDriver) CreateDriver() {
|
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) CleanupDriver() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := r.driverInfo.Framework
|
f := r.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
|
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
|
||||||
r.driverInfo.Config = config
|
r.driverInfo.Config.ServerConfig = &config
|
||||||
return &rbdTestResource{
|
return &rbdTestResource{
|
||||||
serverPod: serverPod,
|
serverPod: serverPod,
|
||||||
serverIP: serverIP,
|
serverIP: serverIP,
|
||||||
@@ -556,7 +578,7 @@ func (r *rbdDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *rbdDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
func (r *rbdDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
f := r.driverInfo.Framework
|
f := r.driverInfo.Config.Framework
|
||||||
|
|
||||||
rtr, ok := testResource.(*rbdTestResource)
|
rtr, ok := testResource.(*rbdTestResource)
|
||||||
Expect(ok).To(BeTrue(), "Failed to cast test resource to RBD Test Resource")
|
Expect(ok).To(BeTrue(), "Failed to cast test resource to RBD Test Resource")
|
||||||
@@ -570,7 +592,7 @@ type cephFSDriver struct {
|
|||||||
serverPod *v1.Pod
|
serverPod *v1.Pod
|
||||||
secret *v1.Secret
|
secret *v1.Secret
|
||||||
|
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type cephTestResource struct {
|
type cephTestResource struct {
|
||||||
@@ -579,30 +601,32 @@ type cephTestResource struct {
|
|||||||
secret *v1.Secret
|
secret *v1.Secret
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &cephFSDriver{}
|
var _ testsuites.TestDriver = &cephFSDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &cephFSDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &cephFSDriver{}
|
||||||
var _ InlineVolumeTestDriver = &cephFSDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &cephFSDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &cephFSDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &cephFSDriver{}
|
||||||
|
|
||||||
// InitCephFSDriver returns cephFSDriver that implements TestDriver interface
|
// InitCephFSDriver returns cephFSDriver that implements TestDriver interface
|
||||||
func InitCephFSDriver() TestDriver {
|
func InitCephFSDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &cephFSDriver{
|
return &cephFSDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "ceph",
|
Name: "ceph",
|
||||||
FeatureTag: "[Feature:Volumes]",
|
FeatureTag: "[Feature:Volumes]",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cephFSDriver) GetDriverInfo() *DriverInfo {
|
func (c *cephFSDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &c.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 {
|
func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, testResource interface{}) *v1.PersistentVolumeSource {
|
||||||
f := c.driverInfo.Framework
|
f := c.driverInfo.Config.Framework
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
ctr, ok := testResource.(*cephTestResource)
|
ctr, ok := testResource.(*cephTestResource)
|
||||||
@@ -646,18 +670,20 @@ func (c *cephFSDriver) GetPersistentVolumeSource(readOnly bool, fsType string, t
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *cephFSDriver) CreateDriver() {
|
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) CleanupDriver() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := c.driverInfo.Framework
|
f := c.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
|
config, serverPod, secret, serverIP := framework.NewRBDServer(cs, ns.Name)
|
||||||
c.driverInfo.Config = config
|
c.driverInfo.Config.ServerConfig = &config
|
||||||
return &cephTestResource{
|
return &cephTestResource{
|
||||||
serverPod: serverPod,
|
serverPod: serverPod,
|
||||||
serverIP: serverIP,
|
serverIP: serverIP,
|
||||||
@@ -666,7 +692,7 @@ func (c *cephFSDriver) CreateVolume(volType testpatterns.TestVolType) interface{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *cephFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
func (c *cephFSDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
f := c.driverInfo.Framework
|
f := c.driverInfo.Config.Framework
|
||||||
|
|
||||||
ctr, ok := testResource.(*cephTestResource)
|
ctr, ok := testResource.(*cephTestResource)
|
||||||
Expect(ok).To(BeTrue(), "Failed to cast test resource to Ceph Test Resource")
|
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 {
|
type hostPathDriver struct {
|
||||||
node v1.Node
|
node v1.Node
|
||||||
|
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &hostPathDriver{}
|
var _ testsuites.TestDriver = &hostPathDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &hostPathDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathDriver{}
|
||||||
var _ InlineVolumeTestDriver = &hostPathDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &hostPathDriver{}
|
||||||
|
|
||||||
// InitHostPathDriver returns hostPathDriver that implements TestDriver interface
|
// InitHostPathDriver returns hostPathDriver that implements TestDriver interface
|
||||||
func InitHostPathDriver() TestDriver {
|
func InitHostPathDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &hostPathDriver{
|
return &hostPathDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "hostPath",
|
Name: "hostPath",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hostPathDriver) GetDriverInfo() *DriverInfo {
|
func (h *hostPathDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &h.driverInfo
|
return &h.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -727,7 +755,7 @@ func (h *hostPathDriver) CleanupDriver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *hostPathDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (h *hostPathDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := h.driverInfo.Framework
|
f := h.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
|
|
||||||
// pods should be scheduled on the node
|
// pods should be scheduled on the node
|
||||||
@@ -744,7 +772,7 @@ func (h *hostPathDriver) DeleteVolume(volType testpatterns.TestVolType, testReso
|
|||||||
type hostPathSymlinkDriver struct {
|
type hostPathSymlinkDriver struct {
|
||||||
node v1.Node
|
node v1.Node
|
||||||
|
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type hostPathSymlinkTestResource struct {
|
type hostPathSymlinkTestResource struct {
|
||||||
@@ -753,27 +781,29 @@ type hostPathSymlinkTestResource struct {
|
|||||||
prepPod *v1.Pod
|
prepPod *v1.Pod
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &hostPathSymlinkDriver{}
|
var _ testsuites.TestDriver = &hostPathSymlinkDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &hostPathSymlinkDriver{}
|
||||||
var _ InlineVolumeTestDriver = &hostPathSymlinkDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &hostPathSymlinkDriver{}
|
||||||
|
|
||||||
// InitHostPathSymlinkDriver returns hostPathSymlinkDriver that implements TestDriver interface
|
// InitHostPathSymlinkDriver returns hostPathSymlinkDriver that implements TestDriver interface
|
||||||
func InitHostPathSymlinkDriver() TestDriver {
|
func InitHostPathSymlinkDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &hostPathSymlinkDriver{
|
return &hostPathSymlinkDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "hostPathSymlink",
|
Name: "hostPathSymlink",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hostPathSymlinkDriver) GetDriverInfo() *DriverInfo {
|
func (h *hostPathSymlinkDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &h.driverInfo
|
return &h.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -802,7 +832,7 @@ func (h *hostPathSymlinkDriver) CleanupDriver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (h *hostPathSymlinkDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := h.driverInfo.Framework
|
f := h.driverInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
|
|
||||||
sourcePath := fmt.Sprintf("/tmp/%v", f.Namespace.Name)
|
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{}) {
|
func (h *hostPathSymlinkDriver) DeleteVolume(volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
f := h.driverInfo.Framework
|
f := h.driverInfo.Config.Framework
|
||||||
|
|
||||||
htr, ok := testResource.(*hostPathSymlinkTestResource)
|
htr, ok := testResource.(*hostPathSymlinkTestResource)
|
||||||
Expect(ok).To(BeTrue(), "Failed to cast test resource to Hostpath Symlink Test Resource")
|
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
|
// emptydir
|
||||||
type emptydirDriver struct {
|
type emptydirDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &emptydirDriver{}
|
var _ testsuites.TestDriver = &emptydirDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &emptydirDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &emptydirDriver{}
|
||||||
var _ InlineVolumeTestDriver = &emptydirDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &emptydirDriver{}
|
||||||
|
|
||||||
// InitEmptydirDriver returns emptydirDriver that implements TestDriver interface
|
// InitEmptydirDriver returns emptydirDriver that implements TestDriver interface
|
||||||
func InitEmptydirDriver() TestDriver {
|
func InitEmptydirDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &emptydirDriver{
|
return &emptydirDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "emptydir",
|
Name: "emptydir",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *emptydirDriver) GetDriverInfo() *DriverInfo {
|
func (e *emptydirDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &e.driverInfo
|
return &e.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -949,7 +981,7 @@ func (e *emptydirDriver) CleanupDriver() {
|
|||||||
// and that the usual OpenStack authentication env. variables are set
|
// and that the usual OpenStack authentication env. variables are set
|
||||||
// (OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME at least).
|
// (OS_USERNAME, OS_PASSWORD, OS_TENANT_NAME at least).
|
||||||
type cinderDriver struct {
|
type cinderDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type cinderTestResource struct {
|
type cinderTestResource struct {
|
||||||
@@ -957,32 +989,34 @@ type cinderTestResource struct {
|
|||||||
volumeID string
|
volumeID string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &cinderDriver{}
|
var _ testsuites.TestDriver = &cinderDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &cinderDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &cinderDriver{}
|
||||||
var _ InlineVolumeTestDriver = &cinderDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &cinderDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &cinderDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &cinderDriver{}
|
||||||
var _ DynamicPVTestDriver = &cinderDriver{}
|
var _ testsuites.DynamicPVTestDriver = &cinderDriver{}
|
||||||
|
|
||||||
// InitCinderDriver returns cinderDriver that implements TestDriver interface
|
// InitCinderDriver returns cinderDriver that implements TestDriver interface
|
||||||
func InitCinderDriver() TestDriver {
|
func InitCinderDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &cinderDriver{
|
return &cinderDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "cinder",
|
Name: "cinder",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
"ext3",
|
"ext3",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cinderDriver) GetDriverInfo() *DriverInfo {
|
func (c *cinderDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &c.driverInfo
|
return &c.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1028,10 +1062,14 @@ func (c *cinderDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1
|
|||||||
if fsType != "" {
|
if fsType != "" {
|
||||||
parameters["fsType"] = 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)
|
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() {
|
func (c *cinderDriver) CreateDriver() {
|
||||||
@@ -1041,7 +1079,7 @@ func (c *cinderDriver) CleanupDriver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *cinderDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (c *cinderDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := c.driverInfo.Framework
|
f := c.driverInfo.Config.Framework
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
|
|
||||||
// We assume that namespace.Name is a random string
|
// We assume that namespace.Name is a random string
|
||||||
@@ -1106,23 +1144,23 @@ func deleteCinderVolume(name string) error {
|
|||||||
|
|
||||||
// GCE
|
// GCE
|
||||||
type gcePdDriver struct {
|
type gcePdDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type gcePdTestResource struct {
|
type gcePdTestResource struct {
|
||||||
volumeName string
|
volumeName string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &gcePdDriver{}
|
var _ testsuites.TestDriver = &gcePdDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &gcePdDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &gcePdDriver{}
|
||||||
var _ InlineVolumeTestDriver = &gcePdDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &gcePdDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &gcePdDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &gcePdDriver{}
|
||||||
var _ DynamicPVTestDriver = &gcePdDriver{}
|
var _ testsuites.DynamicPVTestDriver = &gcePdDriver{}
|
||||||
|
|
||||||
// InitGceDriver returns gcePdDriver that implements TestDriver interface
|
// InitGceDriver returns gcePdDriver that implements TestDriver interface
|
||||||
func InitGcePdDriver() TestDriver {
|
func InitGcePdDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &gcePdDriver{
|
return &gcePdDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "gcepd",
|
Name: "gcepd",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
@@ -1133,17 +1171,19 @@ func InitGcePdDriver() TestDriver {
|
|||||||
"xfs",
|
"xfs",
|
||||||
),
|
),
|
||||||
SupportedMountOption: sets.NewString("debug", "nouid32"),
|
SupportedMountOption: sets.NewString("debug", "nouid32"),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapBlock: true,
|
testsuites.CapBlock: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *gcePdDriver) GetDriverInfo() *DriverInfo {
|
func (g *gcePdDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &g.driverInfo
|
return &g.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1190,10 +1230,14 @@ func (g *gcePdDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.
|
|||||||
if fsType != "" {
|
if fsType != "" {
|
||||||
parameters["fsType"] = 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)
|
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() {
|
func (g *gcePdDriver) CreateDriver() {
|
||||||
@@ -1206,7 +1250,7 @@ func (g *gcePdDriver) CreateVolume(volType testpatterns.TestVolType) interface{}
|
|||||||
if volType == testpatterns.InlineVolume {
|
if volType == testpatterns.InlineVolume {
|
||||||
// PD will be created in framework.TestContext.CloudConfig.Zone zone,
|
// PD will be created in framework.TestContext.CloudConfig.Zone zone,
|
||||||
// so pods should be also scheduled there.
|
// 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,
|
kubeletapis.LabelZoneFailureDomain: framework.TestContext.CloudConfig.Zone,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1226,7 +1270,7 @@ func (g *gcePdDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc
|
|||||||
|
|
||||||
// vSphere
|
// vSphere
|
||||||
type vSphereDriver struct {
|
type vSphereDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type vSphereTestResource struct {
|
type vSphereTestResource struct {
|
||||||
@@ -1234,31 +1278,33 @@ type vSphereTestResource struct {
|
|||||||
nodeInfo *vspheretest.NodeInfo
|
nodeInfo *vspheretest.NodeInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &vSphereDriver{}
|
var _ testsuites.TestDriver = &vSphereDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &vSphereDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &vSphereDriver{}
|
||||||
var _ InlineVolumeTestDriver = &vSphereDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &vSphereDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &vSphereDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &vSphereDriver{}
|
||||||
var _ DynamicPVTestDriver = &vSphereDriver{}
|
var _ testsuites.DynamicPVTestDriver = &vSphereDriver{}
|
||||||
|
|
||||||
// InitVSphereDriver returns vSphereDriver that implements TestDriver interface
|
// InitVSphereDriver returns vSphereDriver that implements TestDriver interface
|
||||||
func InitVSphereDriver() TestDriver {
|
func InitVSphereDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &vSphereDriver{
|
return &vSphereDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "vSphere",
|
Name: "vSphere",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
"ext4",
|
"ext4",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (v *vSphereDriver) GetDriverInfo() *DriverInfo {
|
func (v *vSphereDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &v.driverInfo
|
return &v.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1312,10 +1358,14 @@ func (v *vSphereDriver) GetDynamicProvisionStorageClass(fsType string) *storagev
|
|||||||
if fsType != "" {
|
if fsType != "" {
|
||||||
parameters["fsType"] = 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)
|
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() {
|
func (v *vSphereDriver) CreateDriver() {
|
||||||
@@ -1325,7 +1375,7 @@ func (v *vSphereDriver) CleanupDriver() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (v *vSphereDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
func (v *vSphereDriver) CreateVolume(volType testpatterns.TestVolType) interface{} {
|
||||||
f := v.driverInfo.Framework
|
f := v.driverInfo.Config.Framework
|
||||||
vspheretest.Bootstrap(f)
|
vspheretest.Bootstrap(f)
|
||||||
nodeInfo := vspheretest.GetReadySchedulableRandomNodeInfo()
|
nodeInfo := vspheretest.GetReadySchedulableRandomNodeInfo()
|
||||||
volumePath, err := nodeInfo.VSphere.CreateVolume(&vspheretest.VolumeOptions{}, nodeInfo.DataCenterRef)
|
volumePath, err := nodeInfo.VSphere.CreateVolume(&vspheretest.VolumeOptions{}, nodeInfo.DataCenterRef)
|
||||||
@@ -1345,40 +1395,42 @@ func (v *vSphereDriver) DeleteVolume(volType testpatterns.TestVolType, testResou
|
|||||||
|
|
||||||
// Azure
|
// Azure
|
||||||
type azureDriver struct {
|
type azureDriver struct {
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
type azureTestResource struct {
|
type azureTestResource struct {
|
||||||
volumeName string
|
volumeName string
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &azureDriver{}
|
var _ testsuites.TestDriver = &azureDriver{}
|
||||||
var _ PreprovisionedVolumeTestDriver = &azureDriver{}
|
var _ testsuites.PreprovisionedVolumeTestDriver = &azureDriver{}
|
||||||
var _ InlineVolumeTestDriver = &azureDriver{}
|
var _ testsuites.InlineVolumeTestDriver = &azureDriver{}
|
||||||
var _ PreprovisionedPVTestDriver = &azureDriver{}
|
var _ testsuites.PreprovisionedPVTestDriver = &azureDriver{}
|
||||||
var _ DynamicPVTestDriver = &azureDriver{}
|
var _ testsuites.DynamicPVTestDriver = &azureDriver{}
|
||||||
|
|
||||||
// InitAzureDriver returns azureDriver that implements TestDriver interface
|
// InitAzureDriver returns azureDriver that implements TestDriver interface
|
||||||
func InitAzureDriver() TestDriver {
|
func InitAzureDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &azureDriver{
|
return &azureDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "azure",
|
Name: "azure",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
"", // Default fsType
|
"", // Default fsType
|
||||||
"ext4",
|
"ext4",
|
||||||
),
|
),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapBlock: true,
|
testsuites.CapBlock: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *azureDriver) GetDriverInfo() *DriverInfo {
|
func (a *azureDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &a.driverInfo
|
return &a.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1430,10 +1482,14 @@ func (a *azureDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.
|
|||||||
if fsType != "" {
|
if fsType != "" {
|
||||||
parameters["fsType"] = 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)
|
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() {
|
func (a *azureDriver) CreateDriver() {
|
||||||
@@ -1462,21 +1518,21 @@ func (a *azureDriver) DeleteVolume(volType testpatterns.TestVolType, testResourc
|
|||||||
type awsDriver struct {
|
type awsDriver struct {
|
||||||
volumeName string
|
volumeName string
|
||||||
|
|
||||||
driverInfo DriverInfo
|
driverInfo testsuites.DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ TestDriver = &awsDriver{}
|
var _ testsuites.TestDriver = &awsDriver{}
|
||||||
|
|
||||||
// TODO: Fix authorization error in attach operation and uncomment below
|
// TODO: Fix authorization error in attach operation and uncomment below
|
||||||
//var _ PreprovisionedVolumeTestDriver = &awsDriver{}
|
//var _ testsuites.PreprovisionedVolumeTestDriver = &awsDriver{}
|
||||||
//var _ InlineVolumeTestDriver = &awsDriver{}
|
//var _ testsuites.InlineVolumeTestDriver = &awsDriver{}
|
||||||
//var _ PreprovisionedPVTestDriver = &awsDriver{}
|
//var _ testsuites.PreprovisionedPVTestDriver = &awsDriver{}
|
||||||
var _ DynamicPVTestDriver = &awsDriver{}
|
var _ testsuites.DynamicPVTestDriver = &awsDriver{}
|
||||||
|
|
||||||
// InitAwsDriver returns awsDriver that implements TestDriver interface
|
// InitAwsDriver returns awsDriver that implements TestDriver interface
|
||||||
func InitAwsDriver() TestDriver {
|
func InitAwsDriver(config testsuites.TestConfig) testsuites.TestDriver {
|
||||||
return &awsDriver{
|
return &awsDriver{
|
||||||
driverInfo: DriverInfo{
|
driverInfo: testsuites.DriverInfo{
|
||||||
Name: "aws",
|
Name: "aws",
|
||||||
MaxFileSize: testpatterns.FileSizeMedium,
|
MaxFileSize: testpatterns.FileSizeMedium,
|
||||||
SupportedFsType: sets.NewString(
|
SupportedFsType: sets.NewString(
|
||||||
@@ -1484,17 +1540,19 @@ func InitAwsDriver() TestDriver {
|
|||||||
"ext3",
|
"ext3",
|
||||||
),
|
),
|
||||||
SupportedMountOption: sets.NewString("debug", "nouid32"),
|
SupportedMountOption: sets.NewString("debug", "nouid32"),
|
||||||
Capabilities: map[Capability]bool{
|
Capabilities: map[testsuites.Capability]bool{
|
||||||
CapPersistence: true,
|
testsuites.CapPersistence: true,
|
||||||
CapFsGroup: true,
|
testsuites.CapFsGroup: true,
|
||||||
CapBlock: true,
|
testsuites.CapBlock: true,
|
||||||
CapExec: true,
|
testsuites.CapExec: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *awsDriver) GetDriverInfo() *DriverInfo {
|
func (a *awsDriver) GetDriverInfo() *testsuites.DriverInfo {
|
||||||
return &a.driverInfo
|
return &a.driverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1537,10 +1595,14 @@ func (a *awsDriver) GetDynamicProvisionStorageClass(fsType string) *storagev1.St
|
|||||||
if fsType != "" {
|
if fsType != "" {
|
||||||
parameters["fsType"] = 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)
|
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() {
|
func (a *awsDriver) CreateDriver() {
|
||||||
|
@@ -18,7 +18,6 @@ package storage
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
"k8s.io/api/core/v1"
|
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/drivers"
|
"k8s.io/kubernetes/test/e2e/storage/drivers"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
||||||
@@ -27,7 +26,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// List of testDrivers to be executed in below loop
|
// 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.InitNFSDriver,
|
||||||
drivers.InitGlusterFSDriver,
|
drivers.InitGlusterFSDriver,
|
||||||
drivers.InitISCSIDriver,
|
drivers.InitISCSIDriver,
|
||||||
@@ -61,26 +60,20 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() {
|
|||||||
f := framework.NewDefaultFramework("volumes")
|
f := framework.NewDefaultFramework("volumes")
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ns *v1.Namespace
|
// Common configuration options for all drivers.
|
||||||
config framework.VolumeTestConfig
|
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 {
|
for _, initDriver := range testDrivers {
|
||||||
curDriver := initDriver()
|
curDriver := initDriver(config)
|
||||||
Context(drivers.GetDriverNameWithFeatureTags(curDriver), func() {
|
Context(testsuites.GetDriverNameWithFeatureTags(curDriver), func() {
|
||||||
driver := curDriver
|
driver := curDriver
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
// setupDriver
|
// setupDriver
|
||||||
drivers.SetCommonDriverParameters(driver, f, config)
|
|
||||||
driver.CreateDriver()
|
driver.CreateDriver()
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -89,7 +82,7 @@ var _ = utils.SIGDescribe("In-tree Volumes", func() {
|
|||||||
driver.CleanupDriver()
|
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",
|
name = "go_default_library",
|
||||||
srcs = [
|
srcs = [
|
||||||
"base.go",
|
"base.go",
|
||||||
|
"driveroperations.go",
|
||||||
"provisioning.go",
|
"provisioning.go",
|
||||||
"subpath.go",
|
"subpath.go",
|
||||||
|
"testdriver.go",
|
||||||
"volume_io.go",
|
"volume_io.go",
|
||||||
"volumemode.go",
|
"volumemode.go",
|
||||||
"volumes.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/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors: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/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/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//test/e2e/framework: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/testpatterns:go_default_library",
|
||||||
"//test/e2e/storage/utils:go_default_library",
|
"//test/e2e/storage/utils:go_default_library",
|
||||||
"//test/utils/image:go_default_library",
|
"//test/utils/image:go_default_library",
|
||||||
|
@@ -30,7 +30,6 @@ import (
|
|||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"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/testpatterns"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -39,9 +38,9 @@ type TestSuite interface {
|
|||||||
// getTestSuiteInfo returns the TestSuiteInfo for this TestSuite
|
// getTestSuiteInfo returns the TestSuiteInfo for this TestSuite
|
||||||
getTestSuiteInfo() TestSuiteInfo
|
getTestSuiteInfo() TestSuiteInfo
|
||||||
// skipUnsupportedTest skips the test if this TestSuite is not suitable to be tested with the combination of TestPattern and TestDriver
|
// 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 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
|
// TestSuiteInfo represents a set of parameters for TestSuite
|
||||||
@@ -55,9 +54,9 @@ type TestSuiteInfo struct {
|
|||||||
type TestResource interface {
|
type TestResource interface {
|
||||||
// setupResource sets up test resources to be used for the tests with the
|
// setupResource sets up test resources to be used for the tests with the
|
||||||
// combination of TestDriver and TestPattern
|
// combination of TestDriver and TestPattern
|
||||||
setupResource(drivers.TestDriver, testpatterns.TestPattern)
|
setupResource(TestDriver, testpatterns.TestPattern)
|
||||||
// cleanupResource clean up the test resources created in SetupResource
|
// 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 {
|
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
|
// 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 {
|
for _, testSuiteInit := range tsInits {
|
||||||
suite := testSuiteInit()
|
suite := testSuiteInit()
|
||||||
patterns := tunePatternFunc(suite.getTestSuiteInfo().testPatterns)
|
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
|
// 2. Check if fsType is supported by driver
|
||||||
// 3. Check with driver specific logic
|
// 3. Check with driver specific logic
|
||||||
// 4. Check with testSuite 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()
|
dInfo := driver.GetDriverInfo()
|
||||||
|
|
||||||
// 1. Check if Whether volType is supported by driver from its interface
|
// 1. Check if Whether volType is supported by driver from its interface
|
||||||
var isSupported bool
|
var isSupported bool
|
||||||
switch pattern.VolType {
|
switch pattern.VolType {
|
||||||
case testpatterns.InlineVolume:
|
case testpatterns.InlineVolume:
|
||||||
_, isSupported = driver.(drivers.InlineVolumeTestDriver)
|
_, isSupported = driver.(InlineVolumeTestDriver)
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
_, isSupported = driver.(drivers.PreprovisionedPVTestDriver)
|
_, isSupported = driver.(PreprovisionedPVTestDriver)
|
||||||
case testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
_, isSupported = driver.(drivers.DynamicPVTestDriver)
|
_, isSupported = driver.(DynamicPVTestDriver)
|
||||||
default:
|
default:
|
||||||
isSupported = false
|
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.
|
// 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.
|
// Also, see subpath.go in the same directory for how to extend and use it.
|
||||||
type genericVolumeTestResource struct {
|
type genericVolumeTestResource struct {
|
||||||
driver drivers.TestDriver
|
driver TestDriver
|
||||||
volType string
|
volType string
|
||||||
volSource *v1.VolumeSource
|
volSource *v1.VolumeSource
|
||||||
pvc *v1.PersistentVolumeClaim
|
pvc *v1.PersistentVolumeClaim
|
||||||
@@ -134,27 +133,27 @@ type genericVolumeTestResource struct {
|
|||||||
var _ TestResource = &genericVolumeTestResource{}
|
var _ TestResource = &genericVolumeTestResource{}
|
||||||
|
|
||||||
// setupResource sets up 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
|
r.driver = driver
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
fsType := pattern.FsType
|
fsType := pattern.FsType
|
||||||
volType := pattern.VolType
|
volType := pattern.VolType
|
||||||
|
|
||||||
// Create volume for pre-provisioned volume tests
|
// Create volume for pre-provisioned volume tests
|
||||||
r.driverTestResource = drivers.CreateVolume(driver, volType)
|
r.driverTestResource = CreateVolume(driver, volType)
|
||||||
|
|
||||||
switch volType {
|
switch volType {
|
||||||
case testpatterns.InlineVolume:
|
case testpatterns.InlineVolume:
|
||||||
framework.Logf("Creating resource for inline volume")
|
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.volSource = iDriver.GetVolumeSource(false, fsType, r.driverTestResource)
|
||||||
r.volType = dInfo.Name
|
r.volType = dInfo.Name
|
||||||
}
|
}
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
framework.Logf("Creating resource for pre-provisioned PV")
|
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)
|
pvSource := pDriver.GetPersistentVolumeSource(false, fsType, r.driverTestResource)
|
||||||
if pvSource != nil {
|
if pvSource != nil {
|
||||||
r.volSource, r.pv, r.pvc = createVolumeSourceWithPVCPV(f, dInfo.Name, pvSource, false)
|
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:
|
case testpatterns.DynamicPV:
|
||||||
framework.Logf("Creating resource for dynamic PV")
|
framework.Logf("Creating resource for dynamic PV")
|
||||||
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
|
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
|
||||||
claimSize := "5Gi"
|
claimSize := dDriver.GetClaimSize()
|
||||||
r.sc = dDriver.GetDynamicProvisionStorageClass(fsType)
|
r.sc = dDriver.GetDynamicProvisionStorageClass(fsType)
|
||||||
|
|
||||||
By("creating a StorageClass " + r.sc.Name)
|
By("creating a StorageClass " + r.sc.Name)
|
||||||
@@ -188,9 +187,9 @@ func (r *genericVolumeTestResource) setupResource(driver drivers.TestDriver, pat
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cleanupResource cleans up genericVolumeTestResource
|
// 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()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
volType := pattern.VolType
|
volType := pattern.VolType
|
||||||
|
|
||||||
if r.pvc != nil || r.pv != nil {
|
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
|
// Cleanup volume for pre-provisioned volume tests
|
||||||
drivers.DeleteVolume(driver, volType, r.driverTestResource)
|
DeleteVolume(driver, volType, r.driverTestResource)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createVolumeSourceWithPVCPV(
|
func createVolumeSourceWithPVCPV(
|
||||||
@@ -324,3 +323,24 @@ func deleteStorageClass(cs clientset.Interface, className string) {
|
|||||||
Expect(err).NotTo(HaveOccurred())
|
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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
101
test/e2e/storage/testsuites/driveroperations.go
Normal file
101
test/e2e/storage/testsuites/driveroperations.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2018 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package testsuites
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
|
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetDriverNameWithFeatureTags returns driver name with feature tags
|
||||||
|
// For example)
|
||||||
|
// - [Driver: nfs]
|
||||||
|
// - [Driver: rbd][Feature:Volumes]
|
||||||
|
func GetDriverNameWithFeatureTags(driver TestDriver) string {
|
||||||
|
dInfo := driver.GetDriverInfo()
|
||||||
|
|
||||||
|
return fmt.Sprintf("[Driver: %s]%s", dInfo.Name, dInfo.FeatureTag)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateVolume creates volume for test unless dynamicPV test
|
||||||
|
func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} {
|
||||||
|
switch volType {
|
||||||
|
case testpatterns.InlineVolume:
|
||||||
|
fallthrough
|
||||||
|
case testpatterns.PreprovisionedPV:
|
||||||
|
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
|
||||||
|
return pDriver.CreateVolume(volType)
|
||||||
|
}
|
||||||
|
case testpatterns.DynamicPV:
|
||||||
|
// No need to create volume
|
||||||
|
default:
|
||||||
|
framework.Failf("Invalid volType specified: %v", volType)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteVolume deletes volume for test unless dynamicPV test
|
||||||
|
func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResource interface{}) {
|
||||||
|
switch volType {
|
||||||
|
case testpatterns.InlineVolume:
|
||||||
|
fallthrough
|
||||||
|
case testpatterns.PreprovisionedPV:
|
||||||
|
if pDriver, ok := driver.(PreprovisionedVolumeTestDriver); ok {
|
||||||
|
pDriver.DeleteVolume(volType, testResource)
|
||||||
|
}
|
||||||
|
case testpatterns.DynamicPV:
|
||||||
|
// No need to delete volume
|
||||||
|
default:
|
||||||
|
framework.Failf("Invalid volType specified: %v", volType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetStorageClass constructs a new StorageClass instance
|
||||||
|
// with a unique name that is based on namespace + suffix.
|
||||||
|
func GetStorageClass(
|
||||||
|
provisioner string,
|
||||||
|
parameters map[string]string,
|
||||||
|
bindingMode *storagev1.VolumeBindingMode,
|
||||||
|
ns string,
|
||||||
|
suffix string,
|
||||||
|
) *storagev1.StorageClass {
|
||||||
|
if bindingMode == nil {
|
||||||
|
defaultBindingMode := storagev1.VolumeBindingImmediate
|
||||||
|
bindingMode = &defaultBindingMode
|
||||||
|
}
|
||||||
|
return &storagev1.StorageClass{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "StorageClass",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
// Name must be unique, so let's base it on namespace name
|
||||||
|
Name: ns + "-" + suffix,
|
||||||
|
},
|
||||||
|
Provisioner: provisioner,
|
||||||
|
Parameters: parameters,
|
||||||
|
VolumeBindingMode: bindingMode,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUniqueDriverName returns unique driver name that can be used parallelly in tests
|
||||||
|
func GetUniqueDriverName(driver TestDriver) string {
|
||||||
|
return fmt.Sprintf("%s-%s", driver.GetDriverInfo().Name, driver.GetDriverInfo().Config.Framework.UniqueName)
|
||||||
|
}
|
@@ -31,7 +31,6 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"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/testpatterns"
|
||||||
imageutils "k8s.io/kubernetes/test/utils/image"
|
imageutils "k8s.io/kubernetes/test/utils/image"
|
||||||
)
|
)
|
||||||
@@ -74,10 +73,10 @@ func (p *provisioningTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
|||||||
return p.tsInfo
|
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
|
// Setup test resource for driver and testpattern
|
||||||
resource := provisioningTestResource{}
|
resource := provisioningTestResource{}
|
||||||
resource.setupResource(driver, pattern)
|
resource.setupResource(driver, pattern)
|
||||||
@@ -87,7 +86,7 @@ func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns
|
|||||||
ClaimSize: resource.claimSize,
|
ClaimSize: resource.claimSize,
|
||||||
ExpectedSize: resource.claimSize,
|
ExpectedSize: resource.claimSize,
|
||||||
},
|
},
|
||||||
cs: driver.GetDriverInfo().Framework.ClientSet,
|
cs: driver.GetDriverInfo().Config.Framework.ClientSet,
|
||||||
pvc: resource.pvc,
|
pvc: resource.pvc,
|
||||||
sc: resource.sc,
|
sc: resource.sc,
|
||||||
dInfo: driver.GetDriverInfo(),
|
dInfo: driver.GetDriverInfo(),
|
||||||
@@ -100,7 +99,7 @@ func createProvisioningTestInput(driver drivers.TestDriver, pattern testpatterns
|
|||||||
return resource, input
|
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() {
|
Context(getTestNameStr(p, pattern), func() {
|
||||||
var (
|
var (
|
||||||
resource provisioningTestResource
|
resource provisioningTestResource
|
||||||
@@ -132,7 +131,7 @@ func (p *provisioningTestSuite) execTest(driver drivers.TestDriver, pattern test
|
|||||||
}
|
}
|
||||||
|
|
||||||
type provisioningTestResource struct {
|
type provisioningTestResource struct {
|
||||||
driver drivers.TestDriver
|
driver TestDriver
|
||||||
|
|
||||||
claimSize string
|
claimSize string
|
||||||
sc *storage.StorageClass
|
sc *storage.StorageClass
|
||||||
@@ -141,18 +140,18 @@ type provisioningTestResource struct {
|
|||||||
|
|
||||||
var _ TestResource = &provisioningTestResource{}
|
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
|
// Setup provisioningTest resource
|
||||||
switch pattern.VolType {
|
switch pattern.VolType {
|
||||||
case testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
|
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
|
||||||
p.sc = dDriver.GetDynamicProvisionStorageClass("")
|
p.sc = dDriver.GetDynamicProvisionStorageClass("")
|
||||||
if p.sc == nil {
|
if p.sc == nil {
|
||||||
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", driver.GetDriverInfo().Name)
|
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", driver.GetDriverInfo().Name)
|
||||||
}
|
}
|
||||||
p.driver = driver
|
p.driver = driver
|
||||||
p.claimSize = "5Gi"
|
p.claimSize = dDriver.GetClaimSize()
|
||||||
p.pvc = getClaim(p.claimSize, driver.GetDriverInfo().Framework.Namespace.Name)
|
p.pvc = getClaim(p.claimSize, driver.GetDriverInfo().Config.Framework.Namespace.Name)
|
||||||
p.pvc.Spec.StorageClassName = &p.sc.Name
|
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)
|
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 {
|
type provisioningTestInput struct {
|
||||||
@@ -169,7 +168,7 @@ type provisioningTestInput struct {
|
|||||||
cs clientset.Interface
|
cs clientset.Interface
|
||||||
pvc *v1.PersistentVolumeClaim
|
pvc *v1.PersistentVolumeClaim
|
||||||
sc *storage.StorageClass
|
sc *storage.StorageClass
|
||||||
dInfo *drivers.DriverInfo
|
dInfo *DriverInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProvisioning(input *provisioningTestInput) {
|
func testProvisioning(input *provisioningTestInput) {
|
||||||
@@ -187,7 +186,7 @@ func testProvisioning(input *provisioningTestInput) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
It("should create and delete block persistent volumes", func() {
|
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)
|
framework.Skipf("Driver %q does not support BlockVolume - skipping", input.dInfo.Name)
|
||||||
}
|
}
|
||||||
block := v1.PersistentVolumeBlock
|
block := v1.PersistentVolumeBlock
|
||||||
|
@@ -27,7 +27,6 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/rand"
|
"k8s.io/apimachinery/pkg/util/rand"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"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/testpatterns"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/utils"
|
"k8s.io/kubernetes/test/e2e/storage/utils"
|
||||||
imageutils "k8s.io/kubernetes/test/utils/image"
|
imageutils "k8s.io/kubernetes/test/utils/image"
|
||||||
@@ -72,13 +71,13 @@ func (s *subPathTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
|||||||
return s.tsInfo
|
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 {
|
func createSubPathTestInput(pattern testpatterns.TestPattern, resource subPathTestResource) subPathTestInput {
|
||||||
driver := resource.driver
|
driver := resource.driver
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
subPath := f.Namespace.Name
|
subPath := f.Namespace.Name
|
||||||
subPathDir := filepath.Join(volumePath, subPath)
|
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() {
|
Context(getTestNameStr(s, pattern), func() {
|
||||||
var (
|
var (
|
||||||
resource subPathTestResource
|
resource subPathTestResource
|
||||||
@@ -137,10 +136,10 @@ type subPathTestResource struct {
|
|||||||
|
|
||||||
var _ TestResource = &subPathTestResource{}
|
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
|
s.driver = driver
|
||||||
dInfo := s.driver.GetDriverInfo()
|
dInfo := s.driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
fsType := pattern.FsType
|
fsType := pattern.FsType
|
||||||
volType := pattern.VolType
|
volType := pattern.VolType
|
||||||
|
|
||||||
@@ -150,7 +149,7 @@ func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern t
|
|||||||
// Setup subPath test dependent resource
|
// Setup subPath test dependent resource
|
||||||
switch volType {
|
switch volType {
|
||||||
case testpatterns.InlineVolume:
|
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)
|
s.roVolSource = iDriver.GetVolumeSource(true, fsType, s.genericVolumeTestResource.driverTestResource)
|
||||||
}
|
}
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
@@ -175,16 +174,16 @@ func (s *subPathTestResource) setupResource(driver drivers.TestDriver, pattern t
|
|||||||
config := dInfo.Config
|
config := dInfo.Config
|
||||||
s.pod = SubpathTestPod(f, subPath, s.volType, s.volSource, true)
|
s.pod = SubpathTestPod(f, subPath, s.volType, s.volSource, true)
|
||||||
s.pod.Spec.NodeName = config.ClientNodeName
|
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 = volumeFormatPod(f, s.volSource)
|
||||||
s.formatPod.Spec.NodeName = config.ClientNodeName
|
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()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
|
|
||||||
// Cleanup subPath test dependent resource
|
// Cleanup subPath test dependent resource
|
||||||
By("Deleting pod")
|
By("Deleting pod")
|
||||||
|
@@ -14,14 +14,11 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package drivers
|
package testsuites
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
storagev1 "k8s.io/api/storage/v1"
|
storagev1 "k8s.io/api/storage/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
|
"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 set fsType to the StorageClass, if TestDriver supports it.
|
||||||
// It will return nil, if the TestDriver doesn't support it.
|
// It will return nil, if the TestDriver doesn't support it.
|
||||||
GetDynamicProvisionStorageClass(fsType string) *storagev1.StorageClass
|
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
|
// 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)
|
RequiredMountOption sets.String // Map of string for required mount option (Optional)
|
||||||
Capabilities map[Capability]bool // Map that represents plugin capabilities
|
Capabilities map[Capability]bool // Map that represents plugin capabilities
|
||||||
|
|
||||||
// Parameters below will be set inside test loop by using SetCommonDriverParameters.
|
Config TestConfig // Test configuration for the current test.
|
||||||
// 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDriverNameWithFeatureTags returns driver name with feature tags
|
// TestConfig represents parameters that control test execution.
|
||||||
// For example)
|
// They can still be modified after defining tests, for example
|
||||||
// - [Driver: nfs]
|
// in a BeforeEach or when creating the driver.
|
||||||
// - [Driver: rbd][Feature:Volumes]
|
type TestConfig struct {
|
||||||
func GetDriverNameWithFeatureTags(driver TestDriver) string {
|
// Some short word that gets inserted into dynamically
|
||||||
dInfo := driver.GetDriverInfo()
|
// 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)
|
// The framework instance allocated for the current test.
|
||||||
}
|
Framework *framework.Framework
|
||||||
|
|
||||||
// CreateVolume creates volume for test unless dynamicPV test
|
// If non-empty, then pods using a volume will be scheduled
|
||||||
func CreateVolume(driver TestDriver, volType testpatterns.TestVolType) interface{} {
|
// onto the node with this name. Otherwise Kubernetes will
|
||||||
switch volType {
|
// pick a node.
|
||||||
case testpatterns.InlineVolume:
|
ClientNodeName string
|
||||||
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
|
// Some tests also support scheduling pods onto nodes with
|
||||||
func DeleteVolume(driver TestDriver, volType testpatterns.TestVolType, testResource interface{}) {
|
// these label/value pairs. As not all tests use this field,
|
||||||
switch volType {
|
// a driver that absolutely needs the pods on a specific
|
||||||
case testpatterns.InlineVolume:
|
// node must use ClientNodeName.
|
||||||
fallthrough
|
ClientNodeSelector map[string]string
|
||||||
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
|
// Some test drivers initialize a storage server. This is
|
||||||
// This function is intended to be called in BeforeEach() inside test loop.
|
// the configuration that then has to be used to run tests.
|
||||||
func SetCommonDriverParameters(
|
// The values above are ignored for such tests.
|
||||||
driver TestDriver,
|
ServerConfig *framework.VolumeTestConfig
|
||||||
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)
|
|
||||||
}
|
}
|
@@ -35,7 +35,6 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"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/testpatterns"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/utils"
|
"k8s.io/kubernetes/test/e2e/storage/utils"
|
||||||
)
|
)
|
||||||
@@ -75,14 +74,14 @@ func (t *volumeIOTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
|||||||
return t.tsInfo
|
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 {
|
func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericVolumeTestResource) volumeIOTestInput {
|
||||||
var fsGroup *int64
|
var fsGroup *int64
|
||||||
driver := resource.driver
|
driver := resource.driver
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
fileSizes := createFileSizes(dInfo.MaxFileSize)
|
fileSizes := createFileSizes(dInfo.MaxFileSize)
|
||||||
volSource := resource.volSource
|
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)
|
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if dInfo.Capabilities[drivers.CapFsGroup] {
|
if dInfo.Capabilities[CapFsGroup] {
|
||||||
fsGroupVal := int64(1234)
|
fsGroupVal := int64(1234)
|
||||||
fsGroup = &fsGroupVal
|
fsGroup = &fsGroupVal
|
||||||
}
|
}
|
||||||
@@ -98,7 +97,7 @@ func createVolumeIOTestInput(pattern testpatterns.TestPattern, resource genericV
|
|||||||
return volumeIOTestInput{
|
return volumeIOTestInput{
|
||||||
f: f,
|
f: f,
|
||||||
name: dInfo.Name,
|
name: dInfo.Name,
|
||||||
config: dInfo.Config,
|
config: &dInfo.Config,
|
||||||
volSource: *volSource,
|
volSource: *volSource,
|
||||||
testFile: fmt.Sprintf("%s_io_test_%s", dInfo.Name, f.Namespace.Name),
|
testFile: fmt.Sprintf("%s_io_test_%s", dInfo.Name, f.Namespace.Name),
|
||||||
podSec: v1.PodSecurityContext{
|
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() {
|
Context(getTestNameStr(t, pattern), func() {
|
||||||
var (
|
var (
|
||||||
resource genericVolumeTestResource
|
resource genericVolumeTestResource
|
||||||
@@ -143,7 +142,7 @@ func (t *volumeIOTestSuite) execTest(driver drivers.TestDriver, pattern testpatt
|
|||||||
type volumeIOTestInput struct {
|
type volumeIOTestInput struct {
|
||||||
f *framework.Framework
|
f *framework.Framework
|
||||||
name string
|
name string
|
||||||
config framework.VolumeTestConfig
|
config *TestConfig
|
||||||
volSource v1.VolumeSource
|
volSource v1.VolumeSource
|
||||||
testFile string
|
testFile string
|
||||||
podSec v1.PodSecurityContext
|
podSec v1.PodSecurityContext
|
||||||
@@ -155,7 +154,7 @@ func execTestVolumeIO(input *volumeIOTestInput) {
|
|||||||
f := input.f
|
f := input.f
|
||||||
cs := f.ClientSet
|
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())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -27,7 +27,6 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"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/testpatterns"
|
||||||
"k8s.io/kubernetes/test/e2e/storage/utils"
|
"k8s.io/kubernetes/test/e2e/storage/utils"
|
||||||
)
|
)
|
||||||
@@ -62,13 +61,13 @@ func (t *volumeModeTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
|||||||
return t.tsInfo
|
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 {
|
func createVolumeModeTestInput(pattern testpatterns.TestPattern, resource volumeModeTestResource) volumeModeTestInput {
|
||||||
driver := resource.driver
|
driver := resource.driver
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
|
|
||||||
return volumeModeTestInput{
|
return volumeModeTestInput{
|
||||||
f: f,
|
f: f,
|
||||||
@@ -78,13 +77,13 @@ func createVolumeModeTestInput(pattern testpatterns.TestPattern, resource volume
|
|||||||
testVolType: pattern.VolType,
|
testVolType: pattern.VolType,
|
||||||
nodeName: dInfo.Config.ClientNodeName,
|
nodeName: dInfo.Config.ClientNodeName,
|
||||||
volMode: pattern.VolMode,
|
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()
|
dInfo := driver.GetDriverInfo()
|
||||||
isBlockSupported := dInfo.Capabilities[drivers.CapBlock]
|
isBlockSupported := dInfo.Capabilities[CapBlock]
|
||||||
volMode := pattern.VolMode
|
volMode := pattern.VolMode
|
||||||
volType := pattern.VolType
|
volType := pattern.VolType
|
||||||
|
|
||||||
@@ -105,7 +104,7 @@ func getVolumeModeTestFunc(pattern testpatterns.TestPattern, driver drivers.Test
|
|||||||
return nil
|
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() {
|
Context(getTestNameStr(t, pattern), func() {
|
||||||
var (
|
var (
|
||||||
resource volumeModeTestResource
|
resource volumeModeTestResource
|
||||||
@@ -141,7 +140,7 @@ func (t *volumeModeTestSuite) execTest(driver drivers.TestDriver, pattern testpa
|
|||||||
}
|
}
|
||||||
|
|
||||||
type volumeModeTestResource struct {
|
type volumeModeTestResource struct {
|
||||||
driver drivers.TestDriver
|
driver TestDriver
|
||||||
|
|
||||||
sc *storagev1.StorageClass
|
sc *storagev1.StorageClass
|
||||||
pvc *v1.PersistentVolumeClaim
|
pvc *v1.PersistentVolumeClaim
|
||||||
@@ -152,10 +151,10 @@ type volumeModeTestResource struct {
|
|||||||
|
|
||||||
var _ TestResource = &volumeModeTestResource{}
|
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
|
s.driver = driver
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
fsType := pattern.FsType
|
fsType := pattern.FsType
|
||||||
volBindMode := storagev1.VolumeBindingImmediate
|
volBindMode := storagev1.VolumeBindingImmediate
|
||||||
@@ -168,7 +167,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Create volume for pre-provisioned volume tests
|
// Create volume for pre-provisioned volume tests
|
||||||
s.driverTestResource = drivers.CreateVolume(driver, volType)
|
s.driverTestResource = CreateVolume(driver, volType)
|
||||||
|
|
||||||
switch volType {
|
switch volType {
|
||||||
case testpatterns.PreprovisionedPV:
|
case testpatterns.PreprovisionedPV:
|
||||||
@@ -177,7 +176,7 @@ func (s *volumeModeTestResource) setupResource(driver drivers.TestDriver, patter
|
|||||||
} else if volMode == v1.PersistentVolumeFilesystem {
|
} else if volMode == v1.PersistentVolumeFilesystem {
|
||||||
scName = fmt.Sprintf("%s-%s-sc-for-file", ns.Name, dInfo.Name)
|
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)
|
pvSource = pDriver.GetPersistentVolumeSource(false, fsType, s.driverTestResource)
|
||||||
if pvSource == nil {
|
if pvSource == nil {
|
||||||
framework.Skipf("Driver %q does not define PersistentVolumeSource - skipping", dInfo.Name)
|
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)
|
s.pvc = framework.MakePersistentVolumeClaim(pvcConfig, ns.Name)
|
||||||
}
|
}
|
||||||
case testpatterns.DynamicPV:
|
case testpatterns.DynamicPV:
|
||||||
if dDriver, ok := driver.(drivers.DynamicPVTestDriver); ok {
|
if dDriver, ok := driver.(DynamicPVTestDriver); ok {
|
||||||
s.sc = dDriver.GetDynamicProvisionStorageClass(fsType)
|
s.sc = dDriver.GetDynamicProvisionStorageClass(fsType)
|
||||||
if s.sc == nil {
|
if s.sc == nil {
|
||||||
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not define Dynamic Provision StorageClass - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
s.sc.VolumeBindingMode = &volBindMode
|
s.sc.VolumeBindingMode = &volBindMode
|
||||||
|
|
||||||
claimSize := "5Gi"
|
claimSize := dDriver.GetClaimSize()
|
||||||
s.pvc = getClaim(claimSize, ns.Name)
|
s.pvc = getClaim(claimSize, ns.Name)
|
||||||
s.pvc.Spec.StorageClassName = &s.sc.Name
|
s.pvc.Spec.StorageClassName = &s.sc.Name
|
||||||
s.pvc.Spec.VolumeMode = &volMode
|
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()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
ns := f.Namespace
|
ns := f.Namespace
|
||||||
volType := pattern.VolType
|
volType := pattern.VolType
|
||||||
@@ -224,7 +223,7 @@ func (s *volumeModeTestResource) cleanupResource(driver drivers.TestDriver, patt
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup volume for pre-provisioned volume tests
|
// Cleanup volume for pre-provisioned volume tests
|
||||||
drivers.DeleteVolume(driver, volType, s.driverTestResource)
|
DeleteVolume(driver, volType, s.driverTestResource)
|
||||||
}
|
}
|
||||||
|
|
||||||
type volumeModeTestInput struct {
|
type volumeModeTestInput struct {
|
||||||
|
@@ -31,7 +31,6 @@ import (
|
|||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"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/testpatterns"
|
||||||
imageutils "k8s.io/kubernetes/test/utils/image"
|
imageutils "k8s.io/kubernetes/test/utils/image"
|
||||||
)
|
)
|
||||||
@@ -73,19 +72,19 @@ func (t *volumesTestSuite) getTestSuiteInfo() TestSuiteInfo {
|
|||||||
return t.tsInfo
|
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()
|
dInfo := driver.GetDriverInfo()
|
||||||
if !dInfo.Capabilities[drivers.CapPersistence] {
|
if !dInfo.Capabilities[CapPersistence] {
|
||||||
framework.Skipf("Driver %q does not provide persistency - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not provide persistency - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func skipExecTest(driver drivers.TestDriver) {
|
func skipExecTest(driver TestDriver) {
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
if !dInfo.Capabilities[drivers.CapExec] {
|
if !dInfo.Capabilities[CapExec] {
|
||||||
framework.Skipf("Driver %q does not support exec - skipping", dInfo.Name)
|
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
|
var fsGroup *int64
|
||||||
driver := resource.driver
|
driver := resource.driver
|
||||||
dInfo := driver.GetDriverInfo()
|
dInfo := driver.GetDriverInfo()
|
||||||
f := dInfo.Framework
|
f := dInfo.Config.Framework
|
||||||
volSource := resource.volSource
|
volSource := resource.volSource
|
||||||
|
|
||||||
if volSource == nil {
|
if volSource == nil {
|
||||||
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
framework.Skipf("Driver %q does not define volumeSource - skipping", dInfo.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if dInfo.Capabilities[drivers.CapFsGroup] {
|
if dInfo.Capabilities[CapFsGroup] {
|
||||||
fsGroupVal := int64(1234)
|
fsGroupVal := int64(1234)
|
||||||
fsGroup = &fsGroupVal
|
fsGroup = &fsGroupVal
|
||||||
}
|
}
|
||||||
@@ -109,7 +108,7 @@ func createVolumesTestInput(pattern testpatterns.TestPattern, resource genericVo
|
|||||||
return volumesTestInput{
|
return volumesTestInput{
|
||||||
f: f,
|
f: f,
|
||||||
name: dInfo.Name,
|
name: dInfo.Name,
|
||||||
config: dInfo.Config,
|
config: &dInfo.Config,
|
||||||
fsGroup: fsGroup,
|
fsGroup: fsGroup,
|
||||||
resource: resource,
|
resource: resource,
|
||||||
tests: []framework.VolumeTest{
|
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() {
|
Context(getTestNameStr(t, pattern), func() {
|
||||||
var (
|
var (
|
||||||
resource genericVolumeTestResource
|
resource genericVolumeTestResource
|
||||||
@@ -159,7 +158,7 @@ func (t *volumesTestSuite) execTest(driver drivers.TestDriver, pattern testpatte
|
|||||||
type volumesTestInput struct {
|
type volumesTestInput struct {
|
||||||
f *framework.Framework
|
f *framework.Framework
|
||||||
name string
|
name string
|
||||||
config framework.VolumeTestConfig
|
config *TestConfig
|
||||||
fsGroup *int64
|
fsGroup *int64
|
||||||
tests []framework.VolumeTest
|
tests []framework.VolumeTest
|
||||||
resource genericVolumeTestResource
|
resource genericVolumeTestResource
|
||||||
@@ -169,19 +168,20 @@ func testVolumes(input *volumesTestInput) {
|
|||||||
It("should be mountable", func() {
|
It("should be mountable", func() {
|
||||||
f := input.f
|
f := input.f
|
||||||
cs := f.ClientSet
|
cs := f.ClientSet
|
||||||
defer framework.VolumeTestCleanup(f, input.config)
|
defer framework.VolumeTestCleanup(f, convertTestConfig(input.config))
|
||||||
|
|
||||||
skipPersistenceTest(input.resource.driver)
|
skipPersistenceTest(input.resource.driver)
|
||||||
|
|
||||||
volumeTest := input.tests
|
volumeTest := input.tests
|
||||||
framework.InjectHtml(cs, input.config, volumeTest[0].Volume, volumeTest[0].ExpectedContent)
|
config := convertTestConfig(input.config)
|
||||||
framework.TestVolumeClient(cs, input.config, input.fsGroup, input.tests)
|
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() {
|
It("should allow exec of files on the volume", func() {
|
||||||
f := input.f
|
f := input.f
|
||||||
skipExecTest(input.resource.driver)
|
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:
|
spec:
|
||||||
serviceAccountName: csi-provisioner
|
serviceAccountName: csi-provisioner
|
||||||
containers:
|
containers:
|
||||||
- name: csi-provisioner-v0
|
- name: csi-provisioner
|
||||||
image: quay.io/k8scsi/csi-provisioner:v0.4.1
|
image: quay.io/k8scsi/csi-provisioner:v0.4.1
|
||||||
args:
|
args:
|
||||||
- "--provisioner=csi-hostpath-v0"
|
- "--provisioner=csi-hostpath-v0"
|
||||||
|
Reference in New Issue
Block a user