Skip to content

Commit b7115db

Browse files
authored
Merge pull request #8465 from MaximilianoUribe/muribefalcon/feature-adding-force-delete
feature: adding support for force delete into azure
2 parents 45d513d + d88d1ab commit b7115db

File tree

3 files changed

+56
-30
lines changed

3 files changed

+56
-30
lines changed

cluster-autoscaler/cloudprovider/azure/azure_agent_pool.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -429,14 +429,14 @@ func (as *AgentPool) DeleteInstances(instances []*azureRef) error {
429429
}
430430
}
431431

432-
klog.V(6).Infof("DeleteInstances: invalidating cache")
432+
klog.V(3).Infof("DeleteInstances: invalidating cache")
433433
as.manager.invalidateCache()
434434
return nil
435435
}
436436

437437
// DeleteNodes deletes the nodes from the group.
438438
func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
439-
klog.V(6).Infof("Delete nodes requested: %v\n", nodes)
439+
klog.V(3).Infof("Delete nodes requested: %v\n", nodes)
440440
indexes, _, err := as.GetVMIndexes()
441441
if err != nil {
442442
return err
@@ -446,6 +446,11 @@ func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
446446
return fmt.Errorf("min size reached, nodes will not be deleted")
447447
}
448448

449+
return as.ForceDeleteNodes(nodes)
450+
}
451+
452+
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
453+
func (as *AgentPool) ForceDeleteNodes(nodes []*apiv1.Node) error {
449454
refs := make([]*azureRef, 0, len(nodes))
450455
for _, node := range nodes {
451456
belongs, err := as.Belongs(node)
@@ -463,19 +468,14 @@ func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
463468
refs = append(refs, ref)
464469
}
465470

466-
err = as.deleteOutdatedDeployments()
471+
err := as.deleteOutdatedDeployments()
467472
if err != nil {
468-
klog.Warningf("DeleteNodes: failed to cleanup outdated deployments with err: %v.", err)
473+
klog.Warningf("ForceDeleteNodes: failed to cleanup outdated deployments with err: %v.", err)
469474
}
470475

471476
return as.DeleteInstances(refs)
472477
}
473478

474-
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
475-
func (as *AgentPool) ForceDeleteNodes(nodes []*apiv1.Node) error {
476-
return cloudprovider.ErrNotImplemented
477-
}
478-
479479
// Debug returns a debug string for the agent pool.
480480
func (as *AgentPool) Debug() string {
481481
return fmt.Sprintf("%s (%d:%d)", as.Name, as.MinSize(), as.MaxSize())

cluster-autoscaler/cloudprovider/azure/azure_agent_pool_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,46 @@ func TestDeleteInstances(t *testing.T) {
410410
assert.Equal(t, expectedErr, err)
411411
}
412412

413+
func TestForceDeleteNodes(t *testing.T) {
414+
ctrl := gomock.NewController(t)
415+
defer ctrl.Finish()
416+
417+
as := newTestAgentPool(newTestAzureManager(t), "as")
418+
as1 := newTestAgentPool(newTestAzureManager(t), "as1")
419+
as.manager.azureCache.instanceToNodeGroup[azureRef{Name: testValidProviderID0}] = as
420+
as.manager.azureCache.instanceToNodeGroup[azureRef{Name: testValidProviderID1}] = as1
421+
as.manager.azureCache.instanceToNodeGroup[azureRef{Name: testInvalidProviderID}] = as
422+
423+
mockVMClient := mockvmclient.NewMockInterface(ctrl)
424+
as.manager.azClient.virtualMachinesClient = mockVMClient
425+
426+
mockSAClient := mockstorageaccountclient.NewMockInterface(ctrl)
427+
as.manager.azClient.storageAccountsClient = mockSAClient
428+
429+
err := as.ForceDeleteNodes([]*apiv1.Node{})
430+
assert.NoError(t, err)
431+
432+
nodes := []*apiv1.Node{
433+
{
434+
Spec: apiv1.NodeSpec{ProviderID: testInvalidProviderID},
435+
ObjectMeta: v1.ObjectMeta{Name: "node"},
436+
},
437+
}
438+
err = as.ForceDeleteNodes(nodes)
439+
expectedErr := fmt.Errorf("resource name was missing from identifier")
440+
assert.Equal(t, expectedErr, err)
441+
442+
nodes = []*apiv1.Node{
443+
{
444+
Spec: apiv1.NodeSpec{ProviderID: testValidProviderID1},
445+
ObjectMeta: v1.ObjectMeta{Name: "node1"},
446+
},
447+
}
448+
err = as.ForceDeleteNodes(nodes)
449+
expectedErr = fmt.Errorf("node1 belongs to a different asg than as")
450+
assert.Equal(t, expectedErr, err)
451+
}
452+
413453
func TestAgentPoolDeleteNodes(t *testing.T) {
414454
ctrl := gomock.NewController(t)
415455
defer ctrl.Finish()

cluster-autoscaler/cloudprovider/azure/azure_scale_set.go

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ func (scaleSet *ScaleSet) waitForDeleteInstances(future *azure.Future, requiredI
589589

590590
// DeleteNodes deletes the nodes from the group.
591591
func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
592-
klog.V(8).Infof("Delete nodes requested: %q\n", nodes)
592+
klog.V(3).Infof("Delete nodes requested: %q\n", nodes)
593593
size, err := scaleSet.getScaleSetSize()
594594
if err != nil {
595595
return err
@@ -598,12 +598,14 @@ func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
598598
if int(size) <= scaleSet.MinSize() {
599599
return fmt.Errorf("min size reached, nodes will not be deleted")
600600
}
601+
return scaleSet.ForceDeleteNodes(nodes)
602+
}
601603

602-
// Distinguish between unregistered node deletion and normal node deletion
604+
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
605+
func (scaleSet *ScaleSet) ForceDeleteNodes(nodes []*apiv1.Node) error {
606+
klog.V(3).Infof("Delete nodes requested: %q\n", nodes)
603607
refs := make([]*azureRef, 0, len(nodes))
604608
hasUnregisteredNodes := false
605-
unregisteredRefs := make([]*azureRef, 0, len(nodes))
606-
607609
for _, node := range nodes {
608610
belongs, err := scaleSet.Belongs(node)
609611
if err != nil {
@@ -620,28 +622,12 @@ func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
620622
ref := &azureRef{
621623
Name: node.Spec.ProviderID,
622624
}
623-
624-
if node.Annotations[cloudprovider.FakeNodeReasonAnnotation] == cloudprovider.FakeNodeUnregistered {
625-
klog.V(5).Infof("Node: %s type is unregistered..Appending to the unregistered list", node.Name)
626-
unregisteredRefs = append(unregisteredRefs, ref)
627-
} else {
628-
refs = append(refs, ref)
629-
}
630-
}
631-
632-
if len(unregisteredRefs) > 0 {
633-
klog.V(3).Infof("Removing unregisteredNodes: %v", unregisteredRefs)
634-
return scaleSet.DeleteInstances(unregisteredRefs, true)
625+
refs = append(refs, ref)
635626
}
636627

637628
return scaleSet.DeleteInstances(refs, hasUnregisteredNodes)
638629
}
639630

640-
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
641-
func (scaleSet *ScaleSet) ForceDeleteNodes(nodes []*apiv1.Node) error {
642-
return cloudprovider.ErrNotImplemented
643-
}
644-
645631
// Id returns ScaleSet id.
646632
func (scaleSet *ScaleSet) Id() string {
647633
return scaleSet.Name

0 commit comments

Comments
 (0)