Surface info of failed plugins during PerFilter and Filter
This commit is contained in:
@@ -61,6 +61,7 @@ go_test(
|
||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||
"//vendor/github.com/google/go-cmp/cmp:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
|
@@ -27,6 +27,7 @@ import (
|
||||
"k8s.io/klog/v2"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/apiserver/pkg/util/feature"
|
||||
extenderv1 "k8s.io/kube-scheduler/extender/v1"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
@@ -106,7 +107,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, fwk framework.Framework
|
||||
return result, ErrNoNodesAvailable
|
||||
}
|
||||
|
||||
feasibleNodes, filteredNodesStatuses, err := g.findNodesThatFitPod(ctx, fwk, state, pod)
|
||||
feasibleNodes, diagnosis, err := g.findNodesThatFitPod(ctx, fwk, state, pod)
|
||||
if err != nil {
|
||||
return result, err
|
||||
}
|
||||
@@ -114,9 +115,9 @@ func (g *genericScheduler) Schedule(ctx context.Context, fwk framework.Framework
|
||||
|
||||
if len(feasibleNodes) == 0 {
|
||||
return result, &framework.FitError{
|
||||
Pod: pod,
|
||||
NumAllNodes: g.nodeInfoSnapshot.NumNodes(),
|
||||
FilteredNodesStatuses: filteredNodesStatuses,
|
||||
Pod: pod,
|
||||
NumAllNodes: g.nodeInfoSnapshot.NumNodes(),
|
||||
Diagnosis: diagnosis,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +125,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, fwk framework.Framework
|
||||
if len(feasibleNodes) == 1 {
|
||||
return ScheduleResult{
|
||||
SuggestedHost: feasibleNodes[0].Name,
|
||||
EvaluatedNodes: 1 + len(filteredNodesStatuses),
|
||||
EvaluatedNodes: 1 + len(diagnosis.NodeToStatusMap),
|
||||
FeasibleNodes: 1,
|
||||
}, nil
|
||||
}
|
||||
@@ -139,7 +140,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, fwk framework.Framework
|
||||
|
||||
return ScheduleResult{
|
||||
SuggestedHost: host,
|
||||
EvaluatedNodes: len(feasibleNodes) + len(filteredNodesStatuses),
|
||||
EvaluatedNodes: len(feasibleNodes) + len(diagnosis.NodeToStatusMap),
|
||||
FeasibleNodes: len(feasibleNodes),
|
||||
}, err
|
||||
}
|
||||
@@ -197,19 +198,19 @@ func (g *genericScheduler) numFeasibleNodesToFind(numAllNodes int32) (numNodes i
|
||||
return numNodes
|
||||
}
|
||||
|
||||
func (g *genericScheduler) evaluateNominatedNode(ctx context.Context, pod *v1.Pod, fwk framework.Framework, state *framework.CycleState, filteredNodesStatuses framework.NodeToStatusMap) ([]*v1.Node, error) {
|
||||
func (g *genericScheduler) evaluateNominatedNode(ctx context.Context, pod *v1.Pod, fwk framework.Framework, state *framework.CycleState, diagnosis framework.Diagnosis) ([]*v1.Node, error) {
|
||||
nnn := pod.Status.NominatedNodeName
|
||||
nodeInfo, err := g.nodeInfoSnapshot.Get(nnn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
node := []*framework.NodeInfo{nodeInfo}
|
||||
feasibleNodes, err := g.findNodesThatPassFilters(ctx, fwk, state, pod, filteredNodesStatuses, node)
|
||||
feasibleNodes, err := g.findNodesThatPassFilters(ctx, fwk, state, pod, diagnosis, node)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
feasibleNodes, err = g.findNodesThatPassExtenders(pod, feasibleNodes, filteredNodesStatuses)
|
||||
feasibleNodes, err = g.findNodesThatPassExtenders(pod, feasibleNodes, diagnosis.NodeToStatusMap)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -219,48 +220,53 @@ func (g *genericScheduler) evaluateNominatedNode(ctx context.Context, pod *v1.Po
|
||||
|
||||
// Filters the nodes to find the ones that fit the pod based on the framework
|
||||
// filter plugins and filter extenders.
|
||||
func (g *genericScheduler) findNodesThatFitPod(ctx context.Context, fwk framework.Framework, state *framework.CycleState, pod *v1.Pod) ([]*v1.Node, framework.NodeToStatusMap, error) {
|
||||
filteredNodesStatuses := make(framework.NodeToStatusMap)
|
||||
func (g *genericScheduler) findNodesThatFitPod(ctx context.Context, fwk framework.Framework, state *framework.CycleState, pod *v1.Pod) ([]*v1.Node, framework.Diagnosis, error) {
|
||||
diagnosis := framework.Diagnosis{
|
||||
NodeToStatusMap: make(framework.NodeToStatusMap),
|
||||
UnschedulablePlugins: sets.NewString(),
|
||||
}
|
||||
|
||||
// Run "prefilter" plugins.
|
||||
s := fwk.RunPreFilterPlugins(ctx, state, pod)
|
||||
allNodes, err := g.nodeInfoSnapshot.NodeInfos().List()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
return nil, diagnosis, err
|
||||
}
|
||||
if !s.IsSuccess() {
|
||||
if !s.IsUnschedulable() {
|
||||
return nil, nil, s.AsError()
|
||||
return nil, diagnosis, s.AsError()
|
||||
}
|
||||
// All nodes will have the same status. Some non trivial refactoring is
|
||||
// needed to avoid this copy.
|
||||
for _, n := range allNodes {
|
||||
filteredNodesStatuses[n.Node().Name] = s
|
||||
diagnosis.NodeToStatusMap[n.Node().Name] = s
|
||||
}
|
||||
return nil, filteredNodesStatuses, nil
|
||||
diagnosis.UnschedulablePlugins.Insert(s.FailedPlugin())
|
||||
return nil, diagnosis, nil
|
||||
}
|
||||
|
||||
// "NominatedNodeName" can potentially be set in a previous scheduling cycle as a result of preemption.
|
||||
// This node is likely the only candidate that will fit the pod, and hence we try it first before iterating over all nodes.
|
||||
if len(pod.Status.NominatedNodeName) > 0 && feature.DefaultFeatureGate.Enabled(features.PreferNominatedNode) {
|
||||
feasibleNodes, err := g.evaluateNominatedNode(ctx, pod, fwk, state, filteredNodesStatuses)
|
||||
feasibleNodes, err := g.evaluateNominatedNode(ctx, pod, fwk, state, diagnosis)
|
||||
if err != nil {
|
||||
klog.ErrorS(err, "Evaluation failed on nominated node", "pod", klog.KObj(pod), "node", pod.Status.NominatedNodeName)
|
||||
}
|
||||
// Nominated node passes all the filters, scheduler is good to assign this node to the pod.
|
||||
if len(feasibleNodes) != 0 {
|
||||
return feasibleNodes, filteredNodesStatuses, nil
|
||||
return feasibleNodes, diagnosis, nil
|
||||
}
|
||||
}
|
||||
feasibleNodes, err := g.findNodesThatPassFilters(ctx, fwk, state, pod, filteredNodesStatuses, allNodes)
|
||||
feasibleNodes, err := g.findNodesThatPassFilters(ctx, fwk, state, pod, diagnosis, allNodes)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
return nil, diagnosis, err
|
||||
}
|
||||
feasibleNodes, err = g.findNodesThatPassExtenders(pod, feasibleNodes, filteredNodesStatuses)
|
||||
|
||||
feasibleNodes, err = g.findNodesThatPassExtenders(pod, feasibleNodes, diagnosis.NodeToStatusMap)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
return nil, diagnosis, err
|
||||
}
|
||||
return feasibleNodes, filteredNodesStatuses, nil
|
||||
return feasibleNodes, diagnosis, nil
|
||||
}
|
||||
|
||||
// findNodesThatPassFilters finds the nodes that fit the filter plugins.
|
||||
@@ -269,7 +275,7 @@ func (g *genericScheduler) findNodesThatPassFilters(
|
||||
fwk framework.Framework,
|
||||
state *framework.CycleState,
|
||||
pod *v1.Pod,
|
||||
statuses framework.NodeToStatusMap,
|
||||
diagnosis framework.Diagnosis,
|
||||
nodes []*framework.NodeInfo) ([]*v1.Node, error) {
|
||||
numNodesToFind := g.numFeasibleNodesToFind(int32(len(nodes)))
|
||||
|
||||
@@ -309,7 +315,8 @@ func (g *genericScheduler) findNodesThatPassFilters(
|
||||
}
|
||||
} else {
|
||||
statusesLock.Lock()
|
||||
statuses[nodeInfo.Node().Name] = status
|
||||
diagnosis.NodeToStatusMap[nodeInfo.Node().Name] = status
|
||||
diagnosis.UnschedulablePlugins.Insert(status.FailedPlugin())
|
||||
statusesLock.Unlock()
|
||||
}
|
||||
}
|
||||
@@ -326,7 +333,7 @@ func (g *genericScheduler) findNodesThatPassFilters(
|
||||
// Stops searching for more nodes once the configured number of feasible nodes
|
||||
// are found.
|
||||
parallelize.Until(ctx, len(nodes), checkNode)
|
||||
processedNodes := int(feasibleNodesLen) + len(statuses)
|
||||
processedNodes := int(feasibleNodesLen) + len(diagnosis.NodeToStatusMap)
|
||||
g.nextStartNodeIndex = (g.nextStartNodeIndex + processedNodes) % len(nodes)
|
||||
|
||||
feasibleNodes = feasibleNodes[:feasibleNodesLen]
|
||||
|
@@ -21,11 +21,12 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
v1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
@@ -295,9 +296,12 @@ func TestGenericScheduler(t *testing.T) {
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
|
||||
NumAllNodes: 2,
|
||||
FilteredNodesStatuses: framework.NodeToStatusMap{
|
||||
"machine1": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
"machine2": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"machine1": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("FalseFilter"),
|
||||
"machine2": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("FalseFilter"),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString("FalseFilter"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -380,10 +384,13 @@ func TestGenericScheduler(t *testing.T) {
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
|
||||
NumAllNodes: 3,
|
||||
FilteredNodesStatuses: framework.NodeToStatusMap{
|
||||
"3": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
"2": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
"1": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"3": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("FalseFilter"),
|
||||
"2": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("FalseFilter"),
|
||||
"1": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("FalseFilter"),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString("FalseFilter"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -412,9 +419,12 @@ func TestGenericScheduler(t *testing.T) {
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}},
|
||||
NumAllNodes: 2,
|
||||
FilteredNodesStatuses: framework.NodeToStatusMap{
|
||||
"1": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
"2": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake),
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"1": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("MatchFilter"),
|
||||
"2": framework.NewStatus(framework.Unschedulable, st.ErrReasonFake).WithFailedPlugin("NoPodsFilter"),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString("MatchFilter", "NoPodsFilter"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -475,7 +485,30 @@ func TestGenericScheduler(t *testing.T) {
|
||||
},
|
||||
},
|
||||
name: "unknown PVC",
|
||||
wErr: fmt.Errorf("persistentvolumeclaim \"unknownPVC\" not found"),
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "ignore", UID: types.UID("ignore")},
|
||||
Spec: v1.PodSpec{
|
||||
Volumes: []v1.Volume{
|
||||
{
|
||||
VolumeSource: v1.VolumeSource{
|
||||
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
|
||||
ClaimName: "unknownPVC",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
NumAllNodes: 2,
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"machine1": framework.NewStatus(framework.UnschedulableAndUnresolvable, `persistentvolumeclaim "unknownPVC" not found`).WithFailedPlugin(volumebinding.Name),
|
||||
"machine2": framework.NewStatus(framework.UnschedulableAndUnresolvable, `persistentvolumeclaim "unknownPVC" not found`).WithFailedPlugin(volumebinding.Name),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString(volumebinding.Name),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
// Pod with deleting PVC
|
||||
@@ -502,7 +535,30 @@ func TestGenericScheduler(t *testing.T) {
|
||||
},
|
||||
},
|
||||
name: "deleted PVC",
|
||||
wErr: fmt.Errorf("persistentvolumeclaim \"existingPVC\" is being deleted"),
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "ignore", UID: types.UID("ignore"), Namespace: v1.NamespaceDefault},
|
||||
Spec: v1.PodSpec{
|
||||
Volumes: []v1.Volume{
|
||||
{
|
||||
VolumeSource: v1.VolumeSource{
|
||||
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
|
||||
ClaimName: "existingPVC",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
NumAllNodes: 2,
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"machine1": framework.NewStatus(framework.UnschedulableAndUnresolvable, `persistentvolumeclaim "existingPVC" is being deleted`).WithFailedPlugin(volumebinding.Name),
|
||||
"machine2": framework.NewStatus(framework.UnschedulableAndUnresolvable, `persistentvolumeclaim "existingPVC" is being deleted`).WithFailedPlugin(volumebinding.Name),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString(volumebinding.Name),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
registerPlugins: []st.RegisterPluginFunc{
|
||||
@@ -646,8 +702,11 @@ func TestGenericScheduler(t *testing.T) {
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
|
||||
NumAllNodes: 1,
|
||||
FilteredNodesStatuses: framework.NodeToStatusMap{
|
||||
"3": framework.NewStatus(framework.Unschedulable, "injecting failure for pod test-filter"),
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"3": framework.NewStatus(framework.Unschedulable, "injecting failure for pod test-filter").WithFailedPlugin("FakeFilter"),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString("FakeFilter"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -668,8 +727,11 @@ func TestGenericScheduler(t *testing.T) {
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-filter", UID: types.UID("test-filter")}},
|
||||
NumAllNodes: 1,
|
||||
FilteredNodesStatuses: framework.NodeToStatusMap{
|
||||
"3": framework.NewStatus(framework.UnschedulableAndUnresolvable, "injecting failure for pod test-filter"),
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"3": framework.NewStatus(framework.UnschedulableAndUnresolvable, "injecting failure for pod test-filter").WithFailedPlugin("FakeFilter"),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString("FakeFilter"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -705,9 +767,12 @@ func TestGenericScheduler(t *testing.T) {
|
||||
wErr: &framework.FitError{
|
||||
Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-prefilter", UID: types.UID("test-prefilter")}},
|
||||
NumAllNodes: 2,
|
||||
FilteredNodesStatuses: framework.NodeToStatusMap{
|
||||
"1": framework.NewStatus(framework.UnschedulableAndUnresolvable, "injected unschedulable status"),
|
||||
"2": framework.NewStatus(framework.UnschedulableAndUnresolvable, "injected unschedulable status"),
|
||||
Diagnosis: framework.Diagnosis{
|
||||
NodeToStatusMap: framework.NodeToStatusMap{
|
||||
"1": framework.NewStatus(framework.UnschedulableAndUnresolvable, "injected unschedulable status").WithFailedPlugin("FakePreFilter"),
|
||||
"2": framework.NewStatus(framework.UnschedulableAndUnresolvable, "injected unschedulable status").WithFailedPlugin("FakePreFilter"),
|
||||
},
|
||||
UnschedulablePlugins: sets.NewString("FakePreFilter"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -772,8 +837,15 @@ func TestGenericScheduler(t *testing.T) {
|
||||
informerFactory.WaitForCacheSync(ctx.Done())
|
||||
|
||||
result, err := scheduler.Schedule(ctx, fwk, framework.NewCycleState(), test.pod)
|
||||
if err != test.wErr && !strings.Contains(err.Error(), test.wErr.Error()) {
|
||||
t.Errorf("Unexpected error: %v, expected: %v", err.Error(), test.wErr)
|
||||
// TODO(#94696): replace reflect.DeepEqual with cmp.Diff().
|
||||
if err != test.wErr {
|
||||
gotFitErr, gotOK := err.(*framework.FitError)
|
||||
wantFitErr, wantOK := test.wErr.(*framework.FitError)
|
||||
if gotOK != wantOK {
|
||||
t.Errorf("Expected err to be FitError: %v, but got %v", wantOK, gotOK)
|
||||
} else if gotOK && !reflect.DeepEqual(gotFitErr, wantFitErr) {
|
||||
t.Errorf("Unexpected fitError. Want %v, but got %v", wantFitErr, gotFitErr)
|
||||
}
|
||||
}
|
||||
if test.expectedHosts != nil && !test.expectedHosts.Has(result.SuggestedHost) {
|
||||
t.Errorf("Expected: %s, got: %s", test.expectedHosts, result.SuggestedHost)
|
||||
@@ -817,27 +889,19 @@ func TestFindFitAllError(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, nodeToStatusMap, err := scheduler.findNodesThatFitPod(context.Background(), fwk, framework.NewCycleState(), &v1.Pod{})
|
||||
_, diagnosis, err := scheduler.findNodesThatFitPod(context.Background(), fwk, framework.NewCycleState(), &v1.Pod{})
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if len(nodeToStatusMap) != len(nodes) {
|
||||
t.Errorf("unexpected failed status map: %v", nodeToStatusMap)
|
||||
// TODO(#94696): use cmp.Diff() to compare `diagnosis`.
|
||||
if len(diagnosis.NodeToStatusMap) != len(nodes) {
|
||||
t.Errorf("unexpected failed status map: %v", diagnosis.NodeToStatusMap)
|
||||
}
|
||||
|
||||
for _, node := range nodes {
|
||||
t.Run(node.Name, func(t *testing.T) {
|
||||
status, found := nodeToStatusMap[node.Name]
|
||||
if !found {
|
||||
t.Errorf("failed to find node %v in %v", node.Name, nodeToStatusMap)
|
||||
}
|
||||
reasons := status.Reasons()
|
||||
if len(reasons) != 1 || reasons[0] != st.ErrReasonFake {
|
||||
t.Errorf("unexpected failure reasons: %v", reasons)
|
||||
}
|
||||
})
|
||||
if diff := cmp.Diff(sets.NewString("MatchFilter"), diagnosis.UnschedulablePlugins); diff != "" {
|
||||
t.Errorf("Unexpected unschedulablePlugins: (-want, +got): %s", diagnosis.UnschedulablePlugins)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -858,14 +922,18 @@ func TestFindFitSomeError(t *testing.T) {
|
||||
}
|
||||
|
||||
pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "1", UID: types.UID("1")}}
|
||||
_, nodeToStatusMap, err := scheduler.findNodesThatFitPod(context.Background(), fwk, framework.NewCycleState(), pod)
|
||||
_, diagnosis, err := scheduler.findNodesThatFitPod(context.Background(), fwk, framework.NewCycleState(), pod)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if len(nodeToStatusMap) != len(nodes)-1 {
|
||||
t.Errorf("unexpected failed status map: %v", nodeToStatusMap)
|
||||
if len(diagnosis.NodeToStatusMap) != len(nodes)-1 {
|
||||
t.Errorf("unexpected failed status map: %v", diagnosis.NodeToStatusMap)
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(sets.NewString("MatchFilter"), diagnosis.UnschedulablePlugins); diff != "" {
|
||||
t.Errorf("Unexpected unschedulablePlugins: (-want, +got): %s", diagnosis.UnschedulablePlugins)
|
||||
}
|
||||
|
||||
for _, node := range nodes {
|
||||
@@ -873,9 +941,9 @@ func TestFindFitSomeError(t *testing.T) {
|
||||
continue
|
||||
}
|
||||
t.Run(node.Name, func(t *testing.T) {
|
||||
status, found := nodeToStatusMap[node.Name]
|
||||
status, found := diagnosis.NodeToStatusMap[node.Name]
|
||||
if !found {
|
||||
t.Errorf("failed to find node %v in %v", node.Name, nodeToStatusMap)
|
||||
t.Errorf("failed to find node %v in %v", node.Name, diagnosis.NodeToStatusMap)
|
||||
}
|
||||
reasons := status.Reasons()
|
||||
if len(reasons) != 1 || reasons[0] != st.ErrReasonFake {
|
||||
|
Reference in New Issue
Block a user