mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
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:
parent
e6b2517feb
commit
155a601425
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user