func getTolerationListFromPod(pod *api.Pod) ([]api.Toleration, error) { tolerations, err := api.GetTolerationsFromPodAnnotations(pod.Annotations) if err != nil { return nil, err } return getAllTolerationPreferNoSchedule(tolerations), nil }
// ComputeTaintTolerationPriority prepares the priority list for all the nodes based on the number of intolerable taints on the node func ComputeTaintTolerationPriority(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.NodeInfo, nodeLister algorithm.NodeLister) (schedulerapi.HostPriorityList, error) { nodes, err := nodeLister.List() if err != nil { return nil, err } // the max value of counts var maxCount float64 // counts hold the count of intolerable taints of a pod for a given node counts := make(map[string]float64, len(nodes)) tolerations, err := api.GetTolerationsFromPodAnnotations(pod.Annotations) if err != nil { return nil, err } // Fetch a list of all toleration with effect PreferNoSchedule tolerationList := getAllTolerationPreferNoSchedule(tolerations) // calculate the intolerable taints for all the nodes for _, node := range nodes { taints, err := api.GetTaintsFromNodeAnnotations(node.Annotations) if err != nil { return nil, err } count := countIntolerableTaintsPreferNoSchedule(taints, tolerationList) if count > 0 { // 0 is default value, so avoid unnecessary map operations. counts[node.Name] = count if count > maxCount { maxCount = count } } } // The maximum priority value to give to a node // Priority values range from 0 - maxPriority const maxPriority = float64(10) result := make(schedulerapi.HostPriorityList, 0, len(nodes)) for _, node := range nodes { fScore := maxPriority if maxCount > 0 { fScore = (1.0 - counts[node.Name]/maxCount) * 10 } if glog.V(10) { // We explicitly don't do glog.V(10).Infof() to avoid computing all the parameters if this is // not logged. There is visible performance gain from it. glog.Infof("%v -> %v: Taint Toleration Priority, Score: (%d)", pod.Name, node.Name, int(fScore)) } result = append(result, schedulerapi.HostPriority{Host: node.Name, Score: int(fScore)}) } return result, nil }
// ComputeTaintTolerationPriority prepares the priority list for all the nodes based on the number of intolerable taints on the node func (s *TaintToleration) ComputeTaintTolerationPriority(pod *api.Pod, nodeNameToInfo map[string]*schedulercache.NodeInfo, nodeLister algorithm.NodeLister) (schedulerapi.HostPriorityList, error) { // counts hold the count of intolerable taints of a pod for a given node counts := make(map[string]int) // the max value of counts var maxCount int nodes, err := nodeLister.List() if err != nil { return nil, err } tolerations, err := api.GetTolerationsFromPodAnnotations(pod.Annotations) if err != nil { return nil, err } // Fetch a list of all toleration with effect PreferNoSchedule tolerationList := getAllTolerationPreferNoSchedule(tolerations) // calculate the intolerable taints for all the nodes for i := range nodes.Items { node := &nodes.Items[i] taints, err := api.GetTaintsFromNodeAnnotations(node.Annotations) if err != nil { return nil, err } count := countIntolerableTaintsPreferNoSchedule(taints, tolerationList) counts[node.Name] = count if count > maxCount { maxCount = count } } // The maximum priority value to give to a node // Priority values range from 0 - maxPriority const maxPriority = 10 result := make(schedulerapi.HostPriorityList, 0, len(nodes.Items)) for _, node := range nodes.Items { fScore := float64(maxPriority) if maxCount > 0 { fScore = (1.0 - float64(counts[node.Name])/float64(maxCount)) * 10 } glog.V(10).Infof("%v -> %v: Taint Toleration Priority, Score: (%d)", pod.Name, node.Name, int(fScore)) result = append(result, schedulerapi.HostPriority{Host: node.Name, Score: int(fScore)}) } return result, nil }
func (t *TolerationMatch) PodToleratesNodeTaints(pod *api.Pod, nodeInfo *schedulercache.NodeInfo) (bool, error) { node := nodeInfo.Node() taints, err := api.GetTaintsFromNodeAnnotations(node.Annotations) if err != nil { return false, err } tolerations, err := api.GetTolerationsFromPodAnnotations(pod.Annotations) if err != nil { return false, err } if tolerationsToleratesTaints(tolerations, taints) { return true, nil } return false, ErrTaintsTolerationsNotMatch }
func PodToleratesNodeTaints(pod *api.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, error) { node := nodeInfo.Node() if node == nil { return false, fmt.Errorf("node not found") } taints, err := api.GetTaintsFromNodeAnnotations(node.Annotations) if err != nil { return false, err } tolerations, err := api.GetTolerationsFromPodAnnotations(pod.Annotations) if err != nil { return false, err } if tolerationsToleratesTaints(tolerations, taints) { return true, nil } return false, ErrTaintsTolerationsNotMatch }