Skip to content

Commit

Permalink
webhook: Support setting quota admission to zero for special usage sc…
Browse files Browse the repository at this point in the history
…enarios, such as temporarily pausing pod submissions. (#2237)

Signed-off-by: Tao Yang <[email protected]>
  • Loading branch information
TaoYang526 authored Nov 7, 2024
1 parent 949aa79 commit 6fc4205
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 3 deletions.
76 changes: 76 additions & 0 deletions pkg/webhook/pod/validating/evaluate_quota_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,82 @@ func TestEvalucateQuota(t *testing.T) {
wantErr: true,
wantUsed: corev1.ResourceList{},
},
{
name: "admission not set, use max by default",
operation: admissionv1.Create,
newPod: elasticquota.MakePod("ns1", "pod1").Label("quota.scheduling.koordinator.sh/name", "quota1").
Container(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("4Gi"),
}).Obj(),
quota: elasticquota.MakeQuota("quota1").Namespace("kube-system").Max(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("1"),
corev1.ResourceMemory: resource.MustParse("2Gi"),
}).Obj(),
wantAllowed: false,
wantReason: "exceeded quota: kube-system/quota1, requested: cpu=2,memory=4Gi, used: , limited: cpu=1,memory=2Gi",
wantErr: true,
wantUsed: corev1.ResourceList{},
},
{
name: "admission set empty, use max by default",
operation: admissionv1.Create,
newPod: elasticquota.MakePod("ns1", "pod1").Label("quota.scheduling.koordinator.sh/name", "quota1").
Container(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("4Gi"),
}).Obj(),
quota: elasticquota.MakeQuota("quota1").Namespace("kube-system").Max(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("1"),
corev1.ResourceMemory: resource.MustParse("2Gi"),
}).Admission(corev1.ResourceList{}).Obj(),
wantAllowed: false,
wantReason: "exceeded quota: kube-system/quota1, requested: cpu=2,memory=4Gi, used: , limited: cpu=1,memory=2Gi",
wantErr: true,
wantUsed: corev1.ResourceList{},
},
{
name: "admission set zero explicitly",
operation: admissionv1.Create,
newPod: elasticquota.MakePod("ns1", "pod1").Label("quota.scheduling.koordinator.sh/name", "quota1").
Container(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("4Gi"),
}).Obj(),
quota: elasticquota.MakeQuota("quota1").Namespace("kube-system").Max(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("4"),
corev1.ResourceMemory: resource.MustParse("8Gi"),
}).Admission(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("0"),
corev1.ResourceMemory: resource.MustParse("0Gi"),
}).Obj(),
wantAllowed: false,
wantReason: "exceeded quota: kube-system/quota1, requested: cpu=2,memory=4Gi, used: , limited: cpu=0,memory=0",
wantErr: true,
wantUsed: corev1.ResourceList{},
},
{
name: "admission set zero for non-related resource",
operation: admissionv1.Create,
newPod: elasticquota.MakePod("ns1", "pod1").Label("quota.scheduling.koordinator.sh/name", "quota1").
Container(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("4Gi"),
}).Obj(),
quota: elasticquota.MakeQuota("quota1").Namespace("kube-system").Max(corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("4"),
corev1.ResourceMemory: resource.MustParse("8Gi"),
}).Admission(corev1.ResourceList{
extension.BatchCPU: resource.MustParse("0"),
}).Obj(),
wantAllowed: true,
wantReason: "",
wantErr: false,
wantUsed: corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("2"),
corev1.ResourceMemory: resource.MustParse("4Gi"),
},
},
}

for _, tc := range testCases {
Expand Down
5 changes: 2 additions & 3 deletions pkg/webhook/quotaevaluate/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package quotaevaluate

import (
corev1 "k8s.io/api/core/v1"
quotav1 "k8s.io/apiserver/pkg/quota/v1"

"github.com/koordinator-sh/koordinator/apis/extension"
"github.com/koordinator-sh/koordinator/apis/thirdparty/scheduler-plugins/pkg/apis/scheduling/v1alpha1"
Expand All @@ -30,8 +29,8 @@ func GetQuotaAdmission(quota *v1alpha1.ElasticQuota) (corev1.ResourceList, error
return nil, err
}

// admission is zero, return max
if quotav1.IsZero(admission) {
// admission is empty (it may not be configured or may have no content), return max
if len(admission) == 0 {
return quota.Spec.Max, nil
}

Expand Down

0 comments on commit 6fc4205

Please sign in to comment.