1515package devicecounts
1616
1717import (
18- "fmt"
19- "log/slog"
20- "reflect"
21-
2218 corev1 "k8s.io/api/core/v1"
2319 resourcev1 "k8s.io/api/resource/v1"
2420 "k8s.io/client-go/tools/cache"
@@ -48,56 +44,6 @@ func ResourceSlicesForNode(store cache.Store, node *corev1.Node) []*resourcev1.R
4844 return resourceSlices
4945}
5046
51- // NewResourceSliceEventHandlers returns informer handlers that reconcile nodes affected by ResourceSlice changes.
52- func NewResourceSliceEventHandlers (
53- allInformersSynced func () bool ,
54- updateNodeLabels func (string ) error ,
55- ) cache.ResourceEventHandlerFuncs {
56- return cache.ResourceEventHandlerFuncs {
57- AddFunc : func (obj any ) {
58- resourceSlice , ok := resourceSliceFromEventObject (obj )
59- if ! ok {
60- slog .Warn ("Skipping ResourceSlice add event with unexpected object type" ,
61- "type" , fmt .Sprintf ("%T" , obj ))
62-
63- return
64- }
65-
66- handleResourceSliceEvent (allInformersSynced , updateNodeLabels , resourceSlice )
67- },
68- UpdateFunc : func (oldObj , newObj any ) {
69- oldResourceSlice , oldOk := resourceSliceFromEventObject (oldObj )
70- newResourceSlice , newOk := resourceSliceFromEventObject (newObj )
71-
72- if ! oldOk || ! newOk {
73- slog .Warn ("Skipping ResourceSlice update event with unexpected object type" ,
74- "oldType" , fmt .Sprintf ("%T" , oldObj ), "newType" , fmt .Sprintf ("%T" , newObj ))
75-
76- return
77- }
78-
79- // Device-count expressions only read ResourceSlice spec; ignore metadata-only churn.
80- if reflect .DeepEqual (oldResourceSlice .Spec , newResourceSlice .Spec ) {
81- return
82- }
83-
84- // Reconcile nodes matched by both old and new specs in case node selection changed.
85- handleResourceSliceEvent (allInformersSynced , updateNodeLabels , oldResourceSlice , newResourceSlice )
86- },
87- DeleteFunc : func (obj any ) {
88- resourceSlice , ok := resourceSliceFromEventObject (obj )
89- if ! ok {
90- slog .Warn ("Skipping ResourceSlice delete event with unexpected object type" ,
91- "type" , fmt .Sprintf ("%T" , obj ))
92-
93- return
94- }
95-
96- handleResourceSliceEvent (allInformersSynced , updateNodeLabels , resourceSlice )
97- },
98- }
99- }
100-
10147func resourceSliceBelongsToNode (resourceSlice * resourcev1.ResourceSlice , nodeName string ) bool {
10248 resourceSliceNodeName , ok := resourceSliceNodeName (resourceSlice )
10349
@@ -111,52 +57,3 @@ func resourceSliceNodeName(resourceSlice *resourcev1.ResourceSlice) (string, boo
11157
11258 return * resourceSlice .Spec .NodeName , true
11359}
114-
115- func handleResourceSliceEvent (
116- allInformersSynced func () bool ,
117- updateNodeLabels func (string ) error ,
118- resourceSlices ... * resourcev1.ResourceSlice ,
119- ) {
120- if ! allInformersSynced () {
121- return
122- }
123-
124- for nodeName := range nodeNamesForResourceSlices (resourceSlices ... ) {
125- if err := updateNodeLabels (nodeName ); err != nil {
126- slog .Error ("Failed to reconcile node labels after ResourceSlice event" ,
127- "node" , nodeName , "error" , err )
128- }
129- }
130- }
131-
132- func nodeNamesForResourceSlices (resourceSlices ... * resourcev1.ResourceSlice ) map [string ]struct {} {
133- nodeNames := map [string ]struct {}{}
134-
135- for _ , resourceSlice := range resourceSlices {
136- nodeName , ok := resourceSliceNodeName (resourceSlice )
137- if ! ok {
138- continue
139- }
140-
141- nodeNames [nodeName ] = struct {}{}
142- }
143-
144- return nodeNames
145- }
146-
147- func resourceSliceFromEventObject (obj any ) (* resourcev1.ResourceSlice , bool ) {
148- resourceSlice , ok := obj .(* resourcev1.ResourceSlice )
149- if ok {
150- return resourceSlice , true
151- }
152-
153- // Delete events can arrive as tombstones when the informer misses the final object state.
154- tombstone , ok := obj .(cache.DeletedFinalStateUnknown )
155- if ! ok {
156- return nil , false
157- }
158-
159- resourceSlice , ok = tombstone .Obj .(* resourcev1.ResourceSlice )
160-
161- return resourceSlice , ok
162- }
0 commit comments