cherry-pick part of #97451: fix nodeport quota check failure during creating clusterip

Signed-off-by: pacoxu <paco.xu@daocloud.io>
This commit is contained in:
pacoxu 2021-01-08 10:06:14 +08:00
parent e1a8adb6b6
commit 7d11fca8dc
3 changed files with 59 additions and 1 deletions

View file

@ -226,6 +226,17 @@ func IsZero(a corev1.ResourceList) bool {
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.
func IsNegative(a corev1.ResourceList) []corev1.ResourceName {
results := []corev1.ResourceName{}

View file

@ -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) {
testCases := map[string]struct {
a corev1.ResourceList

View file

@ -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
}