Skip to content
This repository was archived by the owner on Mar 16, 2024. It is now read-only.

Commit d1ddb42

Browse files
committed
enhancement: add ComputeClasses and VolumeClasses fields to BaseResources
This commit enhances the BaseResources struct by adding ComputeClasses and VolumeClasses fields. These new fields allow for a more detailed specification of compute and storage resources, categorized by class instead of just by resource type. This enhancement is crucial for accurately tracking the usage of memory, CPU, and storage for each specific compute or volume class. Consequently, the QuotaRequest logic has been updated to account for these new fields. These new fields are maps and they introduce a unique approach to handle unlimited resources. They include special keys, `AllComputeClasses` and `AllVolumeClasses`. If a value is assigned to these keys in ComputeClassResources or VolumeClassResources, all compute or volume classes will be evaluated against the value. Signed-off-by: tylerslaton <mtslaton1@gmail.com>
1 parent e0bfed6 commit d1ddb42

File tree

16 files changed

+1708
-412
lines changed

16 files changed

+1708
-412
lines changed
Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package v1
22

33
import (
4+
"errors"
45
"fmt"
56
"strings"
6-
7-
"k8s.io/apimachinery/pkg/api/resource"
87
)
98

109
// BaseResources defines resources that should be tracked at any scoped. The two main exclusions
@@ -16,9 +15,10 @@ type BaseResources struct {
1615
Volumes int `json:"volumes"`
1716
Images int `json:"images"`
1817

19-
VolumeStorage resource.Quantity `json:"volumeStorage"`
20-
Memory resource.Quantity `json:"memory"`
21-
CPU resource.Quantity `json:"cpu"`
18+
// ComputeClasses and VolumeClasses are used to track the amount of compute and volume storage per their
19+
// respective classes
20+
ComputeClasses ComputeClassResources `json:"computeClasses"`
21+
VolumeClasses VolumeClassResources `json:"volumeClasses"`
2222
}
2323

2424
// Add will add the BaseResources of another BaseResources struct into the current one.
@@ -29,9 +29,14 @@ func (current *BaseResources) Add(incoming BaseResources) {
2929
current.Volumes = Add(current.Volumes, incoming.Volumes)
3030
current.Images = Add(current.Images, incoming.Images)
3131

32-
current.VolumeStorage = AddQuantity(current.VolumeStorage, incoming.VolumeStorage)
33-
current.Memory = AddQuantity(current.Memory, incoming.Memory)
34-
current.CPU = AddQuantity(current.CPU, incoming.CPU)
32+
if current.ComputeClasses == nil {
33+
current.ComputeClasses = ComputeClassResources{}
34+
}
35+
if current.VolumeClasses == nil {
36+
current.VolumeClasses = VolumeClassResources{}
37+
}
38+
current.ComputeClasses.Add(incoming.ComputeClasses)
39+
current.VolumeClasses.Add(incoming.VolumeClasses)
3540
}
3641

3742
// Remove will remove the BaseResources of another BaseResources struct from the current one. Calling remove
@@ -42,13 +47,9 @@ func (current *BaseResources) Remove(incoming BaseResources, all bool) {
4247
current.Jobs = Sub(current.Jobs, incoming.Jobs)
4348
current.Volumes = Sub(current.Volumes, incoming.Volumes)
4449
current.Images = Sub(current.Images, incoming.Images)
45-
46-
current.Memory = SubQuantity(current.Memory, incoming.Memory)
47-
current.CPU = SubQuantity(current.CPU, incoming.CPU)
48-
49-
// Only remove persistent resources if all is true.
50+
current.ComputeClasses.Remove(incoming.ComputeClasses)
5051
if all {
51-
current.VolumeStorage = SubQuantity(current.VolumeStorage, incoming.VolumeStorage)
52+
current.VolumeClasses.Remove(incoming.VolumeClasses)
5253
}
5354
}
5455

@@ -58,6 +59,7 @@ func (current *BaseResources) Remove(incoming BaseResources, all bool) {
5859
// If the current BaseResources defines unlimited, then it will always fit.
5960
func (current *BaseResources) Fits(incoming BaseResources) error {
6061
var exceededResources []string
62+
var errs []error
6163

6264
// Check if any of the resources are exceeded
6365
for _, r := range []struct {
@@ -75,43 +77,51 @@ func (current *BaseResources) Fits(incoming BaseResources) error {
7577
}
7678
}
7779

78-
// Check if any of the quantity resources are exceeded
79-
for _, r := range []struct {
80-
resource string
81-
current, incoming resource.Quantity
82-
}{
83-
{"VolumeStorage", current.VolumeStorage, incoming.VolumeStorage},
84-
{"Memory", current.Memory, incoming.Memory},
85-
{"Cpu", current.CPU, incoming.CPU},
86-
} {
87-
if !FitsQuantity(r.current, r.incoming) {
88-
exceededResources = append(exceededResources, r.resource)
89-
}
80+
if len(exceededResources) != 0 {
81+
errs = append(errs, fmt.Errorf("%w: %s", ErrExceededResources, strings.Join(exceededResources, ", ")))
9082
}
9183

92-
// Build an aggregated error message for the exceeded resources
93-
if len(exceededResources) > 0 {
94-
return fmt.Errorf("%w: %s", ErrExceededResources, strings.Join(exceededResources, ", "))
84+
if err := current.ComputeClasses.Fits(incoming.ComputeClasses); err != nil {
85+
errs = append(errs, err)
86+
}
87+
88+
if err := current.VolumeClasses.Fits(incoming.VolumeClasses); err != nil {
89+
errs = append(errs, err)
9590
}
9691

97-
return nil
92+
// Build an aggregated error message for the exceeded resources
93+
return errors.Join(errs...)
9894
}
9995

10096
// ToString will return a string representation of the BaseResources within the struct.
10197
func (current *BaseResources) ToString() string {
102-
return ResourcesToString(
98+
// make sure that an empty string doesn't have a comma
99+
result := CountResourcesToString(
103100
map[string]int{
104101
"Apps": current.Apps,
105102
"Containers": current.Containers,
106103
"Jobs": current.Jobs,
107104
"Volumes": current.Volumes,
108105
"Images": current.Images,
109106
},
110-
map[string]resource.Quantity{
111-
"VolumeStorage": current.VolumeStorage,
112-
"Memory": current.Memory,
113-
"Cpu": current.CPU,
114-
})
107+
)
108+
109+
for _, resource := range []struct {
110+
name string
111+
asString string
112+
}{
113+
{"ComputeClasses", current.ComputeClasses.ToString()},
114+
{"VolumeClasses", current.VolumeClasses.ToString()},
115+
} {
116+
if result != "" && resource.asString != "" {
117+
result += ", "
118+
}
119+
if resource.asString != "" {
120+
result += fmt.Sprintf("%s: %s", resource.name, resource.asString)
121+
}
122+
}
123+
124+
return result
115125
}
116126

117127
// Equals will check if the current BaseResources struct is equal to another. This is useful
@@ -122,7 +132,6 @@ func (current *BaseResources) Equals(incoming BaseResources) bool {
122132
current.Jobs == incoming.Jobs &&
123133
current.Volumes == incoming.Volumes &&
124134
current.Images == incoming.Images &&
125-
current.VolumeStorage.Cmp(incoming.VolumeStorage) == 0 &&
126-
current.Memory.Cmp(incoming.Memory) == 0 &&
127-
current.CPU.Cmp(incoming.CPU) == 0
135+
current.ComputeClasses.Equals(incoming.ComputeClasses) &&
136+
current.VolumeClasses.Equals(incoming.VolumeClasses)
128137
}

0 commit comments

Comments
 (0)