e2e: Fix GetReadySchedulableNodesOrDie for taints
This changes framework.GetReadySchedulableNodesOrDie and framework.GetMasterAndWorkerNodesOrDie so that nodes that can't take a generic fake pod due to a taint/toleration mismatch aren't returned. This is a rehash of #35210, but pulls in the scheduler code.
This commit is contained in:
		@@ -80,6 +80,8 @@ go_library(
 | 
				
			|||||||
        "//pkg/util/yaml:go_default_library",
 | 
					        "//pkg/util/yaml:go_default_library",
 | 
				
			||||||
        "//pkg/version:go_default_library",
 | 
					        "//pkg/version:go_default_library",
 | 
				
			||||||
        "//pkg/watch:go_default_library",
 | 
					        "//pkg/watch:go_default_library",
 | 
				
			||||||
 | 
					        "//plugin/pkg/scheduler/algorithm/predicates:go_default_library",
 | 
				
			||||||
 | 
					        "//plugin/pkg/scheduler/schedulercache:go_default_library",
 | 
				
			||||||
        "//test/e2e/generated:go_default_library",
 | 
					        "//test/e2e/generated:go_default_library",
 | 
				
			||||||
        "//test/e2e/perftype:go_default_library",
 | 
					        "//test/e2e/perftype:go_default_library",
 | 
				
			||||||
        "//test/utils:go_default_library",
 | 
					        "//test/utils:go_default_library",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -316,7 +316,9 @@ func (config *NetworkingTestConfig) createNetShellPodSpec(podName string, node s
 | 
				
			|||||||
					ReadinessProbe: probe,
 | 
										ReadinessProbe: probe,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			NodeName: node,
 | 
								NodeSelector: map[string]string{
 | 
				
			||||||
 | 
									"kubernetes.io/hostname": node,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return pod
 | 
						return pod
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,7 @@ import (
 | 
				
			|||||||
	apierrs "k8s.io/kubernetes/pkg/api/errors"
 | 
						apierrs "k8s.io/kubernetes/pkg/api/errors"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/unversioned"
 | 
						"k8s.io/kubernetes/pkg/api/unversioned"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/api/v1"
 | 
						"k8s.io/kubernetes/pkg/api/v1"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/pkg/apimachinery/registered"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/apis/extensions"
 | 
						"k8s.io/kubernetes/pkg/apis/extensions"
 | 
				
			||||||
	clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
 | 
						clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
 | 
						"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
 | 
				
			||||||
@@ -76,6 +77,8 @@ import (
 | 
				
			|||||||
	utilyaml "k8s.io/kubernetes/pkg/util/yaml"
 | 
						utilyaml "k8s.io/kubernetes/pkg/util/yaml"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/version"
 | 
						"k8s.io/kubernetes/pkg/version"
 | 
				
			||||||
	"k8s.io/kubernetes/pkg/watch"
 | 
						"k8s.io/kubernetes/pkg/watch"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates"
 | 
				
			||||||
 | 
						"k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache"
 | 
				
			||||||
	testutils "k8s.io/kubernetes/test/utils"
 | 
						testutils "k8s.io/kubernetes/test/utils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/blang/semver"
 | 
						"github.com/blang/semver"
 | 
				
			||||||
@@ -2355,6 +2358,36 @@ func isNodeSchedulable(node *api.Node) bool {
 | 
				
			|||||||
	return !node.Spec.Unschedulable && nodeReady && networkReady
 | 
						return !node.Spec.Unschedulable && nodeReady && networkReady
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Test whether a fake pod can be scheduled on "node", given its current taints.
 | 
				
			||||||
 | 
					func isNodeUntainted(node *api.Node) bool {
 | 
				
			||||||
 | 
						fakePod := &api.Pod{
 | 
				
			||||||
 | 
							TypeMeta: unversioned.TypeMeta{
 | 
				
			||||||
 | 
								Kind:       "Pod",
 | 
				
			||||||
 | 
								APIVersion: registered.GroupOrDie(api.GroupName).GroupVersion.String(),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							ObjectMeta: api.ObjectMeta{
 | 
				
			||||||
 | 
								Name:      "fake-not-scheduled",
 | 
				
			||||||
 | 
								Namespace: "fake-not-scheduled",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Spec: api.PodSpec{
 | 
				
			||||||
 | 
								Containers: []api.Container{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										Name:  "fake-not-scheduled",
 | 
				
			||||||
 | 
										Image: "fake-not-scheduled",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						nodeInfo := schedulercache.NewNodeInfo()
 | 
				
			||||||
 | 
						nodeInfo.SetNode(node)
 | 
				
			||||||
 | 
						fit, _, err := predicates.PodToleratesNodeTaints(fakePod, nil, nodeInfo)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							Failf("Can't test predicates for node %s: %v", node.Name, err)
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetReadySchedulableNodesOrDie addresses the common use case of getting nodes you can do work on.
 | 
					// GetReadySchedulableNodesOrDie addresses the common use case of getting nodes you can do work on.
 | 
				
			||||||
// 1) Needs to be schedulable.
 | 
					// 1) Needs to be schedulable.
 | 
				
			||||||
// 2) Needs to be ready.
 | 
					// 2) Needs to be ready.
 | 
				
			||||||
@@ -2364,7 +2397,7 @@ func GetReadySchedulableNodesOrDie(c clientset.Interface) (nodes *api.NodeList)
 | 
				
			|||||||
	// previous tests may have cause failures of some nodes. Let's skip
 | 
						// previous tests may have cause failures of some nodes. Let's skip
 | 
				
			||||||
	// 'Not Ready' nodes, just in case (there is no need to fail the test).
 | 
						// 'Not Ready' nodes, just in case (there is no need to fail the test).
 | 
				
			||||||
	FilterNodes(nodes, func(node api.Node) bool {
 | 
						FilterNodes(nodes, func(node api.Node) bool {
 | 
				
			||||||
		return isNodeSchedulable(&node)
 | 
							return isNodeSchedulable(&node) && isNodeUntainted(&node)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	return nodes
 | 
						return nodes
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -4447,7 +4480,7 @@ func GetMasterAndWorkerNodesOrDie(c clientset.Interface) (sets.String, *api.Node
 | 
				
			|||||||
	for _, n := range all.Items {
 | 
						for _, n := range all.Items {
 | 
				
			||||||
		if system.IsMasterNode(&n) {
 | 
							if system.IsMasterNode(&n) {
 | 
				
			||||||
			masters.Insert(n.Name)
 | 
								masters.Insert(n.Name)
 | 
				
			||||||
		} else if isNodeSchedulable(&n) {
 | 
							} else if isNodeSchedulable(&n) && isNodeUntainted(&n) {
 | 
				
			||||||
			nodes.Items = append(nodes.Items, n)
 | 
								nodes.Items = append(nodes.Items, n)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user