bugfix: check Spec.AllocateLoadBalancerNodePorts for nodeport and skip zero usage in delta evaluator
Signed-off-by: pacoxu <paco.xu@daocloud.io> When Spec.AllocateLoadBalancerNodePorts is "false" NodePort shall not be included when computing quota for type:LoadBalancer. Co-authored-by: uablrek Kubernetes-commit: 15867d9e8a1faf007f6df563c26a9b5e8744b2a1
This commit is contained in:
parent
c2a4b1a59a
commit
ee05a4663e
|
|
@ -510,7 +510,10 @@ func CheckRequest(quotas []corev1.ResourceQuota, a admission.Attributes, evaluat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if quota.IsZero(deltaUsage) {
|
// ignore items in deltaUsage with zero usage
|
||||||
|
deltaUsage = quota.RemoveZeros(deltaUsage)
|
||||||
|
// if there is no remaining non-zero usage, short-circuit and return
|
||||||
|
if len(deltaUsage) == 0 {
|
||||||
return quotas, nil
|
return quotas, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,17 @@ func IsZero(a corev1.ResourceList) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveZeros returns a new resource list that only has no zero values
|
||||||
|
func RemoveZeros(a corev1.ResourceList) corev1.ResourceList {
|
||||||
|
result := corev1.ResourceList{}
|
||||||
|
for key, value := range a {
|
||||||
|
if !value.IsZero() {
|
||||||
|
result[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
// IsNegative returns the set of resource names that have a negative value.
|
// IsNegative returns the set of resource names that have a negative value.
|
||||||
func IsNegative(a corev1.ResourceList) []corev1.ResourceName {
|
func IsNegative(a corev1.ResourceList) []corev1.ResourceName {
|
||||||
results := []corev1.ResourceName{}
|
results := []corev1.ResourceName{}
|
||||||
|
|
|
||||||
|
|
@ -287,6 +287,50 @@ func TestIsZero(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemoveZeros(t *testing.T) {
|
||||||
|
testCases := map[string]struct {
|
||||||
|
a corev1.ResourceList
|
||||||
|
expected corev1.ResourceList
|
||||||
|
}{
|
||||||
|
"empty": {
|
||||||
|
a: corev1.ResourceList{},
|
||||||
|
expected: corev1.ResourceList{},
|
||||||
|
},
|
||||||
|
"all-zeros": {
|
||||||
|
a: corev1.ResourceList{
|
||||||
|
corev1.ResourceCPU: resource.MustParse("0"),
|
||||||
|
corev1.ResourceMemory: resource.MustParse("0"),
|
||||||
|
},
|
||||||
|
expected: corev1.ResourceList{},
|
||||||
|
},
|
||||||
|
"some-zeros": {
|
||||||
|
a: corev1.ResourceList{
|
||||||
|
corev1.ResourceCPU: resource.MustParse("0"),
|
||||||
|
corev1.ResourceMemory: resource.MustParse("0"),
|
||||||
|
corev1.ResourceStorage: resource.MustParse("100Gi"),
|
||||||
|
},
|
||||||
|
expected: corev1.ResourceList{
|
||||||
|
corev1.ResourceStorage: resource.MustParse("100Gi"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"non-zero": {
|
||||||
|
a: corev1.ResourceList{
|
||||||
|
corev1.ResourceCPU: resource.MustParse("200m"),
|
||||||
|
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
||||||
|
},
|
||||||
|
expected: corev1.ResourceList{
|
||||||
|
corev1.ResourceCPU: resource.MustParse("200m"),
|
||||||
|
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for testName, testCase := range testCases {
|
||||||
|
if result := RemoveZeros(testCase.a); !Equals(result, testCase.expected) {
|
||||||
|
t.Errorf("%s expected: %v, actual: %v", testName, testCase.expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestIsNegative(t *testing.T) {
|
func TestIsNegative(t *testing.T) {
|
||||||
testCases := map[string]struct {
|
testCases := map[string]struct {
|
||||||
a corev1.ResourceList
|
a corev1.ResourceList
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue