11package v1
22
33import (
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.
5960func (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.
10197func (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