diff --git a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machinedeployment.go b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machinedeployment.go index 100c1ff6bbf8..8dc976185e91 100644 --- a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machinedeployment.go +++ b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machinedeployment.go @@ -99,15 +99,15 @@ func (r machineDeploymentScalableResource) SetSize(nreplicas int32) error { return updateErr } +func (r machineDeploymentScalableResource) UnmarkMachineForDeletion(machine *Machine) error { + return unmarkMachineForDeletion(r.controller, machine) +} + func (r machineDeploymentScalableResource) MarkMachineForDeletion(machine *Machine) error { u, err := r.controller.dynamicclient.Resource(*r.controller.machineResource).Namespace(machine.Namespace).Get(context.TODO(), machine.Name, metav1.GetOptions{}) - if err != nil { return err } - if u == nil { - return fmt.Errorf("unknown machine %s", machine.Name) - } u = u.DeepCopy() diff --git a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machineset.go b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machineset.go index 98655bfaf3b5..dc494e354f68 100644 --- a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machineset.go +++ b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_machineset.go @@ -86,13 +86,9 @@ func (r machineSetScalableResource) SetSize(nreplicas int32) error { func (r machineSetScalableResource) MarkMachineForDeletion(machine *Machine) error { u, err := r.controller.dynamicclient.Resource(*r.controller.machineResource).Namespace(machine.Namespace).Get(context.TODO(), machine.Name, metav1.GetOptions{}) - if err != nil { return err } - if u == nil { - return fmt.Errorf("unknown machine %s", machine.Name) - } u = u.DeepCopy() @@ -107,6 +103,10 @@ func (r machineSetScalableResource) MarkMachineForDeletion(machine *Machine) err return updateErr } +func (r machineSetScalableResource) UnmarkMachineForDeletion(machine *Machine) error { + return unmarkMachineForDeletion(r.controller, machine) +} + func newMachineSetScalableResource(controller *machineController, machineSet *MachineSet) (*machineSetScalableResource, error) { minSize, maxSize, err := parseScalingBounds(machineSet.Annotations) if err != nil { diff --git a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_nodegroup.go b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_nodegroup.go index 8c13da3cb296..b7401a5944a8 100644 --- a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_nodegroup.go +++ b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_nodegroup.go @@ -139,6 +139,7 @@ func (ng *nodegroup) DeleteNodes(nodes []*corev1.Node) error { } if err := ng.scalableResource.SetSize(replicas - 1); err != nil { + nodeGroup.scalableResource.UnmarkMachineForDeletion(machine) return err } diff --git a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_scalableresource.go b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_scalableresource.go index 6c47da3004db..24c443111936 100644 --- a/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_scalableresource.go +++ b/cluster-autoscaler/cloudprovider/clusterapi/clusterapi_scalableresource.go @@ -16,6 +16,12 @@ limitations under the License. package clusterapi +import ( + "context" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + // scalableResource is a resource that can be scaled up and down by // adjusting its replica count field. type scalableResource interface { @@ -46,4 +52,23 @@ type scalableResource interface { // MarkMachineForDeletion marks machine for deletion MarkMachineForDeletion(machine *Machine) error + + // UnmarkMachineForDeletion unmarks machine for deletion + UnmarkMachineForDeletion(machine *Machine) error +} + +func unmarkMachineForDeletion(controller *machineController, machine *Machine) error { + u, err := controller.dynamicclient.Resource(*controller.machineResource).Namespace(machine.Namespace).Get(context.TODO(), machine.Name, metav1.GetOptions{}) + if err != nil { + return err + } + + annotations := u.GetAnnotations() + if _, ok := annotations[machineDeleteAnnotationKey]; ok { + delete(annotations, machineDeleteAnnotationKey) + u.SetAnnotations(annotations) + _, updateErr := controller.dynamicclient.Resource(*controller.machineResource).Namespace(u.GetNamespace()).Update(context.TODO(), u, metav1.UpdateOptions{}) + return updateErr + } + return nil }