@@ -17,10 +17,12 @@ limitations under the License.
1717package simulator
1818
1919import (
20+ "errors"
2021 "fmt"
2122 "time"
2223
2324 apiv1 "k8s.io/api/core/v1"
25+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426 "k8s.io/autoscaler/cluster-autoscaler/core/scaledown/pdb"
2527 "k8s.io/autoscaler/cluster-autoscaler/simulator/clustersnapshot"
2628 "k8s.io/autoscaler/cluster-autoscaler/simulator/drainability/rules"
@@ -91,6 +93,8 @@ const (
9193 BlockedByPod
9294 // UnexpectedError - node can't be removed because of an unexpected error.
9395 UnexpectedError
96+ // NoNodeInfo - node can't be removed because it doesn't have any node info in the cluster snapshot.
97+ NoNodeInfo
9498)
9599
96100// RemovalSimulator is a helper object for simulating node removal scenarios.
@@ -151,6 +155,12 @@ func (r *RemovalSimulator) SimulateNodeRemoval(
151155 nodeInfo , err := r .clusterSnapshot .GetNodeInfo (nodeName )
152156 if err != nil {
153157 klog .Errorf ("Can't retrieve node %s from snapshot, err: %v" , nodeName , err )
158+ unremovableReason := UnexpectedError
159+ if errors .Is (err , clustersnapshot .ErrNodeNotFound ) {
160+ unremovableReason = NoNodeInfo
161+ }
162+ unremovableNode := & UnremovableNode {Node : & apiv1.Node {ObjectMeta : metav1.ObjectMeta {Name : nodeName }}, Reason : unremovableReason }
163+ return nil , unremovableNode
154164 }
155165 klog .V (2 ).Infof ("Simulating node %s removal" , nodeName )
156166
0 commit comments