diff --git a/pkg/descheduler/strategies/failedpods.go b/pkg/descheduler/strategies/failedpods.go index e9c7ad23c..e21e82a79 100644 --- a/pkg/descheduler/strategies/failedpods.go +++ b/pkg/descheduler/strategies/failedpods.go @@ -19,7 +19,7 @@ import ( // validatedFailedPodsStrategyParams contains validated strategy parameters type validatedFailedPodsStrategyParams struct { - *validation.ValidatedStrategyParams + validation.ValidatedStrategyParams includingInitContainers bool reasons sets.String excludeOwnerKinds sets.String @@ -46,9 +46,15 @@ func RemoveFailedPods( evictions.WithLabelSelector(strategyParams.LabelSelector), ) + var labelSelector *metav1.LabelSelector + if strategy.Params != nil { + labelSelector = strategy.Params.LabelSelector + } + for _, node := range nodes { klog.V(1).InfoS("Processing node", "node", klog.KObj(node)) fieldSelectorString := "spec.nodeName=" + node.Name + ",status.phase=" + string(v1.PodFailed) + pods, err := podutil.ListPodsOnANodeWithFieldSelector( ctx, client, @@ -57,7 +63,7 @@ func RemoveFailedPods( podutil.WithFilter(evictable.IsEvictable), podutil.WithNamespaces(strategyParams.IncludedNamespaces.UnsortedList()), podutil.WithoutNamespaces(strategyParams.ExcludedNamespaces.UnsortedList()), - podutil.WithLabelSelector(strategy.Params.LabelSelector), + podutil.WithLabelSelector(labelSelector), ) if err != nil { klog.ErrorS(err, "Error listing a nodes failed pods", "node", klog.KObj(node)) @@ -103,7 +109,7 @@ func validateAndParseRemoveFailedPodsParams( } return &validatedFailedPodsStrategyParams{ - ValidatedStrategyParams: strategyParams, + ValidatedStrategyParams: *strategyParams, includingInitContainers: includingInitContainers, reasons: reasons, excludeOwnerKinds: excludeOwnerKinds, diff --git a/pkg/descheduler/strategies/failedpods_test.go b/pkg/descheduler/strategies/failedpods_test.go index 52f4f0574..c5caf5a43 100644 --- a/pkg/descheduler/strategies/failedpods_test.go +++ b/pkg/descheduler/strategies/failedpods_test.go @@ -44,6 +44,13 @@ func TestRemoveFailedPods(t *testing.T) { expectedEvictedPodCount int pods []v1.Pod }{ + { + description: "default empty strategy, 0 failures, 0 evictions", + strategy: api.DeschedulerStrategy{}, + nodes: []*v1.Node{test.BuildTestNode("node1", 2000, 3000, 10, nil)}, + expectedEvictedPodCount: 0, + pods: []v1.Pod{}, // no pods come back with field selector phase=Failed + }, { description: "0 failures, 0 evictions", strategy: createStrategy(true, false, nil, nil, nil, false), @@ -225,6 +232,7 @@ func TestValidRemoveFailedPodsParams(t *testing.T) { params *api.StrategyParameters }{ {name: "validate nil params", params: nil}, + {name: "validate empty params", params: &api.StrategyParameters{}}, {name: "validate reasons params", params: &api.StrategyParameters{FailedPods: &api.FailedPods{ Reasons: []string{"CreateContainerConfigError"}, }}},