in pkg/preemptiontoleration/preemption_toleration.go [127:177]
func ExemptedFromPreemption(
victimCandidate, preemptor *v1.Pod,
pcLister schedulinglisters.PriorityClassLister,
now time.Time,
) (bool, error) {
if victimCandidate.Spec.PriorityClassName == "" {
return false, nil
}
victimPriorityClass, err := pcLister.Get(victimCandidate.Spec.PriorityClassName)
if err != nil {
return false, err
}
preemptorPreemptionPolicy := v1.PreemptLowerPriority
if preemptor.Spec.PreemptionPolicy != nil {
preemptorPreemptionPolicy = *preemptor.Spec.PreemptionPolicy
}
if preemptorPreemptionPolicy == v1.PreemptNever {
return true, nil
}
// check it can tolerate the preemption in terms of priority value
policy, err := parsePreemptionTolerationPolicy(*victimPriorityClass)
if err != nil {
// if any error raised, no toleration at all
klog.ErrorS(err, "Failed to parse preemption toleration policy of victim candidate's priorityclass. This victim candidate can't tolerate the preemption",
"PreemptorPod", klog.KObj(preemptor),
"VictimCandidatePod", klog.KObj(victimCandidate),
"VictimCandidatePriorityClass", klog.KRef("", victimPriorityClass.Name),
)
return false, nil
}
preemptorPriority := corev1helpers.PodPriority(preemptor)
if preemptorPriority >= policy.MinimumPreemptablePriority {
return false, nil
}
if policy.TolerationSeconds < 0 {
return true, nil
}
// check it can tolerate the preemption in terms of toleration seconds
_, scheduledCondition := podutil.GetPodCondition(&victimCandidate.Status, v1.PodScheduled)
if scheduledCondition == nil || scheduledCondition.Status != v1.ConditionTrue {
return true, nil
}
scheduledAt := scheduledCondition.LastTransitionTime.Time
tolerationDuration := time.Duration(policy.TolerationSeconds) * time.Second
return scheduledAt.Add(tolerationDuration).After(now), nil
}