From b24eb26939b0821cb3125f06b5db874acbbd4eba Mon Sep 17 00:00:00 2001 From: Stefan Bueringer Date: Tue, 3 Mar 2026 13:35:11 +0100 Subject: [PATCH] Avoid unsetting nodeDeletionTimeoutSeconds during Machine deletion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Büringer buringerst@vmware.com --- controlplane/kubeadm/internal/controllers/controller.go | 2 ++ internal/controllers/machineset/machineset_controller.go | 2 ++ internal/webhooks/machine.go | 9 +++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/controlplane/kubeadm/internal/controllers/controller.go b/controlplane/kubeadm/internal/controllers/controller.go index cae73ca376d5..f7e8fbb096e9 100644 --- a/controlplane/kubeadm/internal/controllers/controller.go +++ b/controlplane/kubeadm/internal/controllers/controller.go @@ -50,6 +50,7 @@ import ( "sigs.k8s.io/cluster-api/feature" "sigs.k8s.io/cluster-api/internal/util/inplace" "sigs.k8s.io/cluster-api/internal/util/ssa" + "sigs.k8s.io/cluster-api/internal/webhooks" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/cache" "sigs.k8s.io/cluster-api/util/collections" @@ -864,6 +865,7 @@ func (r *KubeadmControlPlaneReconciler) syncMachines(ctx context.Context, contro // Set all other in-place mutable fields that impact the ability to tear down existing machines. m.Spec.Deletion.NodeDrainTimeoutSeconds = controlPlane.KCP.Spec.MachineTemplate.Spec.Deletion.NodeDrainTimeoutSeconds m.Spec.Deletion.NodeDeletionTimeoutSeconds = controlPlane.KCP.Spec.MachineTemplate.Spec.Deletion.NodeDeletionTimeoutSeconds + webhooks.DefaultMachineNodeDeletionTimeoutSeconds(m) // Default to avoid unnecessary patch calls if field is not set on KCP. m.Spec.Deletion.NodeVolumeDetachTimeoutSeconds = controlPlane.KCP.Spec.MachineTemplate.Spec.Deletion.NodeVolumeDetachTimeoutSeconds m.Spec.Taints = controlPlane.KCP.Spec.MachineTemplate.Spec.Taints diff --git a/internal/controllers/machineset/machineset_controller.go b/internal/controllers/machineset/machineset_controller.go index a9311487637b..769a95ab6043 100644 --- a/internal/controllers/machineset/machineset_controller.go +++ b/internal/controllers/machineset/machineset_controller.go @@ -55,6 +55,7 @@ import ( clientutil "sigs.k8s.io/cluster-api/internal/util/client" "sigs.k8s.io/cluster-api/internal/util/inplace" "sigs.k8s.io/cluster-api/internal/util/ssa" + "sigs.k8s.io/cluster-api/internal/webhooks" "sigs.k8s.io/cluster-api/util" "sigs.k8s.io/cluster-api/util/annotations" "sigs.k8s.io/cluster-api/util/collections" @@ -665,6 +666,7 @@ func (r *Reconciler) syncMachines(ctx context.Context, s *scope) (ctrl.Result, b m.Spec.ReadinessGates = machineSet.Spec.Template.Spec.ReadinessGates m.Spec.Deletion.NodeDrainTimeoutSeconds = machineSet.Spec.Template.Spec.Deletion.NodeDrainTimeoutSeconds m.Spec.Deletion.NodeDeletionTimeoutSeconds = machineSet.Spec.Template.Spec.Deletion.NodeDeletionTimeoutSeconds + webhooks.DefaultMachineNodeDeletionTimeoutSeconds(m) // Default to avoid unnecessary patch calls if field is not set on MS. m.Spec.Deletion.NodeVolumeDetachTimeoutSeconds = machineSet.Spec.Template.Spec.Deletion.NodeVolumeDetachTimeoutSeconds m.Spec.MinReadySeconds = machineSet.Spec.Template.Spec.MinReadySeconds m.Spec.Taints = machineSet.Spec.Template.Spec.Taints diff --git a/internal/webhooks/machine.go b/internal/webhooks/machine.go index 843bd3bb984d..0274f9853097 100644 --- a/internal/webhooks/machine.go +++ b/internal/webhooks/machine.go @@ -63,11 +63,16 @@ func (webhook *Machine) Default(_ context.Context, m *clusterv1.Machine) error { m.Spec.Version = normalizedVersion } + DefaultMachineNodeDeletionTimeoutSeconds(m) + + return nil +} + +// DefaultMachineNodeDeletionTimeoutSeconds defaults the Machine NodeDeletionTimeoutSeconds field. +func DefaultMachineNodeDeletionTimeoutSeconds(m *clusterv1.Machine) { if m.Spec.Deletion.NodeDeletionTimeoutSeconds == nil { m.Spec.Deletion.NodeDeletionTimeoutSeconds = ptr.To(defaultNodeDeletionTimeoutSeconds) } - - return nil } // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type.