@@ -6,6 +6,7 @@ package mcm
66import (
77 "context"
88 "fmt"
9+ "reflect"
910 "sync"
1011 "time"
1112
@@ -20,16 +21,21 @@ import (
2021 ctrl "sigs.k8s.io/controller-runtime"
2122)
2223
23- type capabilities struct {
24- cpuMillis int64
25- memoryBytes int64
24+ type capabilities map [string ]int64
25+
26+ type machineClassQuantity struct {
27+ * iri.MachineClass
28+ quantity int64
2629}
2730
28- func getCapabilities (iriCaps * iri.MachineClassCapabilities ) capabilities {
29- return capabilities {
30- cpuMillis : iriCaps .CpuMillis ,
31- memoryBytes : iriCaps .MemoryBytes ,
31+ func getMachineClassByCapabilities (machineClassByCapabilities map [machineClassQuantity ]capabilities , capabilities capabilities ) []machineClassQuantity {
32+ matchingMachineClassStatus := []machineClassQuantity {}
33+ for machineClassStatus , machineClassCapabilities := range machineClassByCapabilities {
34+ if reflect .DeepEqual (machineClassCapabilities , capabilities ) {
35+ matchingMachineClassStatus = append (matchingMachineClassStatus , machineClassStatus )
36+ }
3237 }
38+ return matchingMachineClassStatus
3339}
3440
3541type Generic struct {
@@ -40,8 +46,8 @@ type Generic struct {
4046
4147 listener sets.Set [* listener ]
4248
43- machineClassByName map [string ]* iri.MachineClassStatus
44- machineClassByCapabilities map [capabilities ][] * iri. MachineClassStatus
49+ machineClassByName map [string ]* iri.MachineClassStatus
50+ machineClassCapabilities map [machineClassQuantity ] capabilities
4551
4652 machineRuntime machine.RuntimeService
4753
@@ -97,19 +103,19 @@ func (g *Generic) relist(ctx context.Context, log logr.Logger) error {
97103 oldMachineClassByName := maps .Clone (g .machineClassByName )
98104
99105 maps .Clear (g .machineClassByName )
100- maps .Clear (g .machineClassByCapabilities )
106+ maps .Clear (g .machineClassCapabilities )
101107
102108 var notify bool
103109 for _ , machineClassStatus := range res .MachineClassStatus {
104110 machineClass := machineClassStatus .GetMachineClass ()
105111 notify = notify || shouldNotify (oldMachineClassByName , machineClassStatus )
106112
107- caps := capabilities {
108- cpuMillis : machineClass .Capabilities .CpuMillis ,
109- memoryBytes : machineClass .Capabilities .MemoryBytes ,
110- }
111113 g .machineClassByName [machineClass .Name ] = machineClassStatus
112- g .machineClassByCapabilities [caps ] = append (g .machineClassByCapabilities [caps ], machineClassStatus )
114+ machineClassWithQuantity := machineClassQuantity {
115+ MachineClass : machineClass ,
116+ quantity : machineClassStatus .Quantity ,
117+ }
118+ g .machineClassCapabilities [machineClassWithQuantity ] = machineClass .Capabilities .Resources
113119 }
114120
115121 if notify {
@@ -121,12 +127,12 @@ func (g *Generic) relist(ctx context.Context, log logr.Logger) error {
121127
122128 for _ , machineClassStatus := range res .MachineClassStatus {
123129 machineClass := machineClassStatus .GetMachineClass ()
124- caps := capabilities {
125- cpuMillis : machineClass .Capabilities .CpuMillis ,
126- memoryBytes : machineClass .Capabilities .MemoryBytes ,
127- }
128130 g .machineClassByName [machineClass .Name ] = machineClassStatus
129- g .machineClassByCapabilities [caps ] = append (g .machineClassByCapabilities [caps ], machineClassStatus )
131+ machineClassWithQuantity := machineClassQuantity {
132+ MachineClass : machineClass ,
133+ quantity : machineClassStatus .Quantity ,
134+ }
135+ g .machineClassCapabilities [machineClassWithQuantity ] = machineClass .Capabilities .Resources
130136 }
131137
132138 if ! g .sync {
@@ -151,23 +157,21 @@ func (g *Generic) GetMachineClassFor(ctx context.Context, name string, caps *iri
151157 g .mu .RLock ()
152158 defer g .mu .RUnlock ()
153159
154- expected := getCapabilities ( caps )
155- if byName , ok := g .machineClassByName [name ]; ok && getCapabilities (byName .MachineClass .Capabilities ) == expected {
160+ expected := caps . Resources
161+ if byName , ok := g .machineClassByName [name ]; ok && reflect . DeepEqual (byName .MachineClass .Capabilities . Resources , expected ) {
156162 return byName .MachineClass , byName .Quantity , nil
157163 }
158164
159- if byCaps , ok := g .machineClassByCapabilities [expected ]; ok {
160- switch len (byCaps ) {
161- case 0 :
162- return nil , 0 , ErrNoMatchingMachineClass
163- case 1 :
164- return byCaps [0 ].MachineClass , byCaps [0 ].Quantity , nil
165- default :
166- return nil , 0 , ErrAmbiguousMatchingMachineClass
167- }
165+ byCaps := getMachineClassByCapabilities (g .machineClassCapabilities , expected )
166+ switch len (byCaps ) {
167+ case 0 :
168+ return nil , 0 , ErrNoMatchingMachineClass
169+ case 1 :
170+ return byCaps [0 ].MachineClass , byCaps [0 ].quantity , nil
171+ default :
172+ return nil , 0 , ErrAmbiguousMatchingMachineClass
168173 }
169174
170- return nil , 0 , ErrNoMatchingMachineClass
171175}
172176
173177func (g * Generic ) WaitForSync (ctx context.Context ) error {
@@ -192,12 +196,12 @@ func setGenericOptionsDefaults(o *GenericOptions) {
192196func NewGeneric (runtime machine.RuntimeService , opts GenericOptions ) MachineClassMapper {
193197 setGenericOptionsDefaults (& opts )
194198 return & Generic {
195- synced : make (chan struct {}),
196- machineClassByName : map [string ]* iri.MachineClassStatus {},
197- machineClassByCapabilities : map [capabilities ][] * iri. MachineClassStatus {},
198- listener : sets .New [* listener ](),
199- machineRuntime : runtime ,
200- relistPeriod : opts .RelistPeriod ,
199+ synced : make (chan struct {}),
200+ machineClassByName : map [string ]* iri.MachineClassStatus {},
201+ machineClassCapabilities : map [machineClassQuantity ] capabilities {},
202+ listener : sets .New [* listener ](),
203+ machineRuntime : runtime ,
204+ relistPeriod : opts .RelistPeriod ,
201205 }
202206}
203207
0 commit comments