diff --git a/pkg/scheduler/algorithm/predicates/metadata.go b/pkg/scheduler/algorithm/predicates/metadata.go index c9d36003dde..2b5111c6f69 100644 --- a/pkg/scheduler/algorithm/predicates/metadata.go +++ b/pkg/scheduler/algorithm/predicates/metadata.go @@ -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 } diff --git a/pkg/scheduler/algorithm/predicates/predicates.go b/pkg/scheduler/algorithm/predicates/predicates.go index 059c11220a6..6e265b14b59 100644 --- a/pkg/scheduler/algorithm/predicates/predicates.go +++ b/pkg/scheduler/algorithm/predicates/predicates.go @@ -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 diff --git a/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go b/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go index 99225669b16..8db66cf904c 100644 --- a/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go +++ b/pkg/scheduler/algorithm/priorities/even_pods_spread_test.go @@ -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},