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:
Zach Loafman 2016-10-31 15:50:11 -07:00
parent e6b2517feb
commit 155a601425
3 changed files with 40 additions and 3 deletions

View File

@ -80,6 +80,8 @@ go_library(
"//pkg/util/yaml:go_default_library",
"//pkg/version: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/perftype:go_default_library",
"//test/utils:go_default_library",

View File

@ -316,7 +316,9 @@ func (config *NetworkingTestConfig) createNetShellPodSpec(podName string, node s
ReadinessProbe: probe,
},
},
NodeName: node,
NodeSelector: map[string]string{
"kubernetes.io/hostname": node,
},
},
}
return pod

View File

@ -47,6 +47,7 @@ import (
apierrs "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/extensions"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
@ -76,6 +77,8 @@ import (
utilyaml "k8s.io/kubernetes/pkg/util/yaml"
"k8s.io/kubernetes/pkg/version"
"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"
"github.com/blang/semver"
@ -2355,6 +2358,36 @@ func isNodeSchedulable(node *api.Node) bool {
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.
// 1) Needs to be schedulable.
// 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
// 'Not Ready' nodes, just in case (there is no need to fail the test).
FilterNodes(nodes, func(node api.Node) bool {
return isNodeSchedulable(&node)
return isNodeSchedulable(&node) && isNodeUntainted(&node)
})
return nodes
}
@ -4447,7 +4480,7 @@ func GetMasterAndWorkerNodesOrDie(c clientset.Interface) (sets.String, *api.Node
for _, n := range all.Items {
if system.IsMasterNode(&n) {
masters.Insert(n.Name)
} else if isNodeSchedulable(&n) {
} else if isNodeSchedulable(&n) && isNodeUntainted(&n) {
nodes.Items = append(nodes.Items, n)
}
}