Merge pull request #8465 from MaximilianoUribe/muribefalcon/feature-adding-force-delete
feature: adding support for force delete into azure
This commit is contained in:
commit
b7115db52b
|
|
@ -429,14 +429,14 @@ func (as *AgentPool) DeleteInstances(instances []*azureRef) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
klog.V(6).Infof("DeleteInstances: invalidating cache")
|
klog.V(3).Infof("DeleteInstances: invalidating cache")
|
||||||
as.manager.invalidateCache()
|
as.manager.invalidateCache()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteNodes deletes the nodes from the group.
|
// DeleteNodes deletes the nodes from the group.
|
||||||
func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
|
func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
|
||||||
klog.V(6).Infof("Delete nodes requested: %v\n", nodes)
|
klog.V(3).Infof("Delete nodes requested: %v\n", nodes)
|
||||||
indexes, _, err := as.GetVMIndexes()
|
indexes, _, err := as.GetVMIndexes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -446,6 +446,11 @@ func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
|
||||||
return fmt.Errorf("min size reached, nodes will not be deleted")
|
return fmt.Errorf("min size reached, nodes will not be deleted")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return as.ForceDeleteNodes(nodes)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
|
||||||
|
func (as *AgentPool) ForceDeleteNodes(nodes []*apiv1.Node) error {
|
||||||
refs := make([]*azureRef, 0, len(nodes))
|
refs := make([]*azureRef, 0, len(nodes))
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
belongs, err := as.Belongs(node)
|
belongs, err := as.Belongs(node)
|
||||||
|
|
@ -463,19 +468,14 @@ func (as *AgentPool) DeleteNodes(nodes []*apiv1.Node) error {
|
||||||
refs = append(refs, ref)
|
refs = append(refs, ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = as.deleteOutdatedDeployments()
|
err := as.deleteOutdatedDeployments()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Warningf("DeleteNodes: failed to cleanup outdated deployments with err: %v.", err)
|
klog.Warningf("ForceDeleteNodes: failed to cleanup outdated deployments with err: %v.", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return as.DeleteInstances(refs)
|
return as.DeleteInstances(refs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
|
|
||||||
func (as *AgentPool) ForceDeleteNodes(nodes []*apiv1.Node) error {
|
|
||||||
return cloudprovider.ErrNotImplemented
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug returns a debug string for the agent pool.
|
// Debug returns a debug string for the agent pool.
|
||||||
func (as *AgentPool) Debug() string {
|
func (as *AgentPool) Debug() string {
|
||||||
return fmt.Sprintf("%s (%d:%d)", as.Name, as.MinSize(), as.MaxSize())
|
return fmt.Sprintf("%s (%d:%d)", as.Name, as.MinSize(), as.MaxSize())
|
||||||
|
|
|
||||||
|
|
@ -410,6 +410,46 @@ func TestDeleteInstances(t *testing.T) {
|
||||||
assert.Equal(t, expectedErr, err)
|
assert.Equal(t, expectedErr, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestForceDeleteNodes(t *testing.T) {
|
||||||
|
ctrl := gomock.NewController(t)
|
||||||
|
defer ctrl.Finish()
|
||||||
|
|
||||||
|
as := newTestAgentPool(newTestAzureManager(t), "as")
|
||||||
|
as1 := newTestAgentPool(newTestAzureManager(t), "as1")
|
||||||
|
as.manager.azureCache.instanceToNodeGroup[azureRef{Name: testValidProviderID0}] = as
|
||||||
|
as.manager.azureCache.instanceToNodeGroup[azureRef{Name: testValidProviderID1}] = as1
|
||||||
|
as.manager.azureCache.instanceToNodeGroup[azureRef{Name: testInvalidProviderID}] = as
|
||||||
|
|
||||||
|
mockVMClient := mockvmclient.NewMockInterface(ctrl)
|
||||||
|
as.manager.azClient.virtualMachinesClient = mockVMClient
|
||||||
|
|
||||||
|
mockSAClient := mockstorageaccountclient.NewMockInterface(ctrl)
|
||||||
|
as.manager.azClient.storageAccountsClient = mockSAClient
|
||||||
|
|
||||||
|
err := as.ForceDeleteNodes([]*apiv1.Node{})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
nodes := []*apiv1.Node{
|
||||||
|
{
|
||||||
|
Spec: apiv1.NodeSpec{ProviderID: testInvalidProviderID},
|
||||||
|
ObjectMeta: v1.ObjectMeta{Name: "node"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err = as.ForceDeleteNodes(nodes)
|
||||||
|
expectedErr := fmt.Errorf("resource name was missing from identifier")
|
||||||
|
assert.Equal(t, expectedErr, err)
|
||||||
|
|
||||||
|
nodes = []*apiv1.Node{
|
||||||
|
{
|
||||||
|
Spec: apiv1.NodeSpec{ProviderID: testValidProviderID1},
|
||||||
|
ObjectMeta: v1.ObjectMeta{Name: "node1"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err = as.ForceDeleteNodes(nodes)
|
||||||
|
expectedErr = fmt.Errorf("node1 belongs to a different asg than as")
|
||||||
|
assert.Equal(t, expectedErr, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestAgentPoolDeleteNodes(t *testing.T) {
|
func TestAgentPoolDeleteNodes(t *testing.T) {
|
||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
|
|
|
||||||
|
|
@ -589,7 +589,7 @@ func (scaleSet *ScaleSet) waitForDeleteInstances(future *azure.Future, requiredI
|
||||||
|
|
||||||
// DeleteNodes deletes the nodes from the group.
|
// DeleteNodes deletes the nodes from the group.
|
||||||
func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
|
func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
|
||||||
klog.V(8).Infof("Delete nodes requested: %q\n", nodes)
|
klog.V(3).Infof("Delete nodes requested: %q\n", nodes)
|
||||||
size, err := scaleSet.getScaleSetSize()
|
size, err := scaleSet.getScaleSetSize()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -598,12 +598,14 @@ func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
|
||||||
if int(size) <= scaleSet.MinSize() {
|
if int(size) <= scaleSet.MinSize() {
|
||||||
return fmt.Errorf("min size reached, nodes will not be deleted")
|
return fmt.Errorf("min size reached, nodes will not be deleted")
|
||||||
}
|
}
|
||||||
|
return scaleSet.ForceDeleteNodes(nodes)
|
||||||
|
}
|
||||||
|
|
||||||
// Distinguish between unregistered node deletion and normal node deletion
|
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
|
||||||
|
func (scaleSet *ScaleSet) ForceDeleteNodes(nodes []*apiv1.Node) error {
|
||||||
|
klog.V(3).Infof("Delete nodes requested: %q\n", nodes)
|
||||||
refs := make([]*azureRef, 0, len(nodes))
|
refs := make([]*azureRef, 0, len(nodes))
|
||||||
hasUnregisteredNodes := false
|
hasUnregisteredNodes := false
|
||||||
unregisteredRefs := make([]*azureRef, 0, len(nodes))
|
|
||||||
|
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
belongs, err := scaleSet.Belongs(node)
|
belongs, err := scaleSet.Belongs(node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -620,28 +622,12 @@ func (scaleSet *ScaleSet) DeleteNodes(nodes []*apiv1.Node) error {
|
||||||
ref := &azureRef{
|
ref := &azureRef{
|
||||||
Name: node.Spec.ProviderID,
|
Name: node.Spec.ProviderID,
|
||||||
}
|
}
|
||||||
|
|
||||||
if node.Annotations[cloudprovider.FakeNodeReasonAnnotation] == cloudprovider.FakeNodeUnregistered {
|
|
||||||
klog.V(5).Infof("Node: %s type is unregistered..Appending to the unregistered list", node.Name)
|
|
||||||
unregisteredRefs = append(unregisteredRefs, ref)
|
|
||||||
} else {
|
|
||||||
refs = append(refs, ref)
|
refs = append(refs, ref)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if len(unregisteredRefs) > 0 {
|
|
||||||
klog.V(3).Infof("Removing unregisteredNodes: %v", unregisteredRefs)
|
|
||||||
return scaleSet.DeleteInstances(unregisteredRefs, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
return scaleSet.DeleteInstances(refs, hasUnregisteredNodes)
|
return scaleSet.DeleteInstances(refs, hasUnregisteredNodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForceDeleteNodes deletes nodes from the group regardless of constraints.
|
|
||||||
func (scaleSet *ScaleSet) ForceDeleteNodes(nodes []*apiv1.Node) error {
|
|
||||||
return cloudprovider.ErrNotImplemented
|
|
||||||
}
|
|
||||||
|
|
||||||
// Id returns ScaleSet id.
|
// Id returns ScaleSet id.
|
||||||
func (scaleSet *ScaleSet) Id() string {
|
func (scaleSet *ScaleSet) Id() string {
|
||||||
return scaleSet.Name
|
return scaleSet.Name
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue