summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go')
-rw-r--r--vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go b/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go
index 46e707a7f..361b29d69 100644
--- a/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go
+++ b/vendor/k8s.io/kubernetes/test/e2e/scheduling/predicates.go
@@ -38,6 +38,7 @@ import (
e2enode "k8s.io/kubernetes/test/e2e/framework/node"
e2eruntimeclass "k8s.io/kubernetes/test/e2e/framework/node/runtimeclass"
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
+ e2epv "k8s.io/kubernetes/test/e2e/framework/pv"
e2erc "k8s.io/kubernetes/test/e2e/framework/rc"
e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper"
testutils "k8s.io/kubernetes/test/utils"
@@ -855,6 +856,78 @@ var _ = SIGDescribe("SchedulerPredicates [Serial]", func() {
ginkgo.By("Expect all pods are scheduled and running")
framework.ExpectNoError(e2epod.WaitForPodsRunning(cs, ns, replicas, time.Minute))
})
+
+ // Regression test for an extended scenario for https://issues.k8s.io/123465
+ ginkgo.It("when PVC has node-affinity to non-existent/illegal nodes, the pod should be scheduled normally if suitable nodes exist", func(ctx context.Context) {
+ nodeName := GetNodeThatCanRunPod(ctx, f)
+ nonExistentNodeName1 := string(uuid.NewUUID())
+ nonExistentNodeName2 := string(uuid.NewUUID())
+ hostLabel := "kubernetes.io/hostname"
+ localPath := "/tmp"
+ podName := "bind-pv-with-non-existent-nodes"
+ pvcName := "pvc-" + string(uuid.NewUUID())
+ _, pvc, err := e2epv.CreatePVPVC(ctx, cs, f.Timeouts, e2epv.PersistentVolumeConfig{
+ PVSource: v1.PersistentVolumeSource{
+ Local: &v1.LocalVolumeSource{
+ Path: localPath,
+ },
+ },
+ Prebind: &v1.PersistentVolumeClaim{
+ ObjectMeta: metav1.ObjectMeta{Name: pvcName, Namespace: ns},
+ },
+ NodeAffinity: &v1.VolumeNodeAffinity{
+ Required: &v1.NodeSelector{
+ NodeSelectorTerms: []v1.NodeSelectorTerm{
+ {
+ MatchExpressions: []v1.NodeSelectorRequirement{
+ {
+ Key: hostLabel,
+ Operator: v1.NodeSelectorOpIn,
+ // add non-existent nodes to the list
+ Values: []string{nodeName, nonExistentNodeName1, nonExistentNodeName2},
+ },
+ },
+ },
+ },
+ },
+ },
+ }, e2epv.PersistentVolumeClaimConfig{
+ Name: pvcName,
+ }, ns, true)
+ framework.ExpectNoError(err)
+ bindPvPod := &v1.Pod{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: podName,
+ },
+ Spec: v1.PodSpec{
+ Containers: []v1.Container{
+ {
+ Name: "pause",
+ Image: imageutils.GetE2EImage(imageutils.Pause),
+ VolumeMounts: []v1.VolumeMount{
+ {
+ Name: "data",
+ MountPath: "/tmp",
+ },
+ },
+ },
+ },
+ Volumes: []v1.Volume{
+ {
+ Name: "data",
+ VolumeSource: v1.VolumeSource{
+ PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
+ ClaimName: pvc.Name,
+ },
+ },
+ },
+ },
+ },
+ }
+ _, err = f.ClientSet.CoreV1().Pods(ns).Create(ctx, bindPvPod, metav1.CreateOptions{})
+ framework.ExpectNoError(err)
+ framework.ExpectNoError(e2epod.WaitForPodNotPending(ctx, f.ClientSet, ns, podName))
+ })
})
func patchPod(cs clientset.Interface, old, new *v1.Pod) (*v1.Pod, error) {