karmada/pkg/util/resource.go

80 lines
2.0 KiB
Go

package util
import corev1 "k8s.io/api/core/v1"
// Resource is a collection of compute resource.
type Resource struct {
MilliCPU int64
Memory int64
}
// EmptyResource creates a empty resource object and returns.
func EmptyResource() *Resource {
return &Resource{}
}
// Add is used to add two resources.
func (r *Resource) Add(rl corev1.ResourceList) {
if r == nil {
return
}
for rName, rQuant := range rl {
switch rName {
case corev1.ResourceCPU:
r.MilliCPU += rQuant.MilliValue()
case corev1.ResourceMemory:
r.Memory += rQuant.Value()
default:
continue
}
}
}
// SetMaxResource compares with ResourceList and takes max value for each Resource.
func (r *Resource) SetMaxResource(rl corev1.ResourceList) {
if r == nil {
return
}
for rName, rQuant := range rl {
switch rName {
case corev1.ResourceCPU:
if cpu := rQuant.MilliValue(); cpu > r.MilliCPU {
r.MilliCPU = cpu
}
case corev1.ResourceMemory:
if mem := rQuant.Value(); mem > r.Memory {
r.Memory = mem
}
default:
continue
}
}
}
// CalculateRequestResourceWithoutInitContainers returns Pod's resource request, it does not contain
// init containers' resource request.
func CalculateRequestResourceWithoutInitContainers(pod *corev1.Pod) *Resource {
result := EmptyResource()
for _, container := range pod.Spec.Containers {
result.Add(container.Resources.Requests)
}
return result
}
// CalculateRequestResource calculates the resource required for pod, that is the higher of:
// - the sum of all app containers(spec.Containers) request for a resource.
// - the effective init containers(spec.InitContainers) request for a resource.
// The effective init containers request is the highest request on all init containers.
func CalculateRequestResource(pod *corev1.Pod) *Resource {
result := CalculateRequestResourceWithoutInitContainers(pod)
for _, container := range pod.Spec.InitContainers {
result.SetMaxResource(container.Resources.Requests)
}
return result
}