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/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",

View File

@ -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

View File

@ -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)
} }
} }