@@ -24,7 +24,9 @@ import (
24
24
v1 "k8s.io/api/core/v1"
25
25
storagev1 "k8s.io/api/storage/v1"
26
26
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
+ "k8s.io/apimachinery/pkg/fields"
27
28
clientset "k8s.io/client-go/kubernetes"
29
+ "k8s.io/kubernetes/pkg/kubelet/events"
28
30
"k8s.io/kubernetes/test/e2e/framework"
29
31
e2elog "k8s.io/kubernetes/test/e2e/framework/log"
30
32
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
@@ -236,7 +238,7 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
236
238
237
239
ginkgo .By ("Creating pod" )
238
240
var err error
239
- pod := framework .MakeSecPod (l .ns .Name , []* v1.PersistentVolumeClaim {l .pvc }, false , "" , false , false , framework .SELinuxLabel , nil )
241
+ pod := framework .MakeSecPod (l .ns .Name , []* v1.PersistentVolumeClaim {l .pvc }, nil , false , "" , false , false , framework .SELinuxLabel , nil )
240
242
// Change volumeMounts to volumeDevices and the other way around
241
243
pod = swapVolumeMode (pod )
242
244
@@ -247,10 +249,31 @@ func (t *volumeModeTestSuite) defineTests(driver TestDriver, pattern testpattern
247
249
framework .ExpectNoError (framework .DeletePodWithWait (f , l .cs , pod ))
248
250
}()
249
251
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" )
252
+ ginkgo .By ("Waiting for pod to fail" )
253
+ // Wait for an event that the pod is invalid.
254
+ eventSelector := fields.Set {
255
+ "involvedObject.kind" : "Pod" ,
256
+ "involvedObject.name" : pod .Name ,
257
+ "involvedObject.namespace" : l .ns .Name ,
258
+ "reason" : events .FailedMountVolume ,
259
+ }.AsSelector ().String ()
260
+
261
+ var msg string
262
+ if pattern .VolMode == v1 .PersistentVolumeBlock {
263
+ msg = "has volumeMode Block, but is specified in volumeMounts"
264
+ } else {
265
+ msg = "has volumeMode Filesystem, but is specified in volumeDevices"
266
+ }
267
+ err = e2epod .WaitTimeoutForPodEvent (l .cs , pod .Name , l .ns .Name , eventSelector , msg , framework .PodStartTimeout )
268
+ // Events are unreliable, don't depend on them. They're used only to speed up the test.
269
+ if err != nil {
270
+ e2elog .Logf ("Warning: did not get event about mismatched volume use" )
271
+ }
272
+
273
+ // Check the pod is still not running
274
+ p , err := l .cs .CoreV1 ().Pods (l .ns .Name ).Get (pod .Name , metav1.GetOptions {})
275
+ framework .ExpectNoError (err , "could not re-read the pod after event (or timeout)" )
276
+ framework .ExpectEqual (p .Status .Phase , v1 .PodPending )
254
277
})
255
278
256
279
}
0 commit comments