func ExemptedFromPreemption()

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
}