11package v1
22
33import (
4- "errors"
54 "fmt"
65 "strings"
6+
7+ "k8s.io/apimachinery/pkg/api/resource"
78)
89
910// BaseResources defines resources that should be tracked at any scoped. The two main exclusions
@@ -15,10 +16,9 @@ type BaseResources struct {
1516 Volumes int `json:"volumes"`
1617 Images int `json:"images"`
1718
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"`
19+ VolumeStorage resource.Quantity `json:"volumeStorage"`
20+ Memory resource.Quantity `json:"memory"`
21+ CPU resource.Quantity `json:"cpu"`
2222}
2323
2424// Add will add the BaseResources of another BaseResources struct into the current one.
@@ -29,14 +29,9 @@ func (current *BaseResources) Add(incoming BaseResources) {
2929 current .Volumes = Add (current .Volumes , incoming .Volumes )
3030 current .Images = Add (current .Images , incoming .Images )
3131
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 )
32+ current .VolumeStorage = AddQuantity (current .VolumeStorage , incoming .VolumeStorage )
33+ current .Memory = AddQuantity (current .Memory , incoming .Memory )
34+ current .CPU = AddQuantity (current .CPU , incoming .CPU )
4035}
4136
4237// Remove will remove the BaseResources of another BaseResources struct from the current one. Calling remove
@@ -47,9 +42,13 @@ func (current *BaseResources) Remove(incoming BaseResources, all bool) {
4742 current .Jobs = Sub (current .Jobs , incoming .Jobs )
4843 current .Volumes = Sub (current .Volumes , incoming .Volumes )
4944 current .Images = Sub (current .Images , incoming .Images )
50- current .ComputeClasses .Remove (incoming .ComputeClasses )
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.
5150 if all {
52- current .VolumeClasses . Remove ( incoming .VolumeClasses )
51+ current .VolumeStorage = SubQuantity ( current . VolumeStorage , incoming .VolumeStorage )
5352 }
5453}
5554
@@ -59,7 +58,6 @@ func (current *BaseResources) Remove(incoming BaseResources, all bool) {
5958// If the current BaseResources defines unlimited, then it will always fit.
6059func (current * BaseResources ) Fits (incoming BaseResources ) error {
6160 var exceededResources []string
62- var errs []error
6361
6462 // Check if any of the resources are exceeded
6563 for _ , r := range []struct {
@@ -77,51 +75,43 @@ func (current *BaseResources) Fits(incoming BaseResources) error {
7775 }
7876 }
7977
80- if len (exceededResources ) != 0 {
81- errs = append (errs , fmt .Errorf ("%w: %s" , ErrExceededResources , strings .Join (exceededResources , ", " )))
82- }
83-
84- if err := current .ComputeClasses .Fits (incoming .ComputeClasses ); err != nil {
85- errs = append (errs , err )
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+ }
8690 }
8791
88- if err := current .VolumeClasses .Fits (incoming .VolumeClasses ); err != nil {
89- errs = append (errs , err )
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 , ", " ))
9095 }
9196
92- // Build an aggregated error message for the exceeded resources
93- return errors .Join (errs ... )
97+ return nil
9498}
9599
96100// ToString will return a string representation of the BaseResources within the struct.
97101func (current * BaseResources ) ToString () string {
98- // make sure that an empty string doesn't have a comma
99- result := CountResourcesToString (
102+ return ResourcesToString (
100103 map [string ]int {
101104 "Apps" : current .Apps ,
102105 "Containers" : current .Containers ,
103106 "Jobs" : current .Jobs ,
104107 "Volumes" : current .Volumes ,
105108 "Images" : current .Images ,
106109 },
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
110+ map [string ]resource.Quantity {
111+ "VolumeStorage" : current .VolumeStorage ,
112+ "Memory" : current .Memory ,
113+ "Cpu" : current .CPU ,
114+ })
125115}
126116
127117// Equals will check if the current BaseResources struct is equal to another. This is useful
@@ -132,6 +122,7 @@ func (current *BaseResources) Equals(incoming BaseResources) bool {
132122 current .Jobs == incoming .Jobs &&
133123 current .Volumes == incoming .Volumes &&
134124 current .Images == incoming .Images &&
135- current .ComputeClasses .Equals (incoming .ComputeClasses ) &&
136- current .VolumeClasses .Equals (incoming .VolumeClasses )
125+ current .VolumeStorage .Cmp (incoming .VolumeStorage ) == 0 &&
126+ current .Memory .Cmp (incoming .Memory ) == 0 &&
127+ current .CPU .Cmp (incoming .CPU ) == 0
137128}
0 commit comments