mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Add fields to LimitRange object
This commit is contained in:
parent
f17ebf7350
commit
8fbe4645e3
@ -11575,7 +11575,15 @@
|
|||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
"type": "any",
|
"type": "any",
|
||||||
"description": "Default usage constraints on this kind by resource name. Default values on this kind by resource name if omitted."
|
"description": "Default resource requirement limit value by resource name if resource limit is omitted."
|
||||||
|
},
|
||||||
|
"defaultRequest": {
|
||||||
|
"type": "any",
|
||||||
|
"description": "DefaultRequest is the default resource requirement request value by resource name if resource request is omitted."
|
||||||
|
},
|
||||||
|
"maxLimitRequestRatio": {
|
||||||
|
"type": "any",
|
||||||
|
"description": "MaxLimitRequestRatio if specified, the named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -689,6 +689,30 @@ func deepCopy_api_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conv
|
|||||||
} else {
|
} else {
|
||||||
out.Default = nil
|
out.Default = nil
|
||||||
}
|
}
|
||||||
|
if in.DefaultRequest != nil {
|
||||||
|
out.DefaultRequest = make(ResourceList)
|
||||||
|
for key, val := range in.DefaultRequest {
|
||||||
|
newVal := new(resource.Quantity)
|
||||||
|
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.DefaultRequest[key] = *newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.DefaultRequest = nil
|
||||||
|
}
|
||||||
|
if in.MaxLimitRequestRatio != nil {
|
||||||
|
out.MaxLimitRequestRatio = make(ResourceList)
|
||||||
|
for key, val := range in.MaxLimitRequestRatio {
|
||||||
|
newVal := new(resource.Quantity)
|
||||||
|
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.MaxLimitRequestRatio[key] = *newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.MaxLimitRequestRatio = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,6 +183,28 @@ func FuzzerFor(t *testing.T, version string, src rand.Source) *fuzz.Fuzzer {
|
|||||||
q.Limits[api.ResourceStorage] = *storageLimit.Copy()
|
q.Limits[api.ResourceStorage] = *storageLimit.Copy()
|
||||||
q.Requests[api.ResourceStorage] = *storageLimit.Copy()
|
q.Requests[api.ResourceStorage] = *storageLimit.Copy()
|
||||||
},
|
},
|
||||||
|
func(q *api.LimitRangeItem, c fuzz.Continue) {
|
||||||
|
randomQuantity := func() resource.Quantity {
|
||||||
|
return *resource.NewQuantity(c.Int63n(1000), resource.DecimalExponent)
|
||||||
|
}
|
||||||
|
cpuLimit := randomQuantity()
|
||||||
|
|
||||||
|
q.Type = api.LimitTypeContainer
|
||||||
|
q.Default = make(api.ResourceList)
|
||||||
|
q.Default[api.ResourceCPU] = *(cpuLimit.Copy())
|
||||||
|
|
||||||
|
q.DefaultRequest = make(api.ResourceList)
|
||||||
|
q.DefaultRequest[api.ResourceCPU] = *(cpuLimit.Copy())
|
||||||
|
|
||||||
|
q.Max = make(api.ResourceList)
|
||||||
|
q.Max[api.ResourceCPU] = *(cpuLimit.Copy())
|
||||||
|
|
||||||
|
q.Min = make(api.ResourceList)
|
||||||
|
q.Min[api.ResourceCPU] = *(cpuLimit.Copy())
|
||||||
|
|
||||||
|
q.MaxLimitRequestRatio = make(api.ResourceList)
|
||||||
|
q.MaxLimitRequestRatio[api.ResourceCPU] = resource.MustParse("10")
|
||||||
|
},
|
||||||
func(p *api.PullPolicy, c fuzz.Continue) {
|
func(p *api.PullPolicy, c fuzz.Continue) {
|
||||||
policies := []api.PullPolicy{api.PullAlways, api.PullNever, api.PullIfNotPresent}
|
policies := []api.PullPolicy{api.PullAlways, api.PullNever, api.PullIfNotPresent}
|
||||||
*p = policies[c.Rand.Intn(len(policies))]
|
*p = policies[c.Rand.Intn(len(policies))]
|
||||||
|
@ -1942,8 +1942,12 @@ type LimitRangeItem struct {
|
|||||||
Max ResourceList `json:"max,omitempty"`
|
Max ResourceList `json:"max,omitempty"`
|
||||||
// Min usage constraints on this kind by resource name
|
// Min usage constraints on this kind by resource name
|
||||||
Min ResourceList `json:"min,omitempty"`
|
Min ResourceList `json:"min,omitempty"`
|
||||||
// Default usage constraints on this kind by resource name
|
// Default resource requirement limit value by resource name.
|
||||||
Default ResourceList `json:"default,omitempty"`
|
Default ResourceList `json:"default,omitempty"`
|
||||||
|
// DefaultRequest resource requirement request value by resource name.
|
||||||
|
DefaultRequest ResourceList `json:"defaultRequest,omitempty"`
|
||||||
|
// MaxLimitRequestRatio represents the max burst value for the named resource
|
||||||
|
MaxLimitRequestRatio ResourceList `json:"maxLimitRequestRatio,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LimitRangeSpec defines a min/max usage limit for resources that match on kind
|
// LimitRangeSpec defines a min/max usage limit for resources that match on kind
|
||||||
|
@ -805,6 +805,30 @@ func convert_api_LimitRangeItem_To_v1_LimitRangeItem(in *api.LimitRangeItem, out
|
|||||||
} else {
|
} else {
|
||||||
out.Default = nil
|
out.Default = nil
|
||||||
}
|
}
|
||||||
|
if in.DefaultRequest != nil {
|
||||||
|
out.DefaultRequest = make(ResourceList)
|
||||||
|
for key, val := range in.DefaultRequest {
|
||||||
|
newVal := resource.Quantity{}
|
||||||
|
if err := s.Convert(&val, &newVal, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.DefaultRequest[ResourceName(key)] = newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.DefaultRequest = nil
|
||||||
|
}
|
||||||
|
if in.MaxLimitRequestRatio != nil {
|
||||||
|
out.MaxLimitRequestRatio = make(ResourceList)
|
||||||
|
for key, val := range in.MaxLimitRequestRatio {
|
||||||
|
newVal := resource.Quantity{}
|
||||||
|
if err := s.Convert(&val, &newVal, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.MaxLimitRequestRatio[ResourceName(key)] = newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.MaxLimitRequestRatio = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3170,6 +3194,30 @@ func convert_v1_LimitRangeItem_To_api_LimitRangeItem(in *LimitRangeItem, out *ap
|
|||||||
} else {
|
} else {
|
||||||
out.Default = nil
|
out.Default = nil
|
||||||
}
|
}
|
||||||
|
if in.DefaultRequest != nil {
|
||||||
|
out.DefaultRequest = make(api.ResourceList)
|
||||||
|
for key, val := range in.DefaultRequest {
|
||||||
|
newVal := resource.Quantity{}
|
||||||
|
if err := s.Convert(&val, &newVal, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.DefaultRequest[api.ResourceName(key)] = newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.DefaultRequest = nil
|
||||||
|
}
|
||||||
|
if in.MaxLimitRequestRatio != nil {
|
||||||
|
out.MaxLimitRequestRatio = make(api.ResourceList)
|
||||||
|
for key, val := range in.MaxLimitRequestRatio {
|
||||||
|
newVal := resource.Quantity{}
|
||||||
|
if err := s.Convert(&val, &newVal, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.MaxLimitRequestRatio[api.ResourceName(key)] = newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.MaxLimitRequestRatio = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -704,6 +704,30 @@ func deepCopy_v1_LimitRangeItem(in LimitRangeItem, out *LimitRangeItem, c *conve
|
|||||||
} else {
|
} else {
|
||||||
out.Default = nil
|
out.Default = nil
|
||||||
}
|
}
|
||||||
|
if in.DefaultRequest != nil {
|
||||||
|
out.DefaultRequest = make(ResourceList)
|
||||||
|
for key, val := range in.DefaultRequest {
|
||||||
|
newVal := new(resource.Quantity)
|
||||||
|
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.DefaultRequest[key] = *newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.DefaultRequest = nil
|
||||||
|
}
|
||||||
|
if in.MaxLimitRequestRatio != nil {
|
||||||
|
out.MaxLimitRequestRatio = make(ResourceList)
|
||||||
|
for key, val := range in.MaxLimitRequestRatio {
|
||||||
|
newVal := new(resource.Quantity)
|
||||||
|
if err := deepCopy_resource_Quantity(val, newVal, c); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.MaxLimitRequestRatio[key] = *newVal
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.MaxLimitRequestRatio = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +188,37 @@ func addDefaultingFuncs() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
func(obj *LimitRangeItem) {
|
||||||
|
// for container limits, we apply default values
|
||||||
|
if obj.Type == LimitTypeContainer {
|
||||||
|
|
||||||
|
if obj.Default == nil {
|
||||||
|
obj.Default = make(ResourceList)
|
||||||
|
}
|
||||||
|
if obj.DefaultRequest == nil {
|
||||||
|
obj.DefaultRequest = make(ResourceList)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a default limit is unspecified, but the max is specified, default the limit to the max
|
||||||
|
for key, value := range obj.Max {
|
||||||
|
if _, exists := obj.Default[key]; !exists {
|
||||||
|
obj.Default[key] = *(value.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If a default limit is specified, but the default request is not, default request to limit
|
||||||
|
for key, value := range obj.Default {
|
||||||
|
if _, exists := obj.DefaultRequest[key]; !exists {
|
||||||
|
obj.DefaultRequest[key] = *(value.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If a default request is not specified, but the min is provided, default request to the min
|
||||||
|
for key, value := range obj.Min {
|
||||||
|
if _, exists := obj.DefaultRequest[key]; !exists {
|
||||||
|
obj.DefaultRequest[key] = *(value.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
|
"k8s.io/kubernetes/pkg/api/resource"
|
||||||
versioned "k8s.io/kubernetes/pkg/api/v1"
|
versioned "k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
"k8s.io/kubernetes/pkg/util"
|
"k8s.io/kubernetes/pkg/util"
|
||||||
@ -489,3 +490,45 @@ func TestSetDefaultObjectFieldSelectorAPIVersion(t *testing.T) {
|
|||||||
t.Errorf("Expected default APIVersion v1, got: %v", apiVersion)
|
t.Errorf("Expected default APIVersion v1, got: %v", apiVersion)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetDefaultLimitRangeItem(t *testing.T) {
|
||||||
|
limitRange := &versioned.LimitRange{
|
||||||
|
ObjectMeta: versioned.ObjectMeta{
|
||||||
|
Name: "test-defaults",
|
||||||
|
},
|
||||||
|
Spec: versioned.LimitRangeSpec{
|
||||||
|
Limits: []versioned.LimitRangeItem{{
|
||||||
|
Type: versioned.LimitTypeContainer,
|
||||||
|
Max: versioned.ResourceList{
|
||||||
|
versioned.ResourceCPU: resource.MustParse("100m"),
|
||||||
|
},
|
||||||
|
Min: versioned.ResourceList{
|
||||||
|
versioned.ResourceMemory: resource.MustParse("100Mi"),
|
||||||
|
},
|
||||||
|
Default: versioned.ResourceList{},
|
||||||
|
DefaultRequest: versioned.ResourceList{},
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
output := roundTrip(t, runtime.Object(limitRange))
|
||||||
|
limitRange2 := output.(*versioned.LimitRange)
|
||||||
|
defaultLimit := limitRange2.Spec.Limits[0].Default
|
||||||
|
defaultRequest := limitRange2.Spec.Limits[0].DefaultRequest
|
||||||
|
|
||||||
|
// verify that default cpu was set to the max
|
||||||
|
defaultValue := defaultLimit[versioned.ResourceCPU]
|
||||||
|
if defaultValue.String() != "100m" {
|
||||||
|
t.Errorf("Expected default cpu: %s, got: %s", "100m", defaultValue.String())
|
||||||
|
}
|
||||||
|
// verify that default request was set to the limit
|
||||||
|
requestValue := defaultRequest[versioned.ResourceCPU]
|
||||||
|
if requestValue.String() != "100m" {
|
||||||
|
t.Errorf("Expected request cpu: %s, got: %s", "100m", requestValue.String())
|
||||||
|
}
|
||||||
|
// verify that if a min is provided, it will be the default if no limit is specified
|
||||||
|
requestMinValue := defaultRequest[versioned.ResourceMemory]
|
||||||
|
if requestMinValue.String() != "100Mi" {
|
||||||
|
t.Errorf("Expected request memory: %s, got: %s", "100Mi", requestMinValue.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2327,9 +2327,12 @@ type LimitRangeItem struct {
|
|||||||
Max ResourceList `json:"max,omitempty"`
|
Max ResourceList `json:"max,omitempty"`
|
||||||
// Min usage constraints on this kind by resource name.
|
// Min usage constraints on this kind by resource name.
|
||||||
Min ResourceList `json:"min,omitempty"`
|
Min ResourceList `json:"min,omitempty"`
|
||||||
// Default usage constraints on this kind by resource name.
|
// Default resource requirement limit value by resource name if resource limit is omitted.
|
||||||
// Default values on this kind by resource name if omitted.
|
|
||||||
Default ResourceList `json:"default,omitempty"`
|
Default ResourceList `json:"default,omitempty"`
|
||||||
|
// DefaultRequest is the default resource requirement request value by resource name if resource request is omitted.
|
||||||
|
DefaultRequest ResourceList `json:"defaultRequest,omitempty"`
|
||||||
|
// MaxLimitRequestRatio if specified, the named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource.
|
||||||
|
MaxLimitRequestRatio ResourceList `json:"maxLimitRequestRatio,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LimitRangeSpec defines a min/max usage limit for resources that match on kind.
|
// LimitRangeSpec defines a min/max usage limit for resources that match on kind.
|
||||||
|
@ -474,11 +474,13 @@ func (LimitRange) SwaggerDoc() map[string]string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var map_LimitRangeItem = map[string]string{
|
var map_LimitRangeItem = map[string]string{
|
||||||
"": "LimitRangeItem defines a min/max usage limit for any resource that matches on kind.",
|
"": "LimitRangeItem defines a min/max usage limit for any resource that matches on kind.",
|
||||||
"type": "Type of resource that this limit applies to.",
|
"type": "Type of resource that this limit applies to.",
|
||||||
"max": "Max usage constraints on this kind by resource name.",
|
"max": "Max usage constraints on this kind by resource name.",
|
||||||
"min": "Min usage constraints on this kind by resource name.",
|
"min": "Min usage constraints on this kind by resource name.",
|
||||||
"default": "Default usage constraints on this kind by resource name. Default values on this kind by resource name if omitted.",
|
"default": "Default resource requirement limit value by resource name if resource limit is omitted.",
|
||||||
|
"defaultRequest": "DefaultRequest is the default resource requirement request value by resource name if resource request is omitted.",
|
||||||
|
"maxLimitRequestRatio": "MaxLimitRequestRatio if specified, the named resource must have a request and limit that are both non-zero where limit divided by request is less than or equal to the enumerated value; this represents the max burst for the named resource.",
|
||||||
}
|
}
|
||||||
|
|
||||||
func (LimitRangeItem) SwaggerDoc() map[string]string {
|
func (LimitRangeItem) SwaggerDoc() map[string]string {
|
||||||
|
@ -1418,6 +1418,7 @@ func ValidateLimitRange(limitRange *api.LimitRange) errs.ValidationErrorList {
|
|||||||
min := map[string]int64{}
|
min := map[string]int64{}
|
||||||
max := map[string]int64{}
|
max := map[string]int64{}
|
||||||
defaults := map[string]int64{}
|
defaults := map[string]int64{}
|
||||||
|
defaultRequests := map[string]int64{}
|
||||||
|
|
||||||
for k := range limit.Max {
|
for k := range limit.Max {
|
||||||
allErrs = append(allErrs, validateResourceName(string(k), fmt.Sprintf("spec.limits[%d].max[%s]", i, k))...)
|
allErrs = append(allErrs, validateResourceName(string(k), fmt.Sprintf("spec.limits[%d].max[%s]", i, k))...)
|
||||||
@ -1437,28 +1438,56 @@ func ValidateLimitRange(limitRange *api.LimitRange) errs.ValidationErrorList {
|
|||||||
q := limit.Default[k]
|
q := limit.Default[k]
|
||||||
defaults[string(k)] = q.Value()
|
defaults[string(k)] = q.Value()
|
||||||
}
|
}
|
||||||
|
for k := range limit.DefaultRequest {
|
||||||
|
allErrs = append(allErrs, validateResourceName(string(k), fmt.Sprintf("spec.limits[%d].defaultRequest[%s]", i, k))...)
|
||||||
|
keys.Insert(string(k))
|
||||||
|
q := limit.DefaultRequest[k]
|
||||||
|
defaultRequests[string(k)] = q.Value()
|
||||||
|
}
|
||||||
|
for k := range limit.MaxLimitRequestRatio {
|
||||||
|
allErrs = append(allErrs, validateResourceName(string(k), fmt.Sprintf("spec.limits[%d].maxLimitRequestRatio[%s]", i, k))...)
|
||||||
|
}
|
||||||
|
|
||||||
for k := range keys {
|
for k := range keys {
|
||||||
minValue, minValueFound := min[k]
|
minValue, minValueFound := min[k]
|
||||||
maxValue, maxValueFound := max[k]
|
maxValue, maxValueFound := max[k]
|
||||||
defaultValue, defaultValueFound := defaults[k]
|
defaultValue, defaultValueFound := defaults[k]
|
||||||
|
defaultRequestValue, defaultRequestValueFound := defaultRequests[k]
|
||||||
|
|
||||||
if minValueFound && maxValueFound && minValue > maxValue {
|
if minValueFound && maxValueFound && minValue > maxValue {
|
||||||
minQuantity := limit.Min[api.ResourceName(k)]
|
minQuantity := limit.Min[api.ResourceName(k)]
|
||||||
maxQuantity := limit.Max[api.ResourceName(k)]
|
maxQuantity := limit.Max[api.ResourceName(k)]
|
||||||
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].max[%s]", i, k), minValue, fmt.Sprintf("min value %s is greater than max value %s", minQuantity.String(), maxQuantity.String())))
|
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].min[%s]", i, k), minValue, fmt.Sprintf("min value %s is greater than max value %s", minQuantity.String(), maxQuantity.String())))
|
||||||
|
}
|
||||||
|
|
||||||
|
if defaultRequestValueFound && minValueFound && minValue > defaultRequestValue {
|
||||||
|
minQuantity := limit.Min[api.ResourceName(k)]
|
||||||
|
defaultRequestQuantity := limit.DefaultRequest[api.ResourceName(k)]
|
||||||
|
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].defaultRequest[%s]", i, k), defaultRequestValue, fmt.Sprintf("min value %s is greater than default request value %s", minQuantity.String(), defaultRequestQuantity.String())))
|
||||||
|
}
|
||||||
|
|
||||||
|
if defaultRequestValueFound && maxValueFound && defaultRequestValue > maxValue {
|
||||||
|
maxQuantity := limit.Max[api.ResourceName(k)]
|
||||||
|
defaultRequestQuantity := limit.DefaultRequest[api.ResourceName(k)]
|
||||||
|
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].defaultRequest[%s]", i, k), defaultRequestValue, fmt.Sprintf("default request value %s is greater than max value %s", defaultRequestQuantity.String(), maxQuantity.String())))
|
||||||
|
}
|
||||||
|
|
||||||
|
if defaultRequestValueFound && defaultValueFound && defaultRequestValue > defaultValue {
|
||||||
|
defaultQuantity := limit.Default[api.ResourceName(k)]
|
||||||
|
defaultRequestQuantity := limit.DefaultRequest[api.ResourceName(k)]
|
||||||
|
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].defaultRequest[%s]", i, k), defaultRequestValue, fmt.Sprintf("default request value %s is greater than default limit value %s", defaultRequestQuantity.String(), defaultQuantity.String())))
|
||||||
}
|
}
|
||||||
|
|
||||||
if defaultValueFound && minValueFound && minValue > defaultValue {
|
if defaultValueFound && minValueFound && minValue > defaultValue {
|
||||||
minQuantity := limit.Min[api.ResourceName(k)]
|
minQuantity := limit.Min[api.ResourceName(k)]
|
||||||
defaultQuantity := limit.Default[api.ResourceName(k)]
|
defaultQuantity := limit.Default[api.ResourceName(k)]
|
||||||
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].max[%s]", i, k), minValue, fmt.Sprintf("min value %s is greater than default value %s", minQuantity.String(), defaultQuantity.String())))
|
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].default[%s]", i, k), minValue, fmt.Sprintf("min value %s is greater than default value %s", minQuantity.String(), defaultQuantity.String())))
|
||||||
}
|
}
|
||||||
|
|
||||||
if defaultValueFound && maxValueFound && defaultValue > maxValue {
|
if defaultValueFound && maxValueFound && defaultValue > maxValue {
|
||||||
maxQuantity := limit.Max[api.ResourceName(k)]
|
maxQuantity := limit.Max[api.ResourceName(k)]
|
||||||
defaultQuantity := limit.Default[api.ResourceName(k)]
|
defaultQuantity := limit.Default[api.ResourceName(k)]
|
||||||
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].max[%s]", i, k), minValue, fmt.Sprintf("default value %s is greater than max value %s", defaultQuantity.String(), maxQuantity.String())))
|
allErrs = append(allErrs, errs.NewFieldInvalid(fmt.Sprintf("spec.limits[%d].default[%s]", i, k), maxValue, fmt.Sprintf("default value %s is greater than max value %s", defaultQuantity.String(), maxQuantity.String())))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3226,13 +3226,20 @@ func TestValidateLimitRange(t *testing.T) {
|
|||||||
api.ResourceMemory: resource.MustParse("10000"),
|
api.ResourceMemory: resource.MustParse("10000"),
|
||||||
},
|
},
|
||||||
Min: api.ResourceList{
|
Min: api.ResourceList{
|
||||||
api.ResourceCPU: resource.MustParse("0"),
|
api.ResourceCPU: resource.MustParse("5"),
|
||||||
api.ResourceMemory: resource.MustParse("100"),
|
api.ResourceMemory: resource.MustParse("100"),
|
||||||
},
|
},
|
||||||
Default: api.ResourceList{
|
Default: api.ResourceList{
|
||||||
api.ResourceCPU: resource.MustParse("50"),
|
api.ResourceCPU: resource.MustParse("50"),
|
||||||
api.ResourceMemory: resource.MustParse("500"),
|
api.ResourceMemory: resource.MustParse("500"),
|
||||||
},
|
},
|
||||||
|
DefaultRequest: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("10"),
|
||||||
|
api.ResourceMemory: resource.MustParse("200"),
|
||||||
|
},
|
||||||
|
MaxLimitRequestRatio: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("20"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -3291,6 +3298,43 @@ func TestValidateLimitRange(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
invalidSpecRangeDefaultRequestOutsideRange := api.LimitRangeSpec{
|
||||||
|
Limits: []api.LimitRangeItem{
|
||||||
|
{
|
||||||
|
Type: api.LimitTypePod,
|
||||||
|
Max: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("1000"),
|
||||||
|
},
|
||||||
|
Min: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("100"),
|
||||||
|
},
|
||||||
|
DefaultRequest: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("2000"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
invalidSpecRangeRequestMoreThanDefaultRange := api.LimitRangeSpec{
|
||||||
|
Limits: []api.LimitRangeItem{
|
||||||
|
{
|
||||||
|
Type: api.LimitTypePod,
|
||||||
|
Max: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("1000"),
|
||||||
|
},
|
||||||
|
Min: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("100"),
|
||||||
|
},
|
||||||
|
Default: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("500"),
|
||||||
|
},
|
||||||
|
DefaultRequest: api.ResourceList{
|
||||||
|
api.ResourceCPU: resource.MustParse("800"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
successCases := []api.LimitRange{
|
successCases := []api.LimitRange{
|
||||||
{
|
{
|
||||||
ObjectMeta: api.ObjectMeta{
|
ObjectMeta: api.ObjectMeta{
|
||||||
@ -3339,6 +3383,14 @@ func TestValidateLimitRange(t *testing.T) {
|
|||||||
api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidSpecRangeDefaultOutsideRange},
|
api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidSpecRangeDefaultOutsideRange},
|
||||||
"default value 2k is greater than max value 1k",
|
"default value 2k is greater than max value 1k",
|
||||||
},
|
},
|
||||||
|
"invalid spec defaultrequest outside range": {
|
||||||
|
api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidSpecRangeDefaultRequestOutsideRange},
|
||||||
|
"default request value 2k is greater than max value 1k",
|
||||||
|
},
|
||||||
|
"invalid spec defaultrequest more than default": {
|
||||||
|
api.LimitRange{ObjectMeta: api.ObjectMeta{Name: "abc", Namespace: "foo"}, Spec: invalidSpecRangeRequestMoreThanDefaultRange},
|
||||||
|
"default request value 800 is greater than default limit value 500",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for k, v := range errorCases {
|
for k, v := range errorCases {
|
||||||
errs := ValidateLimitRange(&v.R)
|
errs := ValidateLimitRange(&v.R)
|
||||||
|
Loading…
Reference in New Issue
Block a user