From 7d11fca8dc8ebd0ff9520ac3245518ddf06983c2 Mon Sep 17 00:00:00 2001 From: pacoxu Date: Fri, 8 Jan 2021 10:06:14 +0800 Subject: [PATCH] cherry-pick part of #97451: fix nodeport quota check failure during creating clusterip Signed-off-by: pacoxu --- pkg/quota/v1/resources.go | 11 +++++ pkg/quota/v1/resources_test.go | 44 +++++++++++++++++++ .../pkg/admission/resourcequota/controller.go | 5 ++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/pkg/quota/v1/resources.go b/pkg/quota/v1/resources.go index 9b217489db3..a1abfd240f6 100644 --- a/pkg/quota/v1/resources.go +++ b/pkg/quota/v1/resources.go @@ -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{} diff --git a/pkg/quota/v1/resources_test.go b/pkg/quota/v1/resources_test.go index 910c2f51120..cd3f76791a1 100644 --- a/pkg/quota/v1/resources_test.go +++ b/pkg/quota/v1/resources_test.go @@ -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 diff --git a/plugin/pkg/admission/resourcequota/controller.go b/plugin/pkg/admission/resourcequota/controller.go index 510db4f6f44..e0d9b415259 100644 --- a/plugin/pkg/admission/resourcequota/controller.go +++ b/plugin/pkg/admission/resourcequota/controller.go @@ -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 }