@@ -24,6 +24,7 @@ import (
2424)
2525
2626const (
27+ // ServerMaintenanceFinalizer is the finalizer for the ServerMaintenance resource.
2728 ServerMaintenanceFinalizer = "metal.ironcore.dev/servermaintenance"
2829)
2930
@@ -89,15 +90,13 @@ func (r *ServerMaintenanceReconciler) ensureServerMaintenanceStateTransition(ctx
8990 return r .handlePendingState (ctx , log , serverMaintenance )
9091 case metalv1alpha1 .ServerMaintenanceStateInMaintenance :
9192 return r .handleInMaintenanceState (ctx , log , serverMaintenance )
92- case metalv1alpha1 .ServerMaintenanceStateCompleted :
93- return r .handleCompletedState (ctx , log , serverMaintenance )
9493 case metalv1alpha1 .ServerMaintenanceStateFailed :
95- return r .handleFailedState (ctx , log , serverMaintenance )
94+ return r .handleFailedState (log , serverMaintenance )
9695 }
9796 return ctrl.Result {}, nil
9897}
9998
100- func (r * ServerMaintenanceReconciler ) handlePendingState (ctx context.Context , log logr.Logger , serverMaintenance * metalv1alpha1.ServerMaintenance ) (ctrl.Result , error ) {
99+ func (r * ServerMaintenanceReconciler ) handlePendingState (ctx context.Context , log logr.Logger , serverMaintenance * metalv1alpha1.ServerMaintenance ) (result ctrl.Result , err error ) {
101100 server , err := r .getServerRef (ctx , serverMaintenance )
102101 if err != nil {
103102 return ctrl.Result {}, err
@@ -110,6 +109,10 @@ func (r *ServerMaintenanceReconciler) handlePendingState(ctx context.Context, lo
110109 }
111110 if server .Spec .ServerClaimRef == nil {
112111 log .V (1 ).Info ("Server has no claim, move to maintenance right away" , "Server" , server .Name )
112+ if err = r .updateServerRef (ctx , log , serverMaintenance , server ); err != nil {
113+ log .Error (err , "failed to patch server maintenance ref" )
114+ return ctrl.Result {}, err
115+ }
113116 if modified , err := r .patchMaintenanceState (ctx , serverMaintenance , metalv1alpha1 .ServerMaintenanceStateInMaintenance ); err != nil || modified {
114117 return ctrl.Result {}, err
115118 }
@@ -142,12 +145,20 @@ func (r *ServerMaintenanceReconciler) handlePendingState(ctx context.Context, lo
142145 return ctrl.Result {}, nil
143146 }
144147 log .V (1 ).Info ("Server approved for maintenance" , "Server" , server .Name , "Maintenance" , serverMaintenance .Name )
148+ if err = r .updateServerRef (ctx , log , serverMaintenance , server ); err != nil {
149+ log .Error (err , "failed to patch server maintenance ref" )
150+ return ctrl.Result {}, err
151+ }
145152 if modified , err := r .patchMaintenanceState (ctx , serverMaintenance , metalv1alpha1 .ServerMaintenanceStateInMaintenance ); err != nil || modified {
146153 return ctrl.Result {}, err
147154 }
148155 }
149156 if serverMaintenance .Spec .Policy == metalv1alpha1 .ServerMaintenancePolicyEnforced {
150157 log .V (1 ).Info ("Enforcing maintenance" , "Server" , server .Name , "Maintenance" , serverMaintenance .Name )
158+ if err = r .updateServerRef (ctx , log , serverMaintenance , server ); err != nil {
159+ log .Error (err , "failed to patch server maintenance ref" )
160+ return ctrl.Result {}, err
161+ }
151162 if modified , err := r .patchMaintenanceState (ctx , serverMaintenance , metalv1alpha1 .ServerMaintenanceStateInMaintenance ); err != nil || modified {
152163 return ctrl.Result {}, err
153164 }
@@ -160,10 +171,6 @@ func (r *ServerMaintenanceReconciler) handleInMaintenanceState(ctx context.Conte
160171 if err != nil {
161172 return ctrl.Result {}, err
162173 }
163- // put server in maintenance
164- if err := r .patchServerRef (ctx , log , serverMaintenance , server ); err != nil {
165- return ctrl.Result {}, err
166- }
167174 config , err := r .applyServerBootConfiguration (ctx , log , serverMaintenance , server )
168175 if err != nil {
169176 return ctrl.Result {}, err
@@ -239,41 +246,29 @@ func (r *ServerMaintenanceReconciler) setAndPatchServerPowerState(ctx context.Co
239246 return nil
240247}
241248
242- func (r * ServerMaintenanceReconciler ) patchServerRef (ctx context.Context , log logr.Logger , maintenance * metalv1alpha1.ServerMaintenance , server * metalv1alpha1.Server ) error {
249+ func (r * ServerMaintenanceReconciler ) updateServerRef (ctx context.Context , log logr.Logger , maintenance * metalv1alpha1.ServerMaintenance , server * metalv1alpha1.Server ) error {
243250 if server .Spec .ServerMaintenanceRef != nil {
244251 log .V (1 ).Info ("Server is already in Maintenance" , "Server" , server .Name , "Maintenance" , server .Spec .ServerMaintenanceRef .Name )
245252 return nil
246253 }
247- if server .Spec .ServerMaintenanceRef == nil {
248- serverBase := server .DeepCopy ()
249- server .Spec .ServerMaintenanceRef = & v1.ObjectReference {
250- APIVersion : "metal.ironcore.dev/v1alpha1" ,
251- Kind : "ServerMaintenance" ,
252- Namespace : maintenance .Namespace ,
253- Name : maintenance .Name ,
254- UID : maintenance .UID ,
255- }
256- if err := r .Patch (ctx , server , client .MergeFrom (serverBase )); err != nil {
257- return fmt .Errorf ("failed to patch maintenance ref for server: %w" , err )
258- }
259- log .V (1 ).Info ("Patched ServerMaintenance reference on Server" , "Server" , server .Name , "ServerMaintenanceeRef" , maintenance .Name )
260- }
261- return nil
262- }
263-
264- func (r * ServerMaintenanceReconciler ) handleCompletedState (ctx context.Context , log logr.Logger , serverMaintenance * metalv1alpha1.ServerMaintenance ) (ctrl.Result , error ) {
265- server , err := r .getServerRef (ctx , serverMaintenance )
266- if err != nil {
267- return ctrl.Result {}, err
254+ server .Spec .ServerMaintenanceRef = & v1.ObjectReference {
255+ APIVersion : "metal.ironcore.dev/v1alpha1" ,
256+ Kind : "ServerMaintenance" ,
257+ Namespace : maintenance .Namespace ,
258+ Name : maintenance .Name ,
259+ UID : maintenance .UID ,
268260 }
269- log . V ( 1 ). Info ( "Server maintenance completed" , "Server" , server . Name )
270- if err := r .cleanup (ctx , log , server ); err != nil {
271- return ctrl. Result {} , err
261+ // use update to not overwrite ServerMaintenanceRef if another maintenance was quicker
262+ if err := r .Update (ctx , server ); err != nil {
263+ return fmt . Errorf ( "failed to patch maintenance ref for server: %w" , err )
272264 }
273- return ctrl.Result {}, nil
265+ log .V (1 ).Info ("Updated ServerMaintenance reference on Server" , "Server" , server .Name , "ServerMaintenanceeRef" , maintenance .Name )
266+
267+ return nil
274268}
275269
276- func (r * ServerMaintenanceReconciler ) handleFailedState (ctx context.Context , log logr.Logger , serverMaintenance * metalv1alpha1.ServerMaintenance ) (ctrl.Result , error ) {
270+ func (r * ServerMaintenanceReconciler ) handleFailedState (log logr.Logger , serverMaintenance * metalv1alpha1.ServerMaintenance ) (ctrl.Result , error ) {
271+ log .V (1 ).Info ("ServerMaintenance failed" , "ServerMaintenance" , serverMaintenance .Name )
277272 return ctrl.Result {}, nil
278273}
279274
0 commit comments