@@ -29,6 +29,14 @@ import (
2929 "sigs.k8s.io/controller-runtime/pkg/client/fake"
3030)
3131
32+ func testMaintenanceResourceReference () MaintenanceResourceReference {
33+ return MaintenanceResourceReference {
34+ Version : "v1alpha1" ,
35+ APIGroup : "janitor.dgxc.nvidia.com" ,
36+ Kind : "RebootNode" ,
37+ }
38+ }
39+
3240func TestGetRemediationState (t * testing.T ) {
3341 ctx := context .Background ()
3442 nodeName := "test-node"
@@ -144,7 +152,7 @@ func TestUpdateRemediationState(t *testing.T) {
144152 resourceRef := MaintenanceResourceReference {
145153 Namespace : "dgxc-janitor" ,
146154 Version : "v1alpha1" ,
147- ApiGroup : "janitor.dgxc.nvidia.com" ,
155+ APIGroup : "janitor.dgxc.nvidia.com" ,
148156 Kind : "RebootNode" ,
149157 }
150158 node := & corev1.Node {
@@ -168,10 +176,63 @@ func TestUpdateRemediationState(t *testing.T) {
168176 assert .Equal (t , actionName , state .EquivalenceGroups [group ].ActionName )
169177 assert .Equal (t , resourceRef .Namespace , state .EquivalenceGroups [group ].Namespace )
170178 assert .Equal (t , resourceRef .Version , state .EquivalenceGroups [group ].Version )
171- assert .Equal (t , resourceRef .ApiGroup , state .EquivalenceGroups [group ].ApiGroup )
179+ assert .Equal (t , resourceRef .APIGroup , state .EquivalenceGroups [group ].APIGroup )
172180 assert .Equal (t , resourceRef .Kind , state .EquivalenceGroups [group ].Kind )
173181}
174182
183+ func TestUpdateRemediationStateRejectsIncompleteReference (t * testing.T ) {
184+ nodeName := "node"
185+ node := & corev1.Node {
186+ ObjectMeta : metav1.ObjectMeta {
187+ Name : nodeName ,
188+ Annotations : map [string ]string {},
189+ },
190+ }
191+ client := fake .NewClientBuilder ().WithObjects (node ).Build ()
192+ annotationManager := NodeAnnotationManager {client : client }
193+
194+ err := annotationManager .UpdateRemediationState (
195+ context .TODO (),
196+ nodeName ,
197+ "test" ,
198+ "reboot" ,
199+ "reboot-action" ,
200+ MaintenanceResourceReference {Version : "v1alpha1" , Kind : "RebootNode" },
201+ )
202+ require .Error (t , err )
203+ assert .Contains (t , err .Error (), "apiGroup, version, and kind must be non-empty" )
204+ }
205+
206+ func TestUpdateRemediationStateAllowsClusterScopedReference (t * testing.T ) {
207+ group := "test"
208+ nodeName := "node"
209+ resourceRef := MaintenanceResourceReference {
210+ Version : "v1alpha1" ,
211+ APIGroup : "janitor.dgxc.nvidia.com" ,
212+ Kind : "RebootNode" ,
213+ }
214+ node := & corev1.Node {
215+ ObjectMeta : metav1.ObjectMeta {
216+ Name : nodeName ,
217+ Annotations : map [string ]string {},
218+ },
219+ }
220+ client := fake .NewClientBuilder ().WithObjects (node ).Build ()
221+ annotationManager := NodeAnnotationManager {client : client }
222+
223+ err := annotationManager .UpdateRemediationState (context .TODO (), nodeName , group , "reboot" , "reboot-action" , resourceRef )
224+ require .NoError (t , err )
225+
226+ updatedNode := & corev1.Node {}
227+ require .NoError (t , client .Get (context .TODO (), types.NamespacedName {Name : nodeName }, updatedNode ))
228+ assert .Contains (t , updatedNode .Annotations [AnnotationKey ], `"apiGroup":"janitor.dgxc.nvidia.com"` )
229+
230+ state , _ , err := annotationManager .GetRemediationState (context .TODO (), nodeName )
231+ require .NoError (t , err )
232+ assert .Empty (t , state .EquivalenceGroups [group ].Namespace )
233+ assert .Equal (t , resourceRef .APIGroup , state .EquivalenceGroups [group ].APIGroup )
234+ }
235+
175236func TestEnsureRemediationStateGVKBackfillsLegacyState (t * testing.T ) {
176237 nodeName := "node"
177238 createdAt := time .Now ().Add (- time .Hour ).UTC ()
@@ -195,7 +256,7 @@ func TestEnsureRemediationStateGVKBackfillsLegacyState(t *testing.T) {
195256 resourceRef := MaintenanceResourceReference {
196257 Namespace : "dgxc-janitor" ,
197258 Version : "v1alpha1" ,
198- ApiGroup : "janitor.dgxc.nvidia.com" ,
259+ APIGroup : "janitor.dgxc.nvidia.com" ,
199260 Kind : "RebootNode" ,
200261 }
201262 client := fake .NewClientBuilder ().WithObjects (node ).Build ()
@@ -215,7 +276,7 @@ func TestEnsureRemediationStateGVKBackfillsLegacyState(t *testing.T) {
215276 assert .Equal (t , createdAt .Unix (), groupState .CreatedAt .Unix ())
216277 assert .Equal (t , resourceRef .Namespace , groupState .Namespace )
217278 assert .Equal (t , resourceRef .Version , groupState .Version )
218- assert .Equal (t , resourceRef .ApiGroup , groupState .ApiGroup )
279+ assert .Equal (t , resourceRef .APIGroup , groupState .APIGroup )
219280 assert .Equal (t , resourceRef .Kind , groupState .Kind )
220281}
221282
@@ -248,7 +309,7 @@ func TestEnsureRemediationStateGVKDoesNotOverwriteExistingReference(t *testing.T
248309 "RESTART_BM" : {
249310 Namespace : "new-namespace" ,
250311 Version : "v2" ,
251- ApiGroup : "new.example.com" ,
312+ APIGroup : "new.example.com" ,
252313 Kind : "NewKind" ,
253314 },
254315 })
@@ -259,7 +320,7 @@ func TestEnsureRemediationStateGVKDoesNotOverwriteExistingReference(t *testing.T
259320
260321 groupState := state .EquivalenceGroups ["restart" ]
261322 assert .Equal (t , "old-namespace" , groupState .Namespace )
262- assert .Equal (t , "old.example.com" , groupState .ApiGroup )
323+ assert .Equal (t , "old.example.com" , groupState .APIGroup )
263324 assert .Equal (t , "v1" , groupState .Version )
264325 assert .Equal (t , "OldKind" , groupState .Kind )
265326}
@@ -394,10 +455,10 @@ func TestConcurrentUpdateAndRemoveGroupsFromState(t *testing.T) {
394455 for i := 0 ; i < iterations ; i ++ {
395456 // Reset state each iteration
396457 err := annotationManager .UpdateRemediationState (context .TODO (), nodeName , "existing-group-1" , "old-cr-1" ,
397- "RESTART_BM" , MaintenanceResourceReference {} )
458+ "RESTART_BM" , testMaintenanceResourceReference () )
398459 require .NoError (t , err )
399460 err = annotationManager .UpdateRemediationState (context .TODO (), nodeName , "existing-group-2" , "old-cr-2" ,
400- "COMPONENT_RESET" , MaintenanceResourceReference {} )
461+ "COMPONENT_RESET" , testMaintenanceResourceReference () )
401462 require .NoError (t , err )
402463
403464 var wg sync.WaitGroup
@@ -411,7 +472,7 @@ func TestConcurrentUpdateAndRemoveGroupsFromState(t *testing.T) {
411472 go func () {
412473 defer wg .Done ()
413474 _ = annotationManager .UpdateRemediationState (context .TODO (), nodeName , "new-group" , "new-cr" ,
414- "COMPONENT_RESET" , MaintenanceResourceReference {} )
475+ "COMPONENT_RESET" , testMaintenanceResourceReference () )
415476 }()
416477
417478 wg .Wait ()
0 commit comments