mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 05:40:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2017 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 util
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| 
 | |
| 	v1 "k8s.io/api/core/v1"
 | |
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | |
| 	"k8s.io/klog"
 | |
| 	extenderv1 "k8s.io/kube-scheduler/extender/v1"
 | |
| 	podutil "k8s.io/kubernetes/pkg/api/v1/pod"
 | |
| )
 | |
| 
 | |
| // GetPodFullName returns a name that uniquely identifies a pod.
 | |
| func GetPodFullName(pod *v1.Pod) string {
 | |
| 	// Use underscore as the delimiter because it is not allowed in pod name
 | |
| 	// (DNS subdomain format).
 | |
| 	return pod.Name + "_" + pod.Namespace
 | |
| }
 | |
| 
 | |
| // GetPodStartTime returns start time of the given pod or current timestamp
 | |
| // if it hasn't started yet.
 | |
| func GetPodStartTime(pod *v1.Pod) *metav1.Time {
 | |
| 	if pod.Status.StartTime != nil {
 | |
| 		return pod.Status.StartTime
 | |
| 	}
 | |
| 	// Assumed pods and bound pods that haven't started don't have a StartTime yet.
 | |
| 	return &metav1.Time{Time: time.Now()}
 | |
| }
 | |
| 
 | |
| // GetEarliestPodStartTime returns the earliest start time of all pods that
 | |
| // have the highest priority among all victims.
 | |
| func GetEarliestPodStartTime(victims *extenderv1.Victims) *metav1.Time {
 | |
| 	if len(victims.Pods) == 0 {
 | |
| 		// should not reach here.
 | |
| 		klog.Errorf("victims.Pods is empty. Should not reach here.")
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	earliestPodStartTime := GetPodStartTime(victims.Pods[0])
 | |
| 	maxPriority := podutil.GetPodPriority(victims.Pods[0])
 | |
| 
 | |
| 	for _, pod := range victims.Pods {
 | |
| 		if podutil.GetPodPriority(pod) == maxPriority {
 | |
| 			if GetPodStartTime(pod).Before(earliestPodStartTime) {
 | |
| 				earliestPodStartTime = GetPodStartTime(pod)
 | |
| 			}
 | |
| 		} else if podutil.GetPodPriority(pod) > maxPriority {
 | |
| 			maxPriority = podutil.GetPodPriority(pod)
 | |
| 			earliestPodStartTime = GetPodStartTime(pod)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return earliestPodStartTime
 | |
| }
 | |
| 
 | |
| // MoreImportantPod return true when priority of the first pod is higher than
 | |
| // the second one. If two pods' priorities are equal, compare their StartTime.
 | |
| // It takes arguments of the type "interface{}" to be used with SortableList,
 | |
| // but expects those arguments to be *v1.Pod.
 | |
| func MoreImportantPod(pod1, pod2 *v1.Pod) bool {
 | |
| 	p1 := podutil.GetPodPriority(pod1)
 | |
| 	p2 := podutil.GetPodPriority(pod2)
 | |
| 	if p1 != p2 {
 | |
| 		return p1 > p2
 | |
| 	}
 | |
| 	return GetPodStartTime(pod1).Before(GetPodStartTime(pod2))
 | |
| }
 | |
| 
 | |
| // GetPodAffinityTerms gets pod affinity terms by a pod affinity object.
 | |
| func GetPodAffinityTerms(podAffinity *v1.PodAffinity) (terms []v1.PodAffinityTerm) {
 | |
| 	if podAffinity != nil {
 | |
| 		if len(podAffinity.RequiredDuringSchedulingIgnoredDuringExecution) != 0 {
 | |
| 			terms = podAffinity.RequiredDuringSchedulingIgnoredDuringExecution
 | |
| 		}
 | |
| 		// TODO: Uncomment this block when implement RequiredDuringSchedulingRequiredDuringExecution.
 | |
| 		//if len(podAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 {
 | |
| 		//	terms = append(terms, podAffinity.RequiredDuringSchedulingRequiredDuringExecution...)
 | |
| 		//}
 | |
| 	}
 | |
| 	return terms
 | |
| }
 | |
| 
 | |
| // GetPodAntiAffinityTerms gets pod affinity terms by a pod anti-affinity.
 | |
| func GetPodAntiAffinityTerms(podAntiAffinity *v1.PodAntiAffinity) (terms []v1.PodAffinityTerm) {
 | |
| 	if podAntiAffinity != nil {
 | |
| 		if len(podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution) != 0 {
 | |
| 			terms = podAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution
 | |
| 		}
 | |
| 		// TODO: Uncomment this block when implement RequiredDuringSchedulingRequiredDuringExecution.
 | |
| 		//if len(podAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution) != 0 {
 | |
| 		//	terms = append(terms, podAntiAffinity.RequiredDuringSchedulingRequiredDuringExecution...)
 | |
| 		//}
 | |
| 	}
 | |
| 	return terms
 | |
| }
 |