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

Commit c73cd69

Browse files
authored
Merge pull request #2454 from tylerslaton/compute-class-quota
enhancement: add ComputeClasses and VolumeClasses field to BaseResources
2 parents 3964bbc + d1ddb42 commit c73cd69

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)