Merge 6fcb5034e1 into a9292351c3
This commit is contained in:
commit
ec38f34f82
|
|
@ -17,10 +17,12 @@ limitations under the License.
|
||||||
package simulator
|
package simulator
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
apiv1 "k8s.io/api/core/v1"
|
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/core/scaledown/pdb"
|
||||||
"k8s.io/autoscaler/cluster-autoscaler/simulator/clustersnapshot"
|
"k8s.io/autoscaler/cluster-autoscaler/simulator/clustersnapshot"
|
||||||
"k8s.io/autoscaler/cluster-autoscaler/simulator/drainability/rules"
|
"k8s.io/autoscaler/cluster-autoscaler/simulator/drainability/rules"
|
||||||
|
|
@ -91,6 +93,8 @@ const (
|
||||||
BlockedByPod
|
BlockedByPod
|
||||||
// UnexpectedError - node can't be removed because of an unexpected error.
|
// UnexpectedError - node can't be removed because of an unexpected error.
|
||||||
UnexpectedError
|
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.
|
// RemovalSimulator is a helper object for simulating node removal scenarios.
|
||||||
|
|
@ -151,6 +155,12 @@ func (r *RemovalSimulator) SimulateNodeRemoval(
|
||||||
nodeInfo, err := r.clusterSnapshot.GetNodeInfo(nodeName)
|
nodeInfo, err := r.clusterSnapshot.GetNodeInfo(nodeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
klog.Errorf("Can't retrieve node %s from snapshot, err: %v", nodeName, err)
|
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)
|
klog.V(2).Infof("Simulating node %s removal", nodeName)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,9 @@ func TestFindNodesToRemove(t *testing.T) {
|
||||||
fullNode := BuildTestNode("n4", 1000, 2000000)
|
fullNode := BuildTestNode("n4", 1000, 2000000)
|
||||||
fullNodeInfo := framework.NewTestNodeInfo(fullNode)
|
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(emptyNode, true, time.Time{})
|
||||||
SetNodeReadyState(drainableNode, true, time.Time{})
|
SetNodeReadyState(drainableNode, true, time.Time{})
|
||||||
SetNodeReadyState(nonDrainableNode, true, time.Time{})
|
SetNodeReadyState(nonDrainableNode, true, time.Time{})
|
||||||
|
|
@ -137,6 +140,10 @@ func TestFindNodesToRemove(t *testing.T) {
|
||||||
Node: drainableNode,
|
Node: drainableNode,
|
||||||
PodsToReschedule: []*apiv1.Pod{pod1, pod2},
|
PodsToReschedule: []*apiv1.Pod{pod1, pod2},
|
||||||
}
|
}
|
||||||
|
nodeWithoutInfoUnremovable := UnremovableNode{
|
||||||
|
Node: nodeWithoutInfo,
|
||||||
|
Reason: NoNodeInfo,
|
||||||
|
}
|
||||||
|
|
||||||
clusterSnapshot := testsnapshot.NewTestSnapshotOrDie(t)
|
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}},
|
{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 {
|
for _, test := range tests {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue