Skip to content

Commit 7c008ab

Browse files
committed
Fix finalizer calculation in MD/MS controller
Signed-off-by: Stefan Büringer [email protected]
1 parent 2568aa2 commit 7c008ab

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

internal/controllers/machinedeployment/machinedeployment_sync.go

+7-8
Original file line numberDiff line numberDiff line change
@@ -257,14 +257,13 @@ func (r *Reconciler) computeDesiredMachineSet(ctx context.Context, deployment *c
257257
name = existingMS.Name
258258
uid = existingMS.UID
259259

260-
// Keep foregroundDeletion finalizer if the existingMS has it.
261-
// Note: This case is a little different from the create case. In the update case we preserve
262-
// the finalizer on the MachineSet if it already exists. Because of SSA we should not build
263-
// the finalizer information from the MachineDeployment when updating a MachineSet because that could lead
264-
// to dropping the finalizer from the MachineSet if it is dropped from the MachineDeployment.
265-
// We should not drop the finalizer on the MachineSet if the finalizer is dropped from the MachineDeployment.
266-
if sets.New[string](existingMS.Finalizers...).Has(metav1.FinalizerDeleteDependents) {
267-
finalizers = []string{metav1.FinalizerDeleteDependents}
260+
// Preserve all existing finalizers (including foregroundDeletion finalizer).
261+
// Ensure MachineSet has foregroundDeletion finalizer if the MachineDeployment has it.
262+
// We should not drop the foregroundDeletion finalizer on the MachineSet if the finalizer is dropped from the MachineDeployment.
263+
finalizers = existingMS.Finalizers
264+
if sets.New[string](deployment.Finalizers...).Has(metav1.FinalizerDeleteDependents) &&
265+
!sets.New[string](finalizers...).Has(metav1.FinalizerDeleteDependents) {
266+
finalizers = append(finalizers, metav1.FinalizerDeleteDependents)
268267
}
269268

270269
replicas = *existingMS.Spec.Replicas

internal/controllers/machineset/machineset_controller.go

+25-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3030
"k8s.io/apimachinery/pkg/labels"
3131
kerrors "k8s.io/apimachinery/pkg/util/errors"
32+
"k8s.io/apimachinery/pkg/util/sets"
3233
"k8s.io/apimachinery/pkg/util/wait"
3334
"k8s.io/apiserver/pkg/storage/names"
3435
"k8s.io/client-go/tools/record"
@@ -613,7 +614,6 @@ func (r *Reconciler) computeDesiredMachine(machineSet *clusterv1.MachineSet, exi
613614
OwnerReferences: []metav1.OwnerReference{*metav1.NewControllerRef(machineSet, machineSetKind)},
614615
Labels: map[string]string{},
615616
Annotations: map[string]string{},
616-
Finalizers: []string{clusterv1.MachineFinalizer},
617617
},
618618
Spec: *machineSet.Spec.Template.Spec.DeepCopy(),
619619
}
@@ -635,10 +635,34 @@ func (r *Reconciler) computeDesiredMachine(machineSet *clusterv1.MachineSet, exi
635635
// Note: we use UID to force SSA to update the existing Machine and to not accidentally create a new Machine.
636636
// infrastructureRef and bootstrap.configRef remain the same for an existing Machine.
637637
if existingMachine != nil {
638+
// Update case.
638639
desiredMachine.SetName(existingMachine.Name)
639640
desiredMachine.SetUID(existingMachine.UID)
641+
642+
// Preserve all existing finalizers (including foregroundDeletion finalizer).
643+
// Ensure MachineFinalizer is set.
644+
// Ensure Machine has foregroundDeletion finalizer if the MachineSet has it.
645+
// We should not drop the foregroundDeletion finalizer on the Machine if the finalizer is dropped from the MachineSet.
646+
finalizers := existingMachine.Finalizers
647+
if !sets.New[string](finalizers...).Has(clusterv1.MachineFinalizer) {
648+
finalizers = append(finalizers, clusterv1.MachineFinalizer)
649+
}
650+
if sets.New[string](machineSet.Finalizers...).Has(metav1.FinalizerDeleteDependents) &&
651+
!sets.New[string](finalizers...).Has(metav1.FinalizerDeleteDependents) {
652+
finalizers = append(finalizers, metav1.FinalizerDeleteDependents)
653+
}
654+
640655
desiredMachine.Spec.Bootstrap.ConfigRef = existingMachine.Spec.Bootstrap.ConfigRef
641656
desiredMachine.Spec.InfrastructureRef = existingMachine.Spec.InfrastructureRef
657+
} else {
658+
// Create case.
659+
// Ensure MachineFinalizer is set.
660+
finalizers := []string{clusterv1.MachineFinalizer}
661+
// Add foregroundDeletion finalizer to Machine if the MachineSet has it.
662+
if sets.New[string](machineSet.Finalizers...).Has(metav1.FinalizerDeleteDependents) {
663+
finalizers = append(finalizers, metav1.FinalizerDeleteDependents)
664+
}
665+
desiredMachine.Finalizers = finalizers
642666
}
643667

644668
// Set the in-place mutable fields.

0 commit comments

Comments
 (0)