diff --git a/pkg/scheduler/api/resource_info.go b/pkg/scheduler/api/resource_info.go index 3ed71380f75..f63ccba5bb2 100644 --- a/pkg/scheduler/api/resource_info.go +++ b/pkg/scheduler/api/resource_info.go @@ -389,6 +389,37 @@ func (r *Resource) LessEqual(rr *Resource, defaultValue DimensionDefaultValue) b return true } +// LessEqualResource returns "" only on condition that all dimensions of resources in r are less than or equal with that of rr, +// Otherwise returns err string ,which show which resource is insufficient. +// @param defaultValue "default value for resource dimension not defined in ScalarResources. Its value can only be one of 'Zero' and 'Infinity'" +func (r *Resource) LessEqualResource(rr *Resource, defaultValue DimensionDefaultValue) string { + lessEqualFunc := func(l, r, diff float64) bool { + if l < r || math.Abs(l-r) < diff { + return true + } + return false + } + + if !lessEqualFunc(r.MilliCPU, rr.MilliCPU, minResource) { + return Insufficient + "cpu" + } + if !lessEqualFunc(r.Memory, rr.Memory, minResource) { + return Insufficient + "memory" + } + + for resourceName, leftValue := range r.ScalarResources { + rightValue, ok := rr.ScalarResources[resourceName] + if !ok && defaultValue == Infinity { + continue + } + + if !lessEqualFunc(leftValue, rightValue, minResource) { + return Insufficient + string(resourceName) + } + } + return "" +} + // LessPartly returns true if there exists any dimension whose resource amount in r is less than that in rr. // Otherwise returns false. // @param defaultValue "default value for resource dimension not defined in ScalarResources. Its value can only be one of 'Zero' and 'Infinity'" diff --git a/pkg/scheduler/api/unschedule_info.go b/pkg/scheduler/api/unschedule_info.go index cb7dcfa890f..e1e0ebd5ad1 100644 --- a/pkg/scheduler/api/unschedule_info.go +++ b/pkg/scheduler/api/unschedule_info.go @@ -14,6 +14,9 @@ const ( // AllNodeUnavailableMsg is the default error message AllNodeUnavailableMsg = "all nodes are unavailable" + + // Insufficient mean less resource than request + Insufficient = "Insufficient " ) // These are reasons for a pod's transition to a condition.