@@ -29,6 +29,7 @@ import (
29
29
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
30
30
"k8s.io/apimachinery/pkg/labels"
31
31
kerrors "k8s.io/apimachinery/pkg/util/errors"
32
+ "k8s.io/apimachinery/pkg/util/sets"
32
33
"k8s.io/apimachinery/pkg/util/wait"
33
34
"k8s.io/apiserver/pkg/storage/names"
34
35
"k8s.io/client-go/tools/record"
@@ -613,7 +614,6 @@ func (r *Reconciler) computeDesiredMachine(machineSet *clusterv1.MachineSet, exi
613
614
OwnerReferences : []metav1.OwnerReference {* metav1 .NewControllerRef (machineSet , machineSetKind )},
614
615
Labels : map [string ]string {},
615
616
Annotations : map [string ]string {},
616
- Finalizers : []string {clusterv1 .MachineFinalizer },
617
617
},
618
618
Spec : * machineSet .Spec .Template .Spec .DeepCopy (),
619
619
}
@@ -635,10 +635,34 @@ func (r *Reconciler) computeDesiredMachine(machineSet *clusterv1.MachineSet, exi
635
635
// Note: we use UID to force SSA to update the existing Machine and to not accidentally create a new Machine.
636
636
// infrastructureRef and bootstrap.configRef remain the same for an existing Machine.
637
637
if existingMachine != nil {
638
+ // Update case.
638
639
desiredMachine .SetName (existingMachine .Name )
639
640
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
+
640
655
desiredMachine .Spec .Bootstrap .ConfigRef = existingMachine .Spec .Bootstrap .ConfigRef
641
656
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
642
666
}
643
667
644
668
// Set the in-place mutable fields.
0 commit comments