Merge 6fcb5034e1 into a9292351c3
This commit is contained in:
commit
ec38f34f82
|
|
@ -17,10 +17,12 @@ limitations under the License.
|
|||
package simulator
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
apiv1 "k8s.io/api/core/v1"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/autoscaler/cluster-autoscaler/core/scaledown/pdb"
|
||||
"k8s.io/autoscaler/cluster-autoscaler/simulator/clustersnapshot"
|
||||
"k8s.io/autoscaler/cluster-autoscaler/simulator/drainability/rules"
|
||||
|
|
@ -91,6 +93,8 @@ const (
|
|||
BlockedByPod
|
||||
// UnexpectedError - node can't be removed because of an unexpected error.
|
||||
UnexpectedError
|
||||
// NoNodeInfo - node can't be removed because it doesn't have any node info in the cluster snapshot.
|
||||
NoNodeInfo
|
||||
)
|
||||
|
||||
// RemovalSimulator is a helper object for simulating node removal scenarios.
|
||||
|
|
@ -151,6 +155,12 @@ func (r *RemovalSimulator) SimulateNodeRemoval(
|
|||
nodeInfo, err := r.clusterSnapshot.GetNodeInfo(nodeName)
|
||||
if err != nil {
|
||||
klog.Errorf("Can't retrieve node %s from snapshot, err: %v", nodeName, err)
|
||||
unremovableReason := UnexpectedError
|
||||
if errors.Is(err, clustersnapshot.ErrNodeNotFound) {
|
||||
unremovableReason = NoNodeInfo
|
||||
}
|
||||
unremovableNode := &UnremovableNode{Node: &apiv1.Node{ObjectMeta: metav1.ObjectMeta{Name: nodeName}}, Reason: unremovableReason}
|
||||
return nil, unremovableNode
|
||||
}
|
||||
klog.V(2).Infof("Simulating node %s removal", nodeName)
|
||||
|
||||
|
|
|
|||
|
|
@ -88,6 +88,9 @@ func TestFindNodesToRemove(t *testing.T) {
|
|||
fullNode := BuildTestNode("n4", 1000, 2000000)
|
||||
fullNodeInfo := framework.NewTestNodeInfo(fullNode)
|
||||
|
||||
// node with no info in cluster snapshot
|
||||
nodeWithoutInfo := &apiv1.Node{ObjectMeta: metav1.ObjectMeta{Name: "n5"}}
|
||||
|
||||
SetNodeReadyState(emptyNode, true, time.Time{})
|
||||
SetNodeReadyState(drainableNode, true, time.Time{})
|
||||
SetNodeReadyState(nonDrainableNode, true, time.Time{})
|
||||
|
|
@ -137,6 +140,10 @@ func TestFindNodesToRemove(t *testing.T) {
|
|||
Node: drainableNode,
|
||||
PodsToReschedule: []*apiv1.Pod{pod1, pod2},
|
||||
}
|
||||
nodeWithoutInfoUnremovable := UnremovableNode{
|
||||
Node: nodeWithoutInfo,
|
||||
Reason: NoNodeInfo,
|
||||
}
|
||||
|
||||
clusterSnapshot := testsnapshot.NewTestSnapshotOrDie(t)
|
||||
|
||||
|
|
@ -240,6 +247,14 @@ func TestFindNodesToRemove(t *testing.T) {
|
|||
{Node: topoNode3, Reason: BlockedByPod, BlockingPod: &drain.BlockingPod{Pod: blocker2, Reason: drain.NotReplicated}},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "candidate not in clusterSnapshot should be marked unremovable",
|
||||
candidates: []string{nodeWithoutInfo.Name},
|
||||
allNodes: []*apiv1.Node{},
|
||||
pods: []*apiv1.Pod{},
|
||||
toRemove: nil,
|
||||
unremovable: []*UnremovableNode{&nodeWithoutInfoUnremovable},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
|
|
|
|||
Loading…
Reference in New Issue