Skip to content

Commit

Permalink
Add ROX storage tests (#114628)
Browse files Browse the repository at this point in the history
* Add ROX tests

* Add capability and switch to secpod

* addmissing file

* remove extra param

* run-formatter

* add anticapability for resize w/ Restore + ROX

* remove size checking in ROX tests

* fix spacing

* fix spacing
  • Loading branch information
judemars committed Apr 26, 2023
1 parent afeb78f commit 217196c
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 2 deletions.
6 changes: 5 additions & 1 deletion test/e2e/storage/framework/testdriver.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,8 @@ const (
// capacity information for it.
CapCapacity Capability = "capacity"

// Anti-capability for drivers that do not support filesystem resizing of PVCs that are cloned or restored from a snapshot.
// Anti-capability for drivers that do not support filesystem resizing of PVCs
// that are cloned or restored from a snapshot.
CapFSResizeFromSourceNotSupported Capability = "FSResizeFromSourceNotSupported"

// To support ReadWriteOncePod, the following CSI sidecars must be
Expand All @@ -204,6 +205,9 @@ const (
// talk to Kubernetes API server in any way should keep this capability enabled, because
// they will see the same NodeStage / NodePublish requests as if only one PV existed.
CapMultiplePVsSameID Capability = "multiplePVsSameID"

// The driver supports ReadOnlyMany (ROX) access mode
CapReadOnlyMany Capability = "capReadOnlyMany"
)

// DriverInfo represents static information about a TestDriver.
Expand Down
87 changes: 86 additions & 1 deletion test/e2e/storage/testsuites/provisioning.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ package testsuites
import (
"context"
"fmt"
e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"
"strconv"
"strings"
"sync"
"time"

e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"

"github.com/onsi/ginkgo/v2"
"github.com/onsi/gomega"

Expand Down Expand Up @@ -234,6 +235,48 @@ func (p *provisioningTestSuite) DefineTests(driver storageframework.TestDriver,
l.testCase.TestDynamicProvisioning(ctx)
})

ginkgo.It("should provision storage with snapshot data source (ROX mode) [Feature:VolumeSnapshotDataSource]", func(ctx context.Context) {
if !dInfo.Capabilities[storageframework.CapSnapshotDataSource] {
e2eskipper.Skipf("Driver %q does not support populating data from snapshot - skipping", dInfo.Name)
}
if !dInfo.SupportedFsType.Has(pattern.FsType) {
e2eskipper.Skipf("Driver %q does not support %q fs type - skipping", dInfo.Name, pattern.FsType)
}
if !dInfo.Capabilities[storageframework.CapReadOnlyMany] {
e2eskipper.Skipf("Driver %q does not support ROX access mode - skipping", dInfo.Name)
}

sDriver, ok := driver.(storageframework.SnapshottableTestDriver)
if !ok {
framework.Failf("Driver %q has CapSnapshotDataSource but does not implement SnapshottableTestDriver", dInfo.Name)
}

init(ctx)

dc := l.config.Framework.DynamicClient
testConfig := storageframework.ConvertTestConfig(l.config)
expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name)
dataSourceRef := prepareSnapshotDataSourceForProvisioning(ctx, f, testConfig, l.config, pattern, l.cs, dc, l.pvc, l.sc, sDriver, pattern.VolMode, expectedContent)

l.pvc.Spec.DataSourceRef = dataSourceRef
l.pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{
v1.PersistentVolumeAccessMode(v1.ReadOnlyMany),
}
l.testCase.PvCheck = func(ctx context.Context, claim *v1.PersistentVolumeClaim) {
ginkgo.By("checking whether the created volume has the pre-populated data")
tests := []e2evolume.Test{
{
Volume: *storageutils.CreateVolumeSource(claim.Name, false /* readOnly */),
Mode: pattern.VolMode,
File: "index.html",
ExpectedContent: expectedContent,
},
}
e2evolume.TestVolumeClientSlow(ctx, f, testConfig, nil, "", tests)
}
l.testCase.TestDynamicProvisioning(ctx)
})

ginkgo.It("should provision storage with any volume data source [Serial]", func(ctx context.Context) {
if len(dInfo.InTreePluginName) != 0 {
e2eskipper.Skipf("AnyVolumeDataSource feature only works with CSI drivers - skipping")
Expand Down Expand Up @@ -527,6 +570,48 @@ func (p *provisioningTestSuite) DefineTests(driver storageframework.TestDriver,
l.testCase.TestDynamicProvisioning(ctx)
})

ginkgo.It("should provision storage with pvc data source (ROX mode)", func(ctx context.Context) {
if !dInfo.Capabilities[storageframework.CapPVCDataSource] {
e2eskipper.Skipf("Driver %q does not support cloning - skipping", dInfo.Name)
}
if !dInfo.Capabilities[storageframework.CapReadOnlyMany] {
e2eskipper.Skipf("Driver %q does not support ROX access mode - skipping", dInfo.Name)
}
init(ctx)

if l.config.ClientNodeSelection.Name == "" {
// Schedule all pods to the same topology segment (e.g. a cloud availability zone), some
// drivers don't support cloning across them.
if err := ensureTopologyRequirements(ctx, &l.config.ClientNodeSelection, l.cs, dInfo, 1); err != nil {
framework.Failf("Error setting topology requirements: %v", err)
}
}
testConfig := storageframework.ConvertTestConfig(l.config)
expectedContent := fmt.Sprintf("Hello from namespace %s", f.Namespace.Name)
dataSourceRef := preparePVCDataSourceForProvisioning(ctx, f, testConfig, l.cs, l.sourcePVC, l.sc, pattern.VolMode, expectedContent)
l.pvc.Spec.DataSourceRef = dataSourceRef
l.pvc.Spec.AccessModes = []v1.PersistentVolumeAccessMode{
v1.PersistentVolumeAccessMode(v1.ReadOnlyMany),
}
l.testCase.NodeSelection = testConfig.ClientNodeSelection
l.testCase.PvCheck = func(ctx context.Context, claim *v1.PersistentVolumeClaim) {
ginkgo.By("checking whether the created volume has the pre-populated data")
tests := []e2evolume.Test{
{
Volume: *storageutils.CreateVolumeSource(claim.Name, false /* readOnly */),
Mode: pattern.VolMode,
File: "index.html",
ExpectedContent: expectedContent,
},
}
e2evolume.TestVolumeClientSlow(ctx, f, testConfig, nil, "", tests)
}
// Cloning fails if the source disk is still in the process of detaching, so we wait for the VolumeAttachment to be removed before cloning.
volumeAttachment := e2evolume.GetVolumeAttachmentName(ctx, f.ClientSet, testConfig, l.testCase.Provisioner, dataSourceRef.Name, l.sourcePVC.Namespace)
e2evolume.WaitForVolumeAttachmentTerminated(ctx, volumeAttachment, f.ClientSet, f.Timeouts.DataSourceProvision)
l.testCase.TestDynamicProvisioning(ctx)
})

ginkgo.It("should provision storage with pvc data source in parallel [Slow]", func(ctx context.Context) {
// Test cloning a single volume multiple times.
if !dInfo.Capabilities[storageframework.CapPVCDataSource] {
Expand Down

0 comments on commit 217196c

Please sign in to comment.