Skip to content

Commit 9ee6b7f

Browse files
committed
Count storage requests as whole byte values in quota
1 parent 73375fb commit 9ee6b7f

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

pkg/quota/v1/evaluator/core/persistent_volume_claims.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,13 @@ func (p *pvcEvaluator) Usage(item runtime.Object) (corev1.ResourceList, error) {
161161

162162
// charge for storage
163163
if request, found := pvc.Spec.Resources.Requests[corev1.ResourceStorage]; found {
164+
roundedRequest := request.DeepCopy()
165+
if !roundedRequest.RoundUp(0) {
166+
// Ensure storage requests are counted as whole byte values, to pass resourcequota validation.
167+
// See http://issue.k8s.io/94313
168+
request = roundedRequest
169+
}
170+
164171
result[corev1.ResourceRequestsStorage] = request
165172
// charge usage to the storage class (if present)
166173
if len(storageClassRef) > 0 {

pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
7777
StorageClassName: &classGold,
7878
})
7979

80+
validClaimWithNonIntegerStorage := validClaim.DeepCopy()
81+
validClaimWithNonIntegerStorage.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)] = resource.MustParse("1001m")
82+
83+
validClaimByStorageClassWithNonIntegerStorage := validClaimByStorageClass.DeepCopy()
84+
validClaimByStorageClassWithNonIntegerStorage.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)] = resource.MustParse("1001m")
85+
8086
evaluator := NewPersistentVolumeClaimEvaluator(nil)
8187
testCases := map[string]struct {
8288
pvc *api.PersistentVolumeClaim
@@ -100,14 +106,33 @@ func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) {
100106
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "persistentvolumeclaims"}): resource.MustParse("1"),
101107
},
102108
},
109+
110+
"pvc-usage-rounded": {
111+
pvc: validClaimWithNonIntegerStorage,
112+
usage: corev1.ResourceList{
113+
corev1.ResourceRequestsStorage: resource.MustParse("2"), // 1001m -> 2
114+
corev1.ResourcePersistentVolumeClaims: resource.MustParse("1"),
115+
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "persistentvolumeclaims"}): resource.MustParse("1"),
116+
},
117+
},
118+
"pvc-usage-by-class-rounded": {
119+
pvc: validClaimByStorageClassWithNonIntegerStorage,
120+
usage: corev1.ResourceList{
121+
corev1.ResourceRequestsStorage: resource.MustParse("2"), // 1001m -> 2
122+
corev1.ResourcePersistentVolumeClaims: resource.MustParse("1"),
123+
V1ResourceByStorageClass(classGold, corev1.ResourceRequestsStorage): resource.MustParse("2"), // 1001m -> 2
124+
V1ResourceByStorageClass(classGold, corev1.ResourcePersistentVolumeClaims): resource.MustParse("1"),
125+
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "persistentvolumeclaims"}): resource.MustParse("1"),
126+
},
127+
},
103128
}
104129
for testName, testCase := range testCases {
105130
actual, err := evaluator.Usage(testCase.pvc)
106131
if err != nil {
107132
t.Errorf("%s unexpected error: %v", testName, err)
108133
}
109134
if !quota.Equals(testCase.usage, actual) {
110-
t.Errorf("%s expected: %v, actual: %v", testName, testCase.usage, actual)
135+
t.Errorf("%s expected:\n%v\n, actual:\n%v", testName, testCase.usage, actual)
111136
}
112137
}
113138
}

0 commit comments

Comments
 (0)