From c99da2a29da95d3f2bc158c3cb15a7acbd435bca Mon Sep 17 00:00:00 2001 From: Gagan163264 Date: Sat, 16 May 2026 02:25:46 +0530 Subject: [PATCH] Trigger node deletion when machine is deleted and update machine descriptions --- pkg/util/provider/machinecontroller/machine.go | 10 +++++++++- pkg/util/provider/machinecontroller/machine_test.go | 4 ++-- pkg/util/provider/machinecontroller/node.go | 8 ++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pkg/util/provider/machinecontroller/machine.go b/pkg/util/provider/machinecontroller/machine.go index fc05c38c76..a9a0e222bc 100644 --- a/pkg/util/provider/machinecontroller/machine.go +++ b/pkg/util/provider/machinecontroller/machine.go @@ -99,6 +99,14 @@ func (c *controller) deleteMachine(obj any) { } } c.enqueueMachineTermination(machine, "handling terminating machine object DELETE event") + + if c.targetCoreClient != nil { + if nodeName := machine.Labels[v1alpha1.NodeLabelKey]; nodeName != "" { + if err := c.targetCoreClient.CoreV1().Nodes().Delete(context.Background(), nodeName, metav1.DeleteOptions{}); err != nil && !apierrors.IsNotFound(err) { + klog.Errorf("Machine %q: failed to delete node %q: %v", machine.Name, nodeName, err) + } + } + } } // getKeyForObj returns key for object, else returns false @@ -519,7 +527,7 @@ func (c *controller) triggerCreationFlow(ctx context.Context, createMachineReque if machine.Status.CurrentStatus.Phase == "" || machine.Status.CurrentStatus.Phase == v1alpha1.MachineCrashLoopBackOff { clone := clone.DeepCopy() clone.Status.LastOperation = v1alpha1.LastOperation{ - Description: "Creating machine on cloud provider", + Description: "Creating machine on cloud provider. Waiting for node object to register", State: v1alpha1.MachineStateProcessing, Type: v1alpha1.MachineOperationCreate, LastUpdateTime: metav1.Now(), diff --git a/pkg/util/provider/machinecontroller/machine_test.go b/pkg/util/provider/machinecontroller/machine_test.go index 15f98f5098..634a617cf6 100644 --- a/pkg/util/provider/machinecontroller/machine_test.go +++ b/pkg/util/provider/machinecontroller/machine_test.go @@ -677,7 +677,7 @@ var _ = Describe("machine", func() { LastUpdateTime: metav1.Now(), }, LastOperation: v1alpha1.LastOperation{ - Description: "Creating machine on cloud provider", + Description: "Creating machine on cloud provider. Waiting for node object to register", State: v1alpha1.MachineStateProcessing, Type: v1alpha1.MachineOperationCreate, LastUpdateTime: metav1.Now(), @@ -722,7 +722,7 @@ var _ = Describe("machine", func() { LastUpdateTime: metav1.Now(), }, LastOperation: v1alpha1.LastOperation{ - Description: "Creating machine on cloud provider", + Description: "Creating machine on cloud provider. Waiting for node object to register", State: v1alpha1.MachineStateProcessing, Type: v1alpha1.MachineOperationCreate, LastUpdateTime: metav1.Now(), diff --git a/pkg/util/provider/machinecontroller/node.go b/pkg/util/provider/machinecontroller/node.go index 5a2f77ff94..036631dc52 100644 --- a/pkg/util/provider/machinecontroller/node.go +++ b/pkg/util/provider/machinecontroller/node.go @@ -68,6 +68,10 @@ func (c *controller) updateNode(oldObj, newObj any) { // as the update handler will be triggered again due to kubelet updates. machine, err := c.getMachineFromNode(node.Name) if err != nil { + if errors.Is(err, errNoMachineMatch) && node.DeletionTimestamp != nil { + c.enqueueNode(node, fmt.Sprintf("handling node UPDATE event. Node %q is being deleted with no backing machine", node.Name)) + return + } klog.Errorf("unable to handle update event for node %q, couldn't fetch associated machine. Error: %v", node.Name, err) return } @@ -153,6 +157,10 @@ func (c *controller) reconcileClusterNodeKey(key string) error { machine, err := c.getMachineFromNode(node.Name) if err != nil { if errors.Is(err, errNoMachineMatch) { + if node.DeletionTimestamp != nil { + klog.V(2).Infof("ClusterNode %q: Node is being deleted with no backing machine, removing finalizer", key) + return c.removeNodeFinalizers(ctx, node) + } klog.Errorf("ClusterNode %q: No machine found matching node, skipping adding finalizers", key) return nil }