diff --git a/pkg/descheduler/pod/pods.go b/pkg/descheduler/pod/pods.go index 164fb43e4..8b2c3103a 100644 --- a/pkg/descheduler/pod/pods.go +++ b/pkg/descheduler/pod/pods.go @@ -292,6 +292,28 @@ func SortPodsBasedOnAge(pods []*v1.Pod) { }) } +// HasMatchingContainerWaitingState returns true if any container status has a +// waiting reason present in the given set. +func HasMatchingContainerWaitingState(statuses []v1.ContainerStatus, states sets.Set[string]) bool { + for _, cs := range statuses { + if cs.State.Waiting != nil && states.Has(cs.State.Waiting.Reason) { + return true + } + } + return false +} + +// HasMatchingContainerTerminatedState returns true if any container status has +// a terminated reason present in the given set. +func HasMatchingContainerTerminatedState(statuses []v1.ContainerStatus, states sets.Set[string]) bool { + for _, cs := range statuses { + if cs.State.Terminated != nil && states.Has(cs.State.Terminated.Reason) { + return true + } + } + return false +} + func GroupByNodeName(pods []*v1.Pod) map[string][]*v1.Pod { m := make(map[string][]*v1.Pod) for i := 0; i < len(pods); i++ { diff --git a/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts.go b/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts.go index 7e6a1848b..6c806da73 100644 --- a/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts.go +++ b/pkg/framework/plugins/removepodshavingtoomanyrestarts/toomanyrestarts.go @@ -84,19 +84,13 @@ func New(ctx context.Context, args runtime.Object, handle frameworktypes.Handle) if states.Has(string(pod.Status.Phase)) { return true } - - containerStatuses := pod.Status.ContainerStatuses - - if tooManyRestartsArgs.IncludingInitContainers { - containerStatuses = append(containerStatuses, pod.Status.InitContainerStatuses...) + if podutil.HasMatchingContainerWaitingState(pod.Status.ContainerStatuses, states) { + return true } - - for _, containerStatus := range containerStatuses { - if containerStatus.State.Waiting != nil && states.Has(containerStatus.State.Waiting.Reason) { - return true - } + if tooManyRestartsArgs.IncludingInitContainers && + podutil.HasMatchingContainerWaitingState(pod.Status.InitContainerStatuses, states) { + return true } - return false }) }