Skip to content

Commit 7e694d6

Browse files
committed
fix(cluster-autoscaler): prevent panic in SimulateNodeRemoval by handling missing node info
1 parent d9d2e0f commit 7e694d6

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

cluster-autoscaler/simulator/cluster.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ limitations under the License.
1717
package simulator
1818

1919
import (
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

Comments
 (0)