@@ -26,6 +26,7 @@ import (
26
26
admissionv1 "k8s.io/api/admission/v1"
27
27
corev1 "k8s.io/api/core/v1"
28
28
apierrors "k8s.io/apimachinery/pkg/api/errors"
29
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
29
30
"k8s.io/client-go/util/retry"
30
31
"k8s.io/klog/v2"
31
32
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -309,19 +310,33 @@ func (v *ValidatingAdmission) processSingleFRQ(frqItem policyv1alpha1.FederatedR
309
310
310
311
potentialNewOverallUsedForThisFRQ := addResourceLists (frqItem .Status .OverallUsed , deltaForThisFRQ )
311
312
312
- if ! isAllowed (potentialNewOverallUsedForThisFRQ , frqItem .Spec .Overall ) {
313
- errMsg := fmt .Sprintf ("Quota exceeded for FederatedResourceQuota %s/%s. ResourceBinding %s/%s will be denied." ,
313
+ isAllowed , errMsg := isAllowed (potentialNewOverallUsedForThisFRQ , frqItem )
314
+ if ! isAllowed {
315
+ klog .Warningf ("Quota exceeded for FederatedResourceQuota %s/%s. ResourceBinding %s/%s will be denied." ,
314
316
frqItem .Namespace , frqItem .Name , rbNamespace , rbName )
315
- klog .Warning (errMsg )
316
- resp := admission .Denied (errMsg )
317
- return nil , "" , & resp
317
+ resp := buildDenyResponse (errMsg )
318
+ return nil , "" , resp
318
319
}
319
320
320
321
msg := fmt .Sprintf ("Quota check passed for FRQ %s/%s." , frqItem .Namespace , frqItem .Name )
321
322
klog .V (3 ).Infof ("FRQ %s/%s will be updated. New OverallUsed: %v" , frqItem .Namespace , frqItem .Name , potentialNewOverallUsedForThisFRQ )
322
323
return potentialNewOverallUsedForThisFRQ , msg , nil
323
324
}
324
325
326
+ func buildDenyResponse (errMsg string ) * admission.Response {
327
+ resp := admission.Response {
328
+ AdmissionResponse : admissionv1.AdmissionResponse {
329
+ Allowed : false ,
330
+ Result : & metav1.Status {
331
+ Message : errMsg ,
332
+ Reason : util .QuotaExceededReason ,
333
+ Code : int32 (http .StatusForbidden ),
334
+ },
335
+ },
336
+ }
337
+ return & resp
338
+ }
339
+
325
340
func calculateResourceUsage (rb * workv1alpha2.ResourceBinding ) (corev1.ResourceList , error ) {
326
341
if rb == nil || rb .Spec .ReplicaRequirements == nil || len (rb .Spec .ReplicaRequirements .ResourceRequest ) == 0 || len (rb .Spec .Clusters ) == 0 {
327
342
return corev1.ResourceList {}, nil
@@ -437,9 +452,10 @@ func addResourceLists(list1, list2 corev1.ResourceList) corev1.ResourceList {
437
452
return result
438
453
}
439
454
440
- func isAllowed (requested , allowedLimits corev1.ResourceList ) bool {
455
+ func isAllowed (requested corev1.ResourceList , frqItem policyv1alpha1.FederatedResourceQuota ) (bool , string ) {
456
+ allowedLimits := frqItem .Spec .Overall
441
457
if allowedLimits == nil {
442
- return true
458
+ return true , ""
443
459
}
444
460
for name , reqQty := range requested {
445
461
if reqQty .IsZero () {
@@ -451,11 +467,12 @@ func isAllowed(requested, allowedLimits corev1.ResourceList) bool {
451
467
continue
452
468
}
453
469
if reqQty .Cmp (limitQty ) > 0 {
454
- klog .Warningf ("Quota exceeded for resource %s: requested sum %s, limit %s" , name , reqQty .String (), limitQty .String ())
455
- return false
470
+ msg := fmt .Sprintf ("FederatedResourceQuota(%s/%s) exceeded for resource %s: requested sum %s, limit %s." , frqItem .Namespace , frqItem .Name , name , reqQty .String (), limitQty .String ())
471
+ klog .Warning (msg )
472
+ return false , msg
456
473
}
457
474
}
458
- return true
475
+ return true , ""
459
476
}
460
477
461
478
func filterResourceListByKeys (original corev1.ResourceList , filterKeySource corev1.ResourceList ) corev1.ResourceList {
0 commit comments