Skip to content

Commit 828f0d0

Browse files
Fix servermaintenance deletion logic
Signed-off-by: Nagadeesh Nagaraja <nagdeesh@gmail.com>
1 parent 1636209 commit 828f0d0

2 files changed

Lines changed: 81 additions & 4 deletions

File tree

internal/controller/servermaintenance_controller.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,16 +343,25 @@ func (r *ServerMaintenanceReconciler) handleFailedState(ctx context.Context, _ *
343343
func (r *ServerMaintenanceReconciler) delete(ctx context.Context, maintenance *metalv1alpha1.ServerMaintenance) (ctrl.Result, error) {
344344
log := ctrl.LoggerFrom(ctx)
345345
log.V(1).Info("Deleting ServerMaintenance")
346+
if !controllerutil.ContainsFinalizer(maintenance, serverMaintenanceFinalizer) {
347+
return ctrl.Result{}, nil
348+
}
346349
if maintenance.Spec.ServerRef == nil {
347350
return ctrl.Result{}, nil
348351
}
349352
server, err := GetServerByName(ctx, r.Client, maintenance.Spec.ServerRef.Name)
350-
if err != nil {
351-
return ctrl.Result{}, err
352-
}
353-
if err := r.cleanup(ctx, server); err != nil {
353+
if err == nil {
354+
if err := r.cleanup(ctx, server); err != nil {
355+
return ctrl.Result{}, err
356+
}
357+
} else if apierrors.IsNotFound(err) {
358+
// note: if the server is already deleted, we can skip the cleanup and just remove the finalizer
359+
// if its transent error of server not found, the servermaintenance will be deleted and server will free up the ref automatically once this is deleted
360+
log.V(1).Info("Server not found, continue with cleanup", "Server", maintenance.Spec.ServerRef.Name)
361+
} else {
354362
return ctrl.Result{}, err
355363
}
364+
356365
log.V(1).Info("Removed dependencies")
357366

358367
log.V(1).Info("Ensuring that the finalizer is removed")

internal/controller/servermaintenance_controller_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,4 +541,72 @@ var _ = Describe("ServerMaintenance Controller", func() {
541541
Expect(k8sClient.Delete(ctx, unsetPriorityMaintenance)).To(Succeed())
542542
Expect(k8sClient.Delete(ctx, serverClaim)).To(Succeed())
543543
})
544+
545+
It("should complete deletion when the referenced Server is already gone", func(ctx SpecContext) {
546+
By("Creating a ServerMaintenance object")
547+
serverMaintenance := &metalv1alpha1.ServerMaintenance{
548+
ObjectMeta: metav1.ObjectMeta{
549+
Name: "test-server-maintenance-server-gone",
550+
Namespace: ns.Name,
551+
},
552+
Spec: metalv1alpha1.ServerMaintenanceSpec{
553+
ServerRef: &corev1.LocalObjectReference{Name: server.Name},
554+
Policy: metalv1alpha1.ServerMaintenancePolicyEnforced,
555+
ServerPower: metalv1alpha1.PowerOff,
556+
},
557+
}
558+
Expect(k8sClient.Create(ctx, serverMaintenance)).To(Succeed())
559+
560+
By("Waiting for the ServerMaintenance to reach InMaintenance state")
561+
Eventually(Object(serverMaintenance)).Should(
562+
HaveField("Status.State", metalv1alpha1.ServerMaintenanceStateInMaintenance),
563+
)
564+
565+
By("Deleting the Server before deleting the ServerMaintenance")
566+
Expect(k8sClient.Delete(ctx, server)).To(Succeed())
567+
Eventually(Get(server)).ShouldNot(Succeed())
568+
569+
By("Deleting the ServerMaintenance")
570+
Expect(k8sClient.Delete(ctx, serverMaintenance)).To(Succeed())
571+
572+
By("Ensuring the ServerMaintenance is fully deleted despite the Server being gone")
573+
Eventually(Get(serverMaintenance)).ShouldNot(Succeed())
574+
})
575+
576+
It("should skip cleanup and remove finalizer when no finalizer is present on deletion", func(ctx SpecContext) {
577+
By("Creating a ServerMaintenance object without going through reconciliation (no finalizer)")
578+
serverMaintenance := &metalv1alpha1.ServerMaintenance{
579+
ObjectMeta: metav1.ObjectMeta{
580+
Name: "test-server-maintenance-no-finalizer",
581+
Namespace: ns.Name,
582+
},
583+
Spec: metalv1alpha1.ServerMaintenanceSpec{
584+
ServerRef: &corev1.LocalObjectReference{Name: server.Name},
585+
Policy: metalv1alpha1.ServerMaintenancePolicyEnforced,
586+
ServerPower: metalv1alpha1.PowerOff,
587+
},
588+
}
589+
Expect(k8sClient.Create(ctx, serverMaintenance)).To(Succeed())
590+
591+
By("Waiting for the finalizer to be added by the reconciler")
592+
Eventually(Object(serverMaintenance)).Should(
593+
HaveField("Finalizers", ContainElement(serverMaintenanceFinalizer)),
594+
)
595+
596+
By("Manually removing the finalizer to simulate a no-finalizer state")
597+
Eventually(Update(serverMaintenance, func() {
598+
serverMaintenance.Finalizers = nil
599+
})).Should(Succeed())
600+
601+
By("Deleting the ServerMaintenance")
602+
Expect(k8sClient.Delete(ctx, serverMaintenance)).To(Succeed())
603+
604+
By("Ensuring the ServerMaintenance is deleted immediately without cleanup side-effects")
605+
Eventually(Get(serverMaintenance)).ShouldNot(Succeed())
606+
607+
By("Ensuring the Server was not modified during deletion")
608+
Consistently(Object(server)).Should(
609+
HaveField("Spec.ServerMaintenanceRef", BeNil()),
610+
)
611+
})
544612
})

0 commit comments

Comments
 (0)