Skip to content

Commit 683b978

Browse files
committed
Add test for mismatched usage of filesystem/block volumes
1 parent ef88694 commit 683b978

File tree

1 file changed

+59
-4
lines changed

1 file changed

+59
-4
lines changed

test/e2e/storage/testsuites/volumemode.go

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
clientset "k8s.io/client-go/kubernetes"
2828
"k8s.io/kubernetes/test/e2e/framework"
2929
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
30+
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
3031
"k8s.io/kubernetes/test/e2e/storage/testpatterns"
3132
)
3233

@@ -94,6 +95,11 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
9495
// Now do the more expensive test initialization.
9596
l.config, l.testCleanup = driver.PrepareTest(f)
9697
l.intreeOps, l.migratedOps = getMigrationVolumeOpCounts(f.ClientSet, dInfo.InTreePluginName)
98+
}
99+
100+
// manualInit initializes l.genericVolumeTestResource without creating the PV & PVC objects.
101+
manualInit := func() {
102+
init()
97103

98104
fsType := pattern.FsType
99105
volBindMode := storagev1.VolumeBindingImmediate
@@ -167,7 +173,7 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
167173
case testpatterns.PreprovisionedPV:
168174
if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported {
169175
ginkgo.It("should fail to create pod by failing to mount volume [Slow]", func() {
170-
init()
176+
manualInit()
171177
defer cleanup()
172178

173179
var err error
@@ -196,13 +202,12 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
196202
}()
197203
framework.ExpectError(err)
198204
})
199-
// TODO(mkimuram): Add more tests
200205
}
201206

202207
case testpatterns.DynamicPV:
203208
if pattern.VolMode == v1.PersistentVolumeBlock && !isBlockSupported {
204209
ginkgo.It("should fail in binding dynamic provisioned PV to PVC [Slow]", func() {
205-
init()
210+
manualInit()
206211
defer cleanup()
207212

208213
var err error
@@ -218,12 +223,36 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
218223
err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, l.cs, l.pvc.Namespace, l.pvc.Name, framework.Poll, framework.ClaimProvisionTimeout)
219224
framework.ExpectError(err)
220225
})
221-
// TODO(mkimuram): Add more tests
222226
}
223227
default:
224228
e2elog.Failf("Volume mode test doesn't support volType: %v", pattern.VolType)
225229
}
226230

231+
ginkgo.It("should fail to use a volume in a pod with mismatched mode [Slow]", func() {
232+
skipBlockTest(driver)
233+
init()
234+
l.genericVolumeTestResource = *createGenericVolumeTestResource(driver, l.config, pattern)
235+
defer cleanup()
236+
237+
ginkgo.By("Creating pod")
238+
var err error
239+
pod := framework.MakeSecPod(l.ns.Name, []*v1.PersistentVolumeClaim{l.pvc}, false, "", false, false, framework.SELinuxLabel, nil)
240+
// Change volumeMounts to volumeDevices and the other way around
241+
pod = swapVolumeMode(pod)
242+
243+
// Run the pod
244+
pod, err = l.cs.CoreV1().Pods(l.ns.Name).Create(pod)
245+
framework.ExpectNoError(err)
246+
defer func() {
247+
framework.ExpectNoError(framework.DeletePodWithWait(f, l.cs, pod))
248+
}()
249+
250+
// TODO: find a faster way how to check the pod can't start,
251+
// perhaps when https://github.com/kubernetes/kubernetes/issues/79794 is fixed.
252+
err = e2epod.WaitTimeoutForPodRunningInNamespace(l.cs, pod.Name, l.ns.Name, framework.PodStartTimeout)
253+
framework.ExpectError(err, "pod with mismatched block/filesystem volumes should not start")
254+
})
255+
227256
}
228257

229258
func generateConfigsForPreprovisionedPVTest(scName string, volBindMode storagev1.VolumeBindingMode,
@@ -254,3 +283,29 @@ func generateConfigsForPreprovisionedPVTest(scName string, volBindMode storagev1
254283

255284
return scConfig, pvConfig, pvcConfig
256285
}
286+
287+
// swapVolumeMode changes volumeMounts to volumeDevices and the other way around
288+
func swapVolumeMode(podTemplate *v1.Pod) *v1.Pod {
289+
pod := podTemplate.DeepCopy()
290+
for c := range pod.Spec.Containers {
291+
container := &pod.Spec.Containers[c]
292+
container.VolumeDevices = []v1.VolumeDevice{}
293+
container.VolumeMounts = []v1.VolumeMount{}
294+
295+
// Change VolumeMounts to VolumeDevices
296+
for _, volumeMount := range podTemplate.Spec.Containers[c].VolumeMounts {
297+
container.VolumeDevices = append(container.VolumeDevices, v1.VolumeDevice{
298+
Name: volumeMount.Name,
299+
DevicePath: volumeMount.MountPath,
300+
})
301+
}
302+
// Change VolumeDevices to VolumeMounts
303+
for _, volumeDevice := range podTemplate.Spec.Containers[c].VolumeDevices {
304+
container.VolumeMounts = append(container.VolumeMounts, v1.VolumeMount{
305+
Name: volumeDevice.Name,
306+
MountPath: volumeDevice.DevicePath,
307+
})
308+
}
309+
}
310+
return pod
311+
}

0 commit comments

Comments
 (0)