mirror of
https://github.com/projectcapsule/capsule.git
synced 2026-08-19 12:36:39 +00:00
* feat: add globalresourcequota api Signed-off-by: Oliver Baehler <oliver@sudo-i.net>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
// Copyright 2020-2026 Project Capsule Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package v1beta2
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"fmt"
|
|
"sort"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/api/resource"
|
|
|
|
runtimequota "github.com/projectcapsule/capsule/pkg/runtime/quota"
|
|
)
|
|
|
|
func (q *GlobalResourceQuota) GetResourceQuotaName() string {
|
|
sum := sha256.Sum256([]byte(q.Name))
|
|
|
|
return fmt.Sprintf("capsule-global-quota-%x", sum[:10])
|
|
}
|
|
|
|
func (q *GlobalResourceQuota) GetLedgerName() string {
|
|
sum := sha256.Sum256(fmt.Appendf(nil, "%s/%s", q.Name, q.UID))
|
|
|
|
return fmt.Sprintf("global-resource-quota-%x", sum[:16])
|
|
}
|
|
|
|
func (q *GlobalResourceQuota) AssignNamespaces(namespaces []corev1.Namespace) {
|
|
names := make([]string, 0, len(namespaces))
|
|
|
|
for i := range namespaces {
|
|
ns := &namespaces[i]
|
|
if ns.Status.Phase == corev1.NamespaceActive && ns.DeletionTimestamp == nil {
|
|
names = append(names, ns.Name)
|
|
}
|
|
}
|
|
|
|
sort.Strings(names)
|
|
q.Status.Namespaces = names
|
|
q.Status.NamespaceSize = uint(len(names))
|
|
}
|
|
|
|
func (q *GlobalResourceQuota) CalculateAvailable() {
|
|
available := make(corev1.ResourceList, len(q.Status.Total.Hard))
|
|
|
|
for name, hard := range q.Status.Total.Hard {
|
|
value := hard.DeepCopy()
|
|
value.Sub(q.Status.Total.Used[name])
|
|
runtimequota.ClampQuantityToZero(&value)
|
|
available[name] = value
|
|
}
|
|
|
|
q.Status.Total.Available = available
|
|
}
|
|
|
|
func ZeroResourceList(resources corev1.ResourceList) corev1.ResourceList {
|
|
out := make(corev1.ResourceList, len(resources))
|
|
for name := range resources {
|
|
out[name] = *resource.NewQuantity(0, resource.DecimalSI)
|
|
}
|
|
|
|
return out
|
|
}
|