Skip to content

Commit c866f34

Browse files
committed
Fix ServerMaintenance not deleted when referenced Server is gone
Closes #367 Signed-off-by: Stefan Hipfel <stefan.hipfel@sap.com>
1 parent ebebc1d commit c866f34

2 files changed

Lines changed: 65 additions & 2 deletions

File tree

internal/controller/servermaintenance_controller.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ func (r *ServerMaintenanceReconciler) reconcile(ctx context.Context, maintenance
7373
server := &metalv1alpha1.Server{}
7474
if err := r.Get(ctx, client.ObjectKey{Name: maintenance.Spec.ServerRef.Name}, server); err != nil {
7575
if apierrors.IsNotFound(err) {
76+
log.V(1).Info("Referenced Server not found, deleting ServerMaintenance")
77+
if err := r.Delete(ctx, maintenance); err != nil {
78+
return ctrl.Result{}, client.IgnoreNotFound(err)
79+
}
7680
return ctrl.Result{}, nil
7781
}
7882
return ctrl.Result{}, fmt.Errorf("failed to get Server: %w", err)
@@ -353,7 +357,10 @@ func (r *ServerMaintenanceReconciler) delete(ctx context.Context, maintenance *m
353357
}
354358
server, err := GetServerByName(ctx, r.Client, maintenance.Spec.ServerRef.Name)
355359
if err != nil {
356-
return ctrl.Result{}, err
360+
if !apierrors.IsNotFound(err) {
361+
return ctrl.Result{}, err
362+
}
363+
server = nil
357364
}
358365
if err := r.cleanup(ctx, server); err != nil {
359366
return ctrl.Result{}, err

internal/controller/servermaintenance_controller_test.go

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
. "github.com/onsi/gomega"
1111
corev1 "k8s.io/api/core/v1"
1212
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13+
"sigs.k8s.io/controller-runtime/pkg/client"
1314
. "sigs.k8s.io/controller-runtime/pkg/envtest/komega"
1415
)
1516

@@ -57,7 +58,7 @@ var _ = Describe("ServerMaintenance Controller", func() {
5758
})
5859

5960
AfterEach(func(ctx SpecContext) {
60-
Expect(k8sClient.Delete(ctx, server)).To(Succeed())
61+
Expect(client.IgnoreNotFound(k8sClient.Delete(ctx, server))).To(Succeed())
6162
Expect(k8sClient.Delete(ctx, bmcSecret)).To(Succeed())
6263
EnsureCleanState()
6364
})
@@ -554,4 +555,59 @@ var _ = Describe("ServerMaintenance Controller", func() {
554555
Expect(k8sClient.Delete(ctx, unsetPriorityMaintenance)).To(Succeed())
555556
Expect(k8sClient.Delete(ctx, serverClaim)).To(Succeed())
556557
})
558+
559+
It("should delete ServerMaintenance when its referenced Server no longer exists", func(ctx SpecContext) {
560+
By("Creating a ServerMaintenance object")
561+
serverMaintenance := &metalv1alpha1.ServerMaintenance{
562+
ObjectMeta: metav1.ObjectMeta{
563+
Name: "test-server-maintenance-orphan",
564+
Namespace: ns.Name,
565+
},
566+
Spec: metalv1alpha1.ServerMaintenanceSpec{
567+
ServerRef: &corev1.LocalObjectReference{Name: server.Name},
568+
Policy: metalv1alpha1.ServerMaintenancePolicyEnforced,
569+
},
570+
}
571+
Expect(k8sClient.Create(ctx, serverMaintenance)).To(Succeed())
572+
573+
By("Deleting the Server")
574+
Expect(k8sClient.Delete(ctx, server)).To(Succeed())
575+
Eventually(Get(server)).ShouldNot(Succeed())
576+
577+
By("Expecting the ServerMaintenance to be deleted automatically")
578+
Eventually(Get(serverMaintenance)).ShouldNot(Succeed())
579+
})
580+
581+
It("should complete deletion of ServerMaintenance with finalizer when referenced Server is gone", func(ctx SpecContext) {
582+
By("Patching server to Initial State so ServerMaintenance can add its finalizer")
583+
Eventually(UpdateStatus(server, func() {
584+
server.Status.State = metalv1alpha1.ServerStateInitial
585+
})).Should(Succeed())
586+
587+
By("Creating a ServerMaintenance object")
588+
serverMaintenance := &metalv1alpha1.ServerMaintenance{
589+
ObjectMeta: metav1.ObjectMeta{
590+
Name: "test-server-maintenance-finalizer",
591+
Namespace: ns.Name,
592+
},
593+
Spec: metalv1alpha1.ServerMaintenanceSpec{
594+
ServerRef: &corev1.LocalObjectReference{Name: server.Name},
595+
Policy: metalv1alpha1.ServerMaintenancePolicyEnforced,
596+
},
597+
}
598+
Expect(k8sClient.Create(ctx, serverMaintenance)).To(Succeed())
599+
600+
By("Waiting for the finalizer to be added")
601+
Eventually(Object(serverMaintenance)).Should(HaveField("Finalizers", ContainElement(serverMaintenanceFinalizer)))
602+
603+
By("Deleting the Server first")
604+
Expect(k8sClient.Delete(ctx, server)).To(Succeed())
605+
Eventually(Get(server)).ShouldNot(Succeed())
606+
607+
By("Deleting the ServerMaintenance")
608+
Expect(k8sClient.Delete(ctx, serverMaintenance)).To(Succeed())
609+
610+
By("Expecting the ServerMaintenance finalizer to be removed and resource to be deleted")
611+
Eventually(Get(serverMaintenance)).ShouldNot(Succeed())
612+
})
557613
})

0 commit comments

Comments
 (0)