1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*
- Copyright 2016 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package priorities
- import (
- "fmt"
- "k8s.io/api/core/v1"
- v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
- schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
- schedulernodeinfo "k8s.io/kubernetes/pkg/scheduler/nodeinfo"
- )
- // CountIntolerableTaintsPreferNoSchedule gives the count of intolerable taints of a pod with effect PreferNoSchedule
- func countIntolerableTaintsPreferNoSchedule(taints []v1.Taint, tolerations []v1.Toleration) (intolerableTaints int) {
- for _, taint := range taints {
- // check only on taints that have effect PreferNoSchedule
- if taint.Effect != v1.TaintEffectPreferNoSchedule {
- continue
- }
- if !v1helper.TolerationsTolerateTaint(tolerations, &taint) {
- intolerableTaints++
- }
- }
- return
- }
- // getAllTolerationEffectPreferNoSchedule gets the list of all Tolerations with Effect PreferNoSchedule or with no effect.
- func getAllTolerationPreferNoSchedule(tolerations []v1.Toleration) (tolerationList []v1.Toleration) {
- for _, toleration := range tolerations {
- // Empty effect means all effects which includes PreferNoSchedule, so we need to collect it as well.
- if len(toleration.Effect) == 0 || toleration.Effect == v1.TaintEffectPreferNoSchedule {
- tolerationList = append(tolerationList, toleration)
- }
- }
- return
- }
- // ComputeTaintTolerationPriorityMap prepares the priority list for all the nodes based on the number of intolerable taints on the node
- func ComputeTaintTolerationPriorityMap(pod *v1.Pod, meta interface{}, nodeInfo *schedulernodeinfo.NodeInfo) (schedulerapi.HostPriority, error) {
- node := nodeInfo.Node()
- if node == nil {
- return schedulerapi.HostPriority{}, fmt.Errorf("node not found")
- }
- // To hold all the tolerations with Effect PreferNoSchedule
- var tolerationsPreferNoSchedule []v1.Toleration
- if priorityMeta, ok := meta.(*priorityMetadata); ok {
- tolerationsPreferNoSchedule = priorityMeta.podTolerations
- } else {
- tolerationsPreferNoSchedule = getAllTolerationPreferNoSchedule(pod.Spec.Tolerations)
- }
- return schedulerapi.HostPriority{
- Host: node.Name,
- Score: countIntolerableTaintsPreferNoSchedule(node.Spec.Taints, tolerationsPreferNoSchedule),
- }, nil
- }
- // ComputeTaintTolerationPriorityReduce calculates the source of each node based on the number of intolerable taints on the node
- var ComputeTaintTolerationPriorityReduce = NormalizeReduce(schedulerapi.MaxPriority, true)
|