EvenPodsSpread: Make some funcs in predicates pkg as public

This commit is contained in:
Wei Huang 2019-05-10 23:54:36 -07:00
parent f25cc921e1
commit 821446ed70
No known key found for this signature in database
GPG Key ID: BE5E9752F8B6E005
3 changed files with 101 additions and 101 deletions

View File

@ -229,12 +229,12 @@ func getTPMapMatchingSpreadConstraints(pod *v1.Pod, nodeInfoMap map[string]*sche
}
// In accordance to design, if NodeAffinity or NodeSelector is defined,
// spreading is applied to nodes that pass those filters.
if !podMatchesNodeSelectorAndAffinityTerms(pod, node) {
if !PodMatchesNodeSelectorAndAffinityTerms(pod, node) {
return
}
// Ensure current node's labels contains all topologyKeys in 'constraints'.
if !nodeLabelsMatchSpreadConstraints(node.Labels, constraints) {
if !NodeLabelsMatchSpreadConstraints(node.Labels, constraints) {
return
}
nodeTopologyMaps := newTopologyPairsMaps()
@ -319,7 +319,7 @@ func podMatchesSpreadConstraint(podLabelSet labels.Set, constraint v1.TopologySp
}
// check if ALL topology keys in spread constraints are present in node labels
func nodeLabelsMatchSpreadConstraints(nodeLabels map[string]string, constraints []v1.TopologySpreadConstraint) bool {
func NodeLabelsMatchSpreadConstraints(nodeLabels map[string]string, constraints []v1.TopologySpreadConstraint) bool {
for _, constraint := range constraints {
if _, ok := nodeLabels[constraint.TopologyKey]; !ok {
return false
@ -388,7 +388,7 @@ func (m *topologyPairsPodSpreadMap) addPod(addedPod, preemptorPod *v1.Pod, node
return nil
}
constraints := getHardTopologySpreadConstraints(preemptorPod)
if !nodeLabelsMatchSpreadConstraints(node.Labels, constraints) {
if !NodeLabelsMatchSpreadConstraints(node.Labels, constraints) {
return nil
}

View File

@ -853,9 +853,9 @@ func nodeMatchesNodeSelectorTerms(node *v1.Node, nodeSelectorTerms []v1.NodeSele
return v1helper.MatchNodeSelectorTerms(nodeSelectorTerms, labels.Set(node.Labels), fields.Set(nodeFields))
}
// podMatchesNodeSelectorAndAffinityTerms checks whether the pod is schedulable onto nodes according to
// PodMatchesNodeSelectorAndAffinityTerms checks whether the pod is schedulable onto nodes according to
// the requirements in both NodeAffinity and nodeSelector.
func podMatchesNodeSelectorAndAffinityTerms(pod *v1.Pod, node *v1.Node) bool {
func PodMatchesNodeSelectorAndAffinityTerms(pod *v1.Pod, node *v1.Node) bool {
// Check if node.Labels match pod.Spec.NodeSelector.
if len(pod.Spec.NodeSelector) > 0 {
selector := labels.SelectorFromSet(pod.Spec.NodeSelector)
@ -906,7 +906,7 @@ func PodMatchNodeSelector(pod *v1.Pod, meta PredicateMetadata, nodeInfo *schedul
if node == nil {
return false, nil, fmt.Errorf("node not found")
}
if podMatchesNodeSelectorAndAffinityTerms(pod, node) {
if PodMatchesNodeSelectorAndAffinityTerms(pod, node) {
return true, nil, nil
}
return false, []PredicateFailureReason{ErrNodeSelectorNotMatch}, nil

View File

@ -23,7 +23,7 @@ import (
"k8s.io/api/core/v1"
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
u "k8s.io/kubernetes/pkg/scheduler/util"
st "k8s.io/kubernetes/pkg/scheduler/testing"
)
func Test_topologySpreadConstrantsMap_initialize(t *testing.T) {
@ -35,14 +35,14 @@ func Test_topologySpreadConstrantsMap_initialize(t *testing.T) {
}{
{
name: "normal case",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "zone", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(),
u.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(),
st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(),
},
want: map[topologyPair][]string{
{key: "zone", value: "zone1"}: {"node-a", "node-b"},
@ -83,12 +83,12 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
{
// if there is only one candidate node, it should be scored to 10
name: "one constraint on node, no existing pods",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
},
want: []schedulerapi.HostPriority{
{Host: "node-a", Score: 10},
@ -98,19 +98,19 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
{
// if there is only one candidate node, it should be scored to 10
name: "one constraint on node, only one node is candidate",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
existingPods: []*v1.Pod{
u.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
},
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
},
failedNodes: []*v1.Node{
u.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
},
want: []schedulerapi.HostPriority{
{Host: "node-a", Score: 10},
@ -121,22 +121,22 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
// after reversing, it's 4/5/6/3
// so scores = 40/6, 50/6, 60/6, 30/6
name: "one constraint on node, all 4 nodes are candidates",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
existingPods: []*v1.Pod{
u.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-d1").Node("node-d").Label("foo", "").Obj(),
u.MakePod().Name("p-d2").Node("node-d").Label("foo", "").Obj(),
u.MakePod().Name("p-d3").Node("node-d").Label("foo", "").Obj(),
st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-d1").Node("node-d").Label("foo", "").Obj(),
st.MakePod().Name("p-d2").Node("node-d").Label("foo", "").Obj(),
st.MakePod().Name("p-d3").Node("node-d").Label("foo", "").Obj(),
},
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
u.MakeNode().Name("node-c").Label("node", "node-c").Obj(),
u.MakeNode().Name("node-d").Label("node", "node-d").Obj(),
st.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-c").Label("node", "node-c").Obj(),
st.MakeNode().Name("node-d").Label("node", "node-d").Obj(),
},
failedNodes: []*v1.Node{},
want: []schedulerapi.HostPriority{
@ -151,28 +151,28 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
// after reversing, it's 3/5/6
// so scores = 30/6, 50/6, 60/6
name: "one constraint on node, 3 out of 4 nodes are candidates",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
existingPods: []*v1.Pod{
u.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a3").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a4").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
u.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a3").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a4").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
st.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
},
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
u.MakeNode().Name("node-x").Label("node", "node-x").Obj(),
st.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-b").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-x").Label("node", "node-x").Obj(),
},
failedNodes: []*v1.Node{
u.MakeNode().Name("node-y").Label("node", "node-y").Obj(),
st.MakeNode().Name("node-y").Label("node", "node-y").Obj(),
},
want: []schedulerapi.HostPriority{
{Host: "node-a", Score: 5},
@ -185,28 +185,28 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
// after reversing, it's 1/?/4
// so scores = 10/4, 0, 40/4
name: "one constraint on node, 3 out of 4 nodes are candidates",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
existingPods: []*v1.Pod{
u.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a3").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a4").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
u.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a3").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a4").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
st.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
},
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-b").Label("n", "node-b").Obj(), // label `n` doesn't match topologyKey
u.MakeNode().Name("node-x").Label("node", "node-x").Obj(),
st.MakeNode().Name("node-a").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-b").Label("n", "node-b").Obj(), // label `n` doesn't match topologyKey
st.MakeNode().Name("node-x").Label("node", "node-x").Obj(),
},
failedNodes: []*v1.Node{
u.MakeNode().Name("node-y").Label("node", "node-y").Obj(),
st.MakeNode().Name("node-y").Label("node", "node-y").Obj(),
},
want: []schedulerapi.HostPriority{
{Host: "node-a", Score: 2},
@ -219,28 +219,28 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
// after reversing, it's 10/10/12
// so scores = 100/12, 100/12, 120/12
name: "one constraint on zone, 3 out of 4 nodes are candidates",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "zone", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
existingPods: []*v1.Pod{
u.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a3").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a4").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
u.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a3").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a4").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-b2").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
st.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
},
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(),
u.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(),
st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(),
},
failedNodes: []*v1.Node{
u.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(),
st.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(),
},
want: []schedulerapi.HostPriority{
{Host: "node-a", Score: 8},
@ -253,28 +253,28 @@ func TestCalculateEvenPodsSpreadPriority(t *testing.T) {
// after reversing, it's 8/5
// so scores = 80/8, 50/8
name: "two constraint on zone and node, 2 out of 4 nodes are candidates",
pod: u.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "zone", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
SpreadConstraint(1, "node", softSpread, u.MakeLabelSelector().Exists("foo").Obj()).
pod: st.MakePod().Name("p").Label("foo", "").
SpreadConstraint(1, "zone", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
SpreadConstraint(1, "node", softSpread, st.MakeLabelSelector().Exists("foo").Obj()).
Obj(),
existingPods: []*v1.Pod{
u.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
u.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
u.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
u.MakePod().Name("p-x2").Node("node-x").Label("foo", "").Obj(),
u.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
u.MakePod().Name("p-y4").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-a1").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-a2").Node("node-a").Label("foo", "").Obj(),
st.MakePod().Name("p-b1").Node("node-b").Label("foo", "").Obj(),
st.MakePod().Name("p-x1").Node("node-x").Label("foo", "").Obj(),
st.MakePod().Name("p-x2").Node("node-x").Label("foo", "").Obj(),
st.MakePod().Name("p-y1").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y2").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y3").Node("node-y").Label("foo", "").Obj(),
st.MakePod().Name("p-y4").Node("node-y").Label("foo", "").Obj(),
},
nodes: []*v1.Node{
u.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(),
u.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(),
st.MakeNode().Name("node-a").Label("zone", "zone1").Label("node", "node-a").Obj(),
st.MakeNode().Name("node-x").Label("zone", "zone2").Label("node", "node-x").Obj(),
},
failedNodes: []*v1.Node{
u.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(),
u.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(),
st.MakeNode().Name("node-b").Label("zone", "zone1").Label("node", "node-b").Obj(),
st.MakeNode().Name("node-y").Label("zone", "zone2").Label("node", "node-y").Obj(),
},
want: []schedulerapi.HostPriority{
{Host: "node-a", Score: 10},