Merge pull request #112219 from kidddddddddddddddddddddd/feat/ExtractParseError

Extract ParseError from PodInfo
This commit is contained in:
Kubernetes Prow Robot 2022-10-12 16:45:03 -07:00 committed by GitHub
commit fd358d3606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 138 additions and 77 deletions

View File

@ -240,9 +240,8 @@ func (pl *InterPodAffinity) PreFilter(ctx context.Context, cycleState *framework
s := &preFilterState{} s := &preFilterState{}
s.podInfo = framework.NewPodInfo(pod) if s.podInfo, err = framework.NewPodInfo(pod); err != nil {
if s.podInfo.ParseError != nil { return nil, framework.NewStatus(framework.UnschedulableAndUnresolvable, fmt.Sprintf("parsing pod: %+v", err))
return nil, framework.NewStatus(framework.UnschedulableAndUnresolvable, fmt.Sprintf("parsing pod: %+v", s.podInfo.ParseError))
} }
for i := range s.podInfo.RequiredAffinityTerms { for i := range s.podInfo.RequiredAffinityTerms {

View File

@ -1262,7 +1262,7 @@ func TestPreFilterStateAddRemovePod(t *testing.T) {
// Add test.addedPod to state1 and verify it is equal to allPodsState. // Add test.addedPod to state1 and verify it is equal to allPodsState.
nodeInfo := mustGetNodeInfo(t, snapshot, test.addedPod.Spec.NodeName) nodeInfo := mustGetNodeInfo(t, snapshot, test.addedPod.Spec.NodeName)
if err := ipa.AddPod(ctx, cycleState, test.pendingPod, framework.NewPodInfo(test.addedPod), nodeInfo); err != nil { if err := ipa.AddPod(ctx, cycleState, test.pendingPod, mustNewPodInfo(t, test.addedPod), nodeInfo); err != nil {
t.Errorf("error adding pod to meta: %v", err) t.Errorf("error adding pod to meta: %v", err)
} }
@ -1284,7 +1284,7 @@ func TestPreFilterStateAddRemovePod(t *testing.T) {
} }
// Remove the added pod pod and make sure it is equal to the original state. // Remove the added pod pod and make sure it is equal to the original state.
if err := ipa.RemovePod(context.Background(), cycleState, test.pendingPod, framework.NewPodInfo(test.addedPod), nodeInfo); err != nil { if err := ipa.RemovePod(context.Background(), cycleState, test.pendingPod, mustNewPodInfo(t, test.addedPod), nodeInfo); err != nil {
t.Errorf("error removing pod from meta: %v", err) t.Errorf("error removing pod from meta: %v", err)
} }
if !reflect.DeepEqual(originalState, state) { if !reflect.DeepEqual(originalState, state) {
@ -1439,7 +1439,7 @@ func TestGetTPMapMatchingIncomingAffinityAntiAffinity(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
p := plugintesting.SetupPluginWithInformers(ctx, t, New, &config.InterPodAffinityArgs{}, snapshot, nil) p := plugintesting.SetupPluginWithInformers(ctx, t, New, &config.InterPodAffinityArgs{}, snapshot, nil)
gotAffinityPodsMap, gotAntiAffinityPodsMap := p.(*InterPodAffinity).getIncomingAffinityAntiAffinityCounts(ctx, framework.NewPodInfo(tt.pod), l) gotAffinityPodsMap, gotAntiAffinityPodsMap := p.(*InterPodAffinity).getIncomingAffinityAntiAffinityCounts(ctx, mustNewPodInfo(t, tt.pod), l)
if !reflect.DeepEqual(gotAffinityPodsMap, tt.wantAffinityPodsMap) { if !reflect.DeepEqual(gotAffinityPodsMap, tt.wantAffinityPodsMap) {
t.Errorf("getTPMapMatchingIncomingAffinityAntiAffinity() gotAffinityPodsMap = %#v, want %#v", gotAffinityPodsMap, tt.wantAffinityPodsMap) t.Errorf("getTPMapMatchingIncomingAffinityAntiAffinity() gotAffinityPodsMap = %#v, want %#v", gotAffinityPodsMap, tt.wantAffinityPodsMap)
} }
@ -1458,3 +1458,11 @@ func mustGetNodeInfo(t *testing.T, snapshot *cache.Snapshot, name string) *frame
} }
return nodeInfo return nodeInfo
} }
func mustNewPodInfo(t *testing.T, pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
t.Fatal(err)
}
return podInfo
}

View File

@ -162,10 +162,9 @@ func (pl *InterPodAffinity) PreScore(
topologyScore: make(map[string]map[string]int64), topologyScore: make(map[string]map[string]int64),
} }
state.podInfo = framework.NewPodInfo(pod) if state.podInfo, err = framework.NewPodInfo(pod); err != nil {
if state.podInfo.ParseError != nil {
// Ideally we never reach here, because errors will be caught by PreFilter // Ideally we never reach here, because errors will be caught by PreFilter
return framework.AsStatus(fmt.Errorf("failed to parse pod: %w", state.podInfo.ParseError)) return framework.AsStatus(fmt.Errorf("failed to parse pod: %w", err))
} }
for i := range state.podInfo.PreferredAffinityTerms { for i := range state.podInfo.PreferredAffinityTerms {

View File

@ -1866,7 +1866,7 @@ func TestPreFilterStateAddPod(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if s := p.AddPod(ctx, cs, tt.preemptor, framework.NewPodInfo(tt.addedPod), nodeInfo); !s.IsSuccess() { if s := p.AddPod(ctx, cs, tt.preemptor, mustNewPodInfo(t, tt.addedPod), nodeInfo); !s.IsSuccess() {
t.Fatal(s.AsError()) t.Fatal(s.AsError())
} }
state, err := getPreFilterState(cs) state, err := getPreFilterState(cs)
@ -2188,7 +2188,7 @@ func TestPreFilterStateRemovePod(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if s := p.RemovePod(ctx, cs, tt.preemptor, framework.NewPodInfo(deletedPod), nodeInfo); !s.IsSuccess() { if s := p.RemovePod(ctx, cs, tt.preemptor, mustNewPodInfo(t, deletedPod), nodeInfo); !s.IsSuccess() {
t.Fatal(s.AsError()) t.Fatal(s.AsError())
} }
@ -3228,3 +3228,11 @@ func TestPreFilterDisabled(t *testing.T) {
t.Errorf("status does not match: %v, want: %v", gotStatus, wantStatus) t.Errorf("status does not match: %v, want: %v", gotStatus, wantStatus)
} }
} }
func mustNewPodInfo(t *testing.T, pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
t.Fatal(err)
}
return podInfo
}

View File

@ -20,6 +20,7 @@ import (
"testing" "testing"
"time" "time"
v1 "k8s.io/api/core/v1"
"k8s.io/kubernetes/pkg/scheduler/framework" "k8s.io/kubernetes/pkg/scheduler/framework"
st "k8s.io/kubernetes/pkg/scheduler/testing" st "k8s.io/kubernetes/pkg/scheduler/testing"
) )
@ -38,31 +39,31 @@ func TestLess(t *testing.T) {
{ {
name: "p1.priority less than p2.priority", name: "p1.priority less than p2.priority",
p1: &framework.QueuedPodInfo{ p1: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(lowPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(lowPriority).Obj()),
}, },
p2: &framework.QueuedPodInfo{ p2: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(highPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(highPriority).Obj()),
}, },
expected: false, // p2 should be ahead of p1 in the queue expected: false, // p2 should be ahead of p1 in the queue
}, },
{ {
name: "p1.priority greater than p2.priority", name: "p1.priority greater than p2.priority",
p1: &framework.QueuedPodInfo{ p1: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(highPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(highPriority).Obj()),
}, },
p2: &framework.QueuedPodInfo{ p2: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(lowPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(lowPriority).Obj()),
}, },
expected: true, // p1 should be ahead of p2 in the queue expected: true, // p1 should be ahead of p2 in the queue
}, },
{ {
name: "equal priority. p1 is added to schedulingQ earlier than p2", name: "equal priority. p1 is added to schedulingQ earlier than p2",
p1: &framework.QueuedPodInfo{ p1: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(highPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(highPriority).Obj()),
Timestamp: t1, Timestamp: t1,
}, },
p2: &framework.QueuedPodInfo{ p2: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(highPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(highPriority).Obj()),
Timestamp: t2, Timestamp: t2,
}, },
expected: true, // p1 should be ahead of p2 in the queue expected: true, // p1 should be ahead of p2 in the queue
@ -70,11 +71,11 @@ func TestLess(t *testing.T) {
{ {
name: "equal priority. p2 is added to schedulingQ earlier than p1", name: "equal priority. p2 is added to schedulingQ earlier than p1",
p1: &framework.QueuedPodInfo{ p1: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(highPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(highPriority).Obj()),
Timestamp: t2, Timestamp: t2,
}, },
p2: &framework.QueuedPodInfo{ p2: &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Priority(highPriority).Obj()), PodInfo: mustNewPodInfo(t, st.MakePod().Priority(highPriority).Obj()),
Timestamp: t1, Timestamp: t1,
}, },
expected: false, // p2 should be ahead of p1 in the queue expected: false, // p2 should be ahead of p1 in the queue
@ -87,3 +88,11 @@ func TestLess(t *testing.T) {
}) })
} }
} }
func mustNewPodInfo(t *testing.T, pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
t.Fatal(err)
}
return podInfo
}

View File

@ -1667,7 +1667,7 @@ func TestFilterPluginsWithNominatedPods(t *testing.T) {
podNominator := internalqueue.NewPodNominator(nil) podNominator := internalqueue.NewPodNominator(nil)
if tt.nominatedPod != nil { if tt.nominatedPod != nil {
podNominator.AddNominatedPod( podNominator.AddNominatedPod(
framework.NewPodInfo(tt.nominatedPod), mustNewPodInfo(t, tt.nominatedPod),
&framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: nodeName}) &framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: nodeName})
} }
profile := config.KubeSchedulerProfile{Plugins: cfgPls} profile := config.KubeSchedulerProfile{Plugins: cfgPls}
@ -2688,3 +2688,11 @@ func collectAndComparePermitWaitDuration(t *testing.T, wantRes string) {
} }
} }
} }
func mustNewPodInfo(t *testing.T, pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
t.Fatal(err)
}
return podInfo
}

View File

@ -123,7 +123,6 @@ type PodInfo struct {
RequiredAntiAffinityTerms []AffinityTerm RequiredAntiAffinityTerms []AffinityTerm
PreferredAffinityTerms []WeightedAffinityTerm PreferredAffinityTerms []WeightedAffinityTerm
PreferredAntiAffinityTerms []WeightedAffinityTerm PreferredAntiAffinityTerms []WeightedAffinityTerm
ParseError error
} }
// DeepCopy returns a deep copy of the PodInfo object. // DeepCopy returns a deep copy of the PodInfo object.
@ -134,18 +133,17 @@ func (pi *PodInfo) DeepCopy() *PodInfo {
RequiredAntiAffinityTerms: pi.RequiredAntiAffinityTerms, RequiredAntiAffinityTerms: pi.RequiredAntiAffinityTerms,
PreferredAffinityTerms: pi.PreferredAffinityTerms, PreferredAffinityTerms: pi.PreferredAffinityTerms,
PreferredAntiAffinityTerms: pi.PreferredAntiAffinityTerms, PreferredAntiAffinityTerms: pi.PreferredAntiAffinityTerms,
ParseError: pi.ParseError,
} }
} }
// Update creates a full new PodInfo by default. And only updates the pod when the PodInfo // Update creates a full new PodInfo by default. And only updates the pod when the PodInfo
// has been instantiated and the passed pod is the exact same one as the original pod. // has been instantiated and the passed pod is the exact same one as the original pod.
func (pi *PodInfo) Update(pod *v1.Pod) { func (pi *PodInfo) Update(pod *v1.Pod) error {
if pod != nil && pi.Pod != nil && pi.Pod.UID == pod.UID { if pod != nil && pi.Pod != nil && pi.Pod.UID == pod.UID {
// PodInfo includes immutable information, and so it is safe to update the pod in place if it is // PodInfo includes immutable information, and so it is safe to update the pod in place if it is
// the exact same pod // the exact same pod
pi.Pod = pod pi.Pod = pod
return return nil
} }
var preferredAffinityTerms []v1.WeightedPodAffinityTerm var preferredAffinityTerms []v1.WeightedPodAffinityTerm
var preferredAntiAffinityTerms []v1.WeightedPodAffinityTerm var preferredAntiAffinityTerms []v1.WeightedPodAffinityTerm
@ -183,7 +181,7 @@ func (pi *PodInfo) Update(pod *v1.Pod) {
pi.RequiredAntiAffinityTerms = requiredAntiAffinityTerms pi.RequiredAntiAffinityTerms = requiredAntiAffinityTerms
pi.PreferredAffinityTerms = weightedAffinityTerms pi.PreferredAffinityTerms = weightedAffinityTerms
pi.PreferredAntiAffinityTerms = weightedAntiAffinityTerms pi.PreferredAntiAffinityTerms = weightedAntiAffinityTerms
pi.ParseError = utilerrors.NewAggregate(parseErrs) return utilerrors.NewAggregate(parseErrs)
} }
// AffinityTerm is a processed version of v1.PodAffinityTerm. // AffinityTerm is a processed version of v1.PodAffinityTerm.
@ -321,10 +319,10 @@ func getWeightedAffinityTerms(pod *v1.Pod, v1Terms []v1.WeightedPodAffinityTerm)
} }
// NewPodInfo returns a new PodInfo. // NewPodInfo returns a new PodInfo.
func NewPodInfo(pod *v1.Pod) *PodInfo { func NewPodInfo(pod *v1.Pod) (*PodInfo, error) {
pInfo := &PodInfo{} pInfo := &PodInfo{}
pInfo.Update(pod) err := pInfo.Update(pod)
return pInfo return pInfo, err
} }
func getPodAffinityTerms(affinity *v1.Affinity) (terms []v1.PodAffinityTerm) { func getPodAffinityTerms(affinity *v1.Affinity) (terms []v1.PodAffinityTerm) {
@ -609,7 +607,10 @@ func (n *NodeInfo) AddPodInfo(podInfo *PodInfo) {
// AddPod is a wrapper around AddPodInfo. // AddPod is a wrapper around AddPodInfo.
func (n *NodeInfo) AddPod(pod *v1.Pod) { func (n *NodeInfo) AddPod(pod *v1.Pod) {
n.AddPodInfo(NewPodInfo(pod)) // ignore this err since apiserver doesn't properly validate affinity terms
// and we can't fix the validation for backwards compatibility.
podInfo, _ := NewPodInfo(pod)
n.AddPodInfo(podInfo)
} }
func podWithAffinity(p *v1.Pod) bool { func podWithAffinity(p *v1.Pod) bool {

View File

@ -762,8 +762,11 @@ func (p *PriorityQueue) podsCompareBackoffCompleted(podInfo1, podInfo2 interface
// newQueuedPodInfo builds a QueuedPodInfo object. // newQueuedPodInfo builds a QueuedPodInfo object.
func (p *PriorityQueue) newQueuedPodInfo(pod *v1.Pod, plugins ...string) *framework.QueuedPodInfo { func (p *PriorityQueue) newQueuedPodInfo(pod *v1.Pod, plugins ...string) *framework.QueuedPodInfo {
now := p.clock.Now() now := p.clock.Now()
// ignore this err since apiserver doesn't properly validate affinity terms
// and we can't fix the validation for backwards compatibility.
podInfo, _ := framework.NewPodInfo(pod)
return &framework.QueuedPodInfo{ return &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(pod), PodInfo: podInfo,
Timestamp: now, Timestamp: now,
InitialAttemptTimestamp: now, InitialAttemptTimestamp: now,
UnschedulablePlugins: sets.NewString(plugins...), UnschedulablePlugins: sets.NewString(plugins...),

View File

@ -58,22 +58,22 @@ var (
lowPriority, midPriority, highPriority = int32(0), int32(100), int32(1000) lowPriority, midPriority, highPriority = int32(0), int32(100), int32(1000)
mediumPriority = (lowPriority + highPriority) / 2 mediumPriority = (lowPriority + highPriority) / 2
highPriorityPodInfo = framework.NewPodInfo( highPriorityPodInfo = mustNewPodInfo(
st.MakePod().Name("hpp").Namespace("ns1").UID("hppns1").Priority(highPriority).Obj(), st.MakePod().Name("hpp").Namespace("ns1").UID("hppns1").Priority(highPriority).Obj(),
) )
highPriNominatedPodInfo = framework.NewPodInfo( highPriNominatedPodInfo = mustNewPodInfo(
st.MakePod().Name("hpp").Namespace("ns1").UID("hppns1").Priority(highPriority).NominatedNodeName("node1").Obj(), st.MakePod().Name("hpp").Namespace("ns1").UID("hppns1").Priority(highPriority).NominatedNodeName("node1").Obj(),
) )
medPriorityPodInfo = framework.NewPodInfo( medPriorityPodInfo = mustNewPodInfo(
st.MakePod().Name("mpp").Namespace("ns2").UID("mppns2").Annotation("annot2", "val2").Priority(mediumPriority).NominatedNodeName("node1").Obj(), st.MakePod().Name("mpp").Namespace("ns2").UID("mppns2").Annotation("annot2", "val2").Priority(mediumPriority).NominatedNodeName("node1").Obj(),
) )
unschedulablePodInfo = framework.NewPodInfo( unschedulablePodInfo = mustNewPodInfo(
st.MakePod().Name("up").Namespace("ns1").UID("upns1").Annotation("annot2", "val2").Priority(lowPriority).NominatedNodeName("node1").Condition(v1.PodScheduled, v1.ConditionFalse, v1.PodReasonUnschedulable).Obj(), st.MakePod().Name("up").Namespace("ns1").UID("upns1").Annotation("annot2", "val2").Priority(lowPriority).NominatedNodeName("node1").Condition(v1.PodScheduled, v1.ConditionFalse, v1.PodReasonUnschedulable).Obj(),
) )
nonExistentPodInfo = framework.NewPodInfo( nonExistentPodInfo = mustNewPodInfo(
st.MakePod().Name("ne").Namespace("ns1").UID("nens1").Obj(), st.MakePod().Name("ne").Namespace("ns1").UID("nens1").Obj(),
) )
scheduledPodInfo = framework.NewPodInfo( scheduledPodInfo = mustNewPodInfo(
st.MakePod().Name("sp").Namespace("ns1").UID("spns1").Node("foo").Obj(), st.MakePod().Name("sp").Namespace("ns1").UID("spns1").Node("foo").Obj(),
) )
) )
@ -772,11 +772,11 @@ func TestPriorityQueue_UpdateNominatedPodForNode(t *testing.T) {
t.Errorf("add failed: %v", err) t.Errorf("add failed: %v", err)
} }
// Update unschedulablePodInfo on a different node than specified in the pod. // Update unschedulablePodInfo on a different node than specified in the pod.
q.AddNominatedPod(framework.NewPodInfo(unschedulablePodInfo.Pod), q.AddNominatedPod(mustNewTestPodInfo(t, unschedulablePodInfo.Pod),
&framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "node5"}) &framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "node5"})
// Update nominated node name of a pod on a node that is not specified in the pod object. // Update nominated node name of a pod on a node that is not specified in the pod object.
q.AddNominatedPod(framework.NewPodInfo(highPriorityPodInfo.Pod), q.AddNominatedPod(mustNewTestPodInfo(t, highPriorityPodInfo.Pod),
&framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "node2"}) &framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "node2"})
expectedNominatedPods := &nominator{ expectedNominatedPods := &nominator{
nominatedPodToNode: map[types.UID]string{ nominatedPodToNode: map[types.UID]string{
@ -829,7 +829,7 @@ func TestPriorityQueue_UpdateNominatedPodForNode(t *testing.T) {
// Nothing should change. // Nothing should change.
scheduledPodCopy := scheduledPodInfo.Pod.DeepCopy() scheduledPodCopy := scheduledPodInfo.Pod.DeepCopy()
scheduledPodInfo.Pod.Spec.NodeName = "" scheduledPodInfo.Pod.Spec.NodeName = ""
q.AddNominatedPod(framework.NewPodInfo(scheduledPodCopy), &framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "node1"}) q.AddNominatedPod(mustNewTestPodInfo(t, scheduledPodCopy), &framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "node1"})
if diff := cmp.Diff(q.PodNominator, expectedNominatedPods, cmp.AllowUnexported(nominator{}), cmpopts.IgnoreFields(nominator{}, "podLister", "RWMutex")); diff != "" { if diff := cmp.Diff(q.PodNominator, expectedNominatedPods, cmp.AllowUnexported(nominator{}), cmpopts.IgnoreFields(nominator{}, "podLister", "RWMutex")); diff != "" {
t.Errorf("Unexpected diff after nominating a scheduled pod (-want, +got):\n%s", diff) t.Errorf("Unexpected diff after nominating a scheduled pod (-want, +got):\n%s", diff)
} }
@ -895,35 +895,35 @@ func TestUnschedulablePodsMap(t *testing.T) {
name: "create, update, delete subset of pods", name: "create, update, delete subset of pods",
podsToAdd: []*v1.Pod{pods[0], pods[1], pods[2], pods[3]}, podsToAdd: []*v1.Pod{pods[0], pods[1], pods[2], pods[3]},
expectedMapAfterAdd: map[string]*framework.QueuedPodInfo{ expectedMapAfterAdd: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[0]): {PodInfo: framework.NewPodInfo(pods[0]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[0]): {PodInfo: mustNewTestPodInfo(t, pods[0]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[1]): {PodInfo: framework.NewPodInfo(pods[1]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[1]): {PodInfo: mustNewTestPodInfo(t, pods[1]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[2]): {PodInfo: framework.NewPodInfo(pods[2]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[2]): {PodInfo: mustNewTestPodInfo(t, pods[2]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[3]): {PodInfo: framework.NewPodInfo(pods[3]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[3]): {PodInfo: mustNewTestPodInfo(t, pods[3]), UnschedulablePlugins: sets.NewString()},
}, },
podsToUpdate: []*v1.Pod{updatedPods[0]}, podsToUpdate: []*v1.Pod{updatedPods[0]},
expectedMapAfterUpdate: map[string]*framework.QueuedPodInfo{ expectedMapAfterUpdate: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[0]): {PodInfo: framework.NewPodInfo(updatedPods[0]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[0]): {PodInfo: mustNewTestPodInfo(t, updatedPods[0]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[1]): {PodInfo: framework.NewPodInfo(pods[1]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[1]): {PodInfo: mustNewTestPodInfo(t, pods[1]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[2]): {PodInfo: framework.NewPodInfo(pods[2]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[2]): {PodInfo: mustNewTestPodInfo(t, pods[2]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[3]): {PodInfo: framework.NewPodInfo(pods[3]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[3]): {PodInfo: mustNewTestPodInfo(t, pods[3]), UnschedulablePlugins: sets.NewString()},
}, },
podsToDelete: []*v1.Pod{pods[0], pods[1]}, podsToDelete: []*v1.Pod{pods[0], pods[1]},
expectedMapAfterDelete: map[string]*framework.QueuedPodInfo{ expectedMapAfterDelete: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[2]): {PodInfo: framework.NewPodInfo(pods[2]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[2]): {PodInfo: mustNewTestPodInfo(t, pods[2]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[3]): {PodInfo: framework.NewPodInfo(pods[3]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[3]): {PodInfo: mustNewTestPodInfo(t, pods[3]), UnschedulablePlugins: sets.NewString()},
}, },
}, },
{ {
name: "create, update, delete all", name: "create, update, delete all",
podsToAdd: []*v1.Pod{pods[0], pods[3]}, podsToAdd: []*v1.Pod{pods[0], pods[3]},
expectedMapAfterAdd: map[string]*framework.QueuedPodInfo{ expectedMapAfterAdd: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[0]): {PodInfo: framework.NewPodInfo(pods[0]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[0]): {PodInfo: mustNewTestPodInfo(t, pods[0]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[3]): {PodInfo: framework.NewPodInfo(pods[3]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[3]): {PodInfo: mustNewTestPodInfo(t, pods[3]), UnschedulablePlugins: sets.NewString()},
}, },
podsToUpdate: []*v1.Pod{updatedPods[3]}, podsToUpdate: []*v1.Pod{updatedPods[3]},
expectedMapAfterUpdate: map[string]*framework.QueuedPodInfo{ expectedMapAfterUpdate: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[0]): {PodInfo: framework.NewPodInfo(pods[0]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[0]): {PodInfo: mustNewTestPodInfo(t, pods[0]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[3]): {PodInfo: framework.NewPodInfo(updatedPods[3]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[3]): {PodInfo: mustNewTestPodInfo(t, updatedPods[3]), UnschedulablePlugins: sets.NewString()},
}, },
podsToDelete: []*v1.Pod{pods[0], pods[3]}, podsToDelete: []*v1.Pod{pods[0], pods[3]},
expectedMapAfterDelete: map[string]*framework.QueuedPodInfo{}, expectedMapAfterDelete: map[string]*framework.QueuedPodInfo{},
@ -932,17 +932,17 @@ func TestUnschedulablePodsMap(t *testing.T) {
name: "delete non-existing and existing pods", name: "delete non-existing and existing pods",
podsToAdd: []*v1.Pod{pods[1], pods[2]}, podsToAdd: []*v1.Pod{pods[1], pods[2]},
expectedMapAfterAdd: map[string]*framework.QueuedPodInfo{ expectedMapAfterAdd: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[1]): {PodInfo: framework.NewPodInfo(pods[1]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[1]): {PodInfo: mustNewTestPodInfo(t, pods[1]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[2]): {PodInfo: framework.NewPodInfo(pods[2]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[2]): {PodInfo: mustNewTestPodInfo(t, pods[2]), UnschedulablePlugins: sets.NewString()},
}, },
podsToUpdate: []*v1.Pod{updatedPods[1]}, podsToUpdate: []*v1.Pod{updatedPods[1]},
expectedMapAfterUpdate: map[string]*framework.QueuedPodInfo{ expectedMapAfterUpdate: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[1]): {PodInfo: framework.NewPodInfo(updatedPods[1]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[1]): {PodInfo: mustNewTestPodInfo(t, updatedPods[1]), UnschedulablePlugins: sets.NewString()},
util.GetPodFullName(pods[2]): {PodInfo: framework.NewPodInfo(pods[2]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[2]): {PodInfo: mustNewTestPodInfo(t, pods[2]), UnschedulablePlugins: sets.NewString()},
}, },
podsToDelete: []*v1.Pod{pods[2], pods[3]}, podsToDelete: []*v1.Pod{pods[2], pods[3]},
expectedMapAfterDelete: map[string]*framework.QueuedPodInfo{ expectedMapAfterDelete: map[string]*framework.QueuedPodInfo{
util.GetPodFullName(pods[1]): {PodInfo: framework.NewPodInfo(updatedPods[1]), UnschedulablePlugins: sets.NewString()}, util.GetPodFullName(pods[1]): {PodInfo: mustNewTestPodInfo(t, updatedPods[1]), UnschedulablePlugins: sets.NewString()},
}, },
}, },
} }
@ -1210,11 +1210,11 @@ func TestPriorityQueue_initPodMaxInUnschedulablePodsDuration(t *testing.T) {
var timestamp = time.Now() var timestamp = time.Now()
pInfo1 := &framework.QueuedPodInfo{ pInfo1 := &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(pod1), PodInfo: mustNewTestPodInfo(t, pod1),
Timestamp: timestamp.Add(-time.Second), Timestamp: timestamp.Add(-time.Second),
} }
pInfo2 := &framework.QueuedPodInfo{ pInfo2 := &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(pod2), PodInfo: mustNewTestPodInfo(t, pod2),
Timestamp: timestamp.Add(-2 * time.Second), Timestamp: timestamp.Add(-2 * time.Second),
} }
@ -1342,11 +1342,11 @@ func TestPodTimestamp(t *testing.T) {
var timestamp = time.Now() var timestamp = time.Now()
pInfo1 := &framework.QueuedPodInfo{ pInfo1 := &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(pod1), PodInfo: mustNewTestPodInfo(t, pod1),
Timestamp: timestamp, Timestamp: timestamp,
} }
pInfo2 := &framework.QueuedPodInfo{ pInfo2 := &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(pod2), PodInfo: mustNewTestPodInfo(t, pod2),
Timestamp: timestamp.Add(time.Second), Timestamp: timestamp.Add(time.Second),
} }
@ -1649,7 +1649,7 @@ func TestIncomingPodsMetrics(t *testing.T) {
var pInfos = make([]*framework.QueuedPodInfo, 0, 3) var pInfos = make([]*framework.QueuedPodInfo, 0, 3)
for i := 1; i <= 3; i++ { for i := 1; i <= 3; i++ {
p := &framework.QueuedPodInfo{ p := &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo( PodInfo: mustNewTestPodInfo(t,
st.MakePod().Name(fmt.Sprintf("test-pod-%d", i)).Namespace(fmt.Sprintf("ns%d", i)).UID(fmt.Sprintf("tp-%d", i)).Obj()), st.MakePod().Name(fmt.Sprintf("test-pod-%d", i)).Namespace(fmt.Sprintf("ns%d", i)).UID(fmt.Sprintf("tp-%d", i)).Obj()),
Timestamp: timestamp, Timestamp: timestamp,
} }
@ -1984,7 +1984,7 @@ func makeQueuedPodInfos(num int, timestamp time.Time) []*framework.QueuedPodInfo
var pInfos = make([]*framework.QueuedPodInfo, 0, num) var pInfos = make([]*framework.QueuedPodInfo, 0, num)
for i := 1; i <= num; i++ { for i := 1; i <= num; i++ {
p := &framework.QueuedPodInfo{ p := &framework.QueuedPodInfo{
PodInfo: framework.NewPodInfo(st.MakePod().Name(fmt.Sprintf("test-pod-%d", i)).Namespace(fmt.Sprintf("ns%d", i)).UID(fmt.Sprintf("tp-%d", i)).Obj()), PodInfo: mustNewPodInfo(st.MakePod().Name(fmt.Sprintf("test-pod-%d", i)).Namespace(fmt.Sprintf("ns%d", i)).UID(fmt.Sprintf("tp-%d", i)).Obj()),
Timestamp: timestamp, Timestamp: timestamp,
} }
pInfos = append(pInfos, p) pInfos = append(pInfos, p)
@ -2033,3 +2033,19 @@ func TestPriorityQueue_calculateBackoffDuration(t *testing.T) {
}) })
} }
} }
func mustNewTestPodInfo(t *testing.T, pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
t.Fatal(err)
}
return podInfo
}
func mustNewPodInfo(pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
panic(err)
}
return podInfo
}

View File

@ -900,7 +900,9 @@ func (sched *Scheduler) handleSchedulingFailure(ctx context.Context, fwk framewo
klog.InfoS("Pod has been assigned to node. Abort adding it back to queue.", "pod", klog.KObj(pod), "node", cachedPod.Spec.NodeName) klog.InfoS("Pod has been assigned to node. Abort adding it back to queue.", "pod", klog.KObj(pod), "node", cachedPod.Spec.NodeName)
} else { } else {
// As <cachedPod> is from SharedInformer, we need to do a DeepCopy() here. // As <cachedPod> is from SharedInformer, we need to do a DeepCopy() here.
podInfo.PodInfo = framework.NewPodInfo(cachedPod.DeepCopy()) // ignore this err since apiserver doesn't properly validate affinity terms
// and we can't fix the validation for backwards compatibility.
podInfo.PodInfo, _ = framework.NewPodInfo(cachedPod.DeepCopy())
if err := sched.SchedulingQueue.AddUnschedulableIfNotPresent(podInfo, sched.SchedulingQueue.SchedulingCycle()); err != nil { if err := sched.SchedulingQueue.AddUnschedulableIfNotPresent(podInfo, sched.SchedulingQueue.SchedulingCycle()); err != nil {
klog.ErrorS(err, "Error occurred") klog.ErrorS(err, "Error occurred")
} }

View File

@ -588,7 +588,7 @@ func TestSchedulerScheduleOne(t *testing.T) {
Cache: cache, Cache: cache,
client: client, client: client,
NextPod: func() *framework.QueuedPodInfo { NextPod: func() *framework.QueuedPodInfo {
return &framework.QueuedPodInfo{PodInfo: framework.NewPodInfo(item.sendPod)} return &framework.QueuedPodInfo{PodInfo: mustNewPodInfo(t, item.sendPod)}
}, },
SchedulingQueue: internalqueue.NewTestQueue(ctx, nil), SchedulingQueue: internalqueue.NewTestQueue(ctx, nil),
Profiles: profile.Map{testSchedulerName: fwk}, Profiles: profile.Map{testSchedulerName: fwk},
@ -825,7 +825,7 @@ func TestSchedulerFailedSchedulingReasons(t *testing.T) {
} }
informerFactory := informers.NewSharedInformerFactory(clientsetfake.NewSimpleClientset(objects...), 0) informerFactory := informers.NewSharedInformerFactory(clientsetfake.NewSimpleClientset(objects...), 0)
scheduler, _, errChan := setupTestScheduler(ctx, queuedPodStore, scache, informerFactory, nil, fns...) scheduler, _, errChan := setupTestScheduler(ctx, t, queuedPodStore, scache, informerFactory, nil, fns...)
queuedPodStore.Add(podWithTooBigResourceRequests) queuedPodStore.Add(podWithTooBigResourceRequests)
scheduler.scheduleOne(ctx) scheduler.scheduleOne(ctx)
@ -946,7 +946,7 @@ func TestSchedulerWithVolumeBinding(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
fakeVolumeBinder := volumebinding.NewFakeVolumeBinder(item.volumeBinderConfig) fakeVolumeBinder := volumebinding.NewFakeVolumeBinder(item.volumeBinderConfig)
s, bindingChan, errChan := setupTestSchedulerWithVolumeBinding(ctx, fakeVolumeBinder, eventBroadcaster) s, bindingChan, errChan := setupTestSchedulerWithVolumeBinding(ctx, t, fakeVolumeBinder, eventBroadcaster)
eventChan := make(chan struct{}) eventChan := make(chan struct{})
stopFunc := eventBroadcaster.StartEventWatcher(func(obj runtime.Object) { stopFunc := eventBroadcaster.StartEventWatcher(func(obj runtime.Object) {
e, _ := obj.(*eventsv1.Event) e, _ := obj.(*eventsv1.Event)
@ -2182,7 +2182,7 @@ func TestFindFitPredicateCallCounts(t *testing.T) {
if err := scheduler.Cache.UpdateSnapshot(scheduler.nodeInfoSnapshot); err != nil { if err := scheduler.Cache.UpdateSnapshot(scheduler.nodeInfoSnapshot); err != nil {
t.Fatal(err) t.Fatal(err)
} }
fwk.AddNominatedPod(framework.NewPodInfo(st.MakePod().UID("nominated").Priority(midPriority).Obj()), fwk.AddNominatedPod(mustNewPodInfo(t, st.MakePod().UID("nominated").Priority(midPriority).Obj()),
&framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "1"}) &framework.NominatingInfo{NominatingMode: framework.ModeOverride, NominatedNodeName: "1"})
_, _, err = scheduler.findNodesThatFitPod(ctx, fwk, framework.NewCycleState(), test.pod) _, _, err = scheduler.findNodesThatFitPod(ctx, fwk, framework.NewCycleState(), test.pod)
@ -2590,7 +2590,7 @@ func makeNode(node string, milliCPU, memory int64) *v1.Node {
// cache: scheduler cache that might contain assumed pods. // cache: scheduler cache that might contain assumed pods.
func setupTestSchedulerWithOnePodOnNode(ctx context.Context, t *testing.T, queuedPodStore *clientcache.FIFO, scache internalcache.Cache, func setupTestSchedulerWithOnePodOnNode(ctx context.Context, t *testing.T, queuedPodStore *clientcache.FIFO, scache internalcache.Cache,
pod *v1.Pod, node *v1.Node, fns ...st.RegisterPluginFunc) (*Scheduler, chan *v1.Binding, chan error) { pod *v1.Pod, node *v1.Node, fns ...st.RegisterPluginFunc) (*Scheduler, chan *v1.Binding, chan error) {
scheduler, bindingChan, errChan := setupTestScheduler(ctx, queuedPodStore, scache, nil, nil, fns...) scheduler, bindingChan, errChan := setupTestScheduler(ctx, t, queuedPodStore, scache, nil, nil, fns...)
queuedPodStore.Add(pod) queuedPodStore.Add(pod)
// queuedPodStore: [foo:8080] // queuedPodStore: [foo:8080]
@ -2617,7 +2617,7 @@ func setupTestSchedulerWithOnePodOnNode(ctx context.Context, t *testing.T, queue
// queuedPodStore: pods queued before processing. // queuedPodStore: pods queued before processing.
// scache: scheduler cache that might contain assumed pods. // scache: scheduler cache that might contain assumed pods.
func setupTestScheduler(ctx context.Context, queuedPodStore *clientcache.FIFO, cache internalcache.Cache, informerFactory informers.SharedInformerFactory, broadcaster events.EventBroadcaster, fns ...st.RegisterPluginFunc) (*Scheduler, chan *v1.Binding, chan error) { func setupTestScheduler(ctx context.Context, t *testing.T, queuedPodStore *clientcache.FIFO, cache internalcache.Cache, informerFactory informers.SharedInformerFactory, broadcaster events.EventBroadcaster, fns ...st.RegisterPluginFunc) (*Scheduler, chan *v1.Binding, chan error) {
bindingChan := make(chan *v1.Binding, 1) bindingChan := make(chan *v1.Binding, 1)
client := clientsetfake.NewSimpleClientset() client := clientsetfake.NewSimpleClientset()
client.PrependReactor("create", "pods", func(action clienttesting.Action) (bool, runtime.Object, error) { client.PrependReactor("create", "pods", func(action clienttesting.Action) (bool, runtime.Object, error) {
@ -2658,7 +2658,7 @@ func setupTestScheduler(ctx context.Context, queuedPodStore *clientcache.FIFO, c
nodeInfoSnapshot: internalcache.NewEmptySnapshot(), nodeInfoSnapshot: internalcache.NewEmptySnapshot(),
percentageOfNodesToScore: schedulerapi.DefaultPercentageOfNodesToScore, percentageOfNodesToScore: schedulerapi.DefaultPercentageOfNodesToScore,
NextPod: func() *framework.QueuedPodInfo { NextPod: func() *framework.QueuedPodInfo {
return &framework.QueuedPodInfo{PodInfo: framework.NewPodInfo(clientcache.Pop(queuedPodStore).(*v1.Pod))} return &framework.QueuedPodInfo{PodInfo: mustNewPodInfo(t, clientcache.Pop(queuedPodStore).(*v1.Pod))}
}, },
SchedulingQueue: schedulingQueue, SchedulingQueue: schedulingQueue,
Profiles: profile.Map{testSchedulerName: fwk}, Profiles: profile.Map{testSchedulerName: fwk},
@ -2674,7 +2674,7 @@ func setupTestScheduler(ctx context.Context, queuedPodStore *clientcache.FIFO, c
return sched, bindingChan, errChan return sched, bindingChan, errChan
} }
func setupTestSchedulerWithVolumeBinding(ctx context.Context, volumeBinder volumebinding.SchedulerVolumeBinder, broadcaster events.EventBroadcaster) (*Scheduler, chan *v1.Binding, chan error) { func setupTestSchedulerWithVolumeBinding(ctx context.Context, t *testing.T, volumeBinder volumebinding.SchedulerVolumeBinder, broadcaster events.EventBroadcaster) (*Scheduler, chan *v1.Binding, chan error) {
testNode := v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node1", UID: types.UID("node1")}} testNode := v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "node1", UID: types.UID("node1")}}
queuedPodStore := clientcache.NewFIFO(clientcache.MetaNamespaceKeyFunc) queuedPodStore := clientcache.NewFIFO(clientcache.MetaNamespaceKeyFunc)
pod := podWithID("foo", "") pod := podWithID("foo", "")
@ -2697,7 +2697,7 @@ func setupTestSchedulerWithVolumeBinding(ctx context.Context, volumeBinder volum
return &volumebinding.VolumeBinding{Binder: volumeBinder, PVCLister: pvcInformer.Lister()}, nil return &volumebinding.VolumeBinding{Binder: volumeBinder, PVCLister: pvcInformer.Lister()}, nil
}, "PreFilter", "Filter", "Reserve", "PreBind"), }, "PreFilter", "Filter", "Reserve", "PreBind"),
} }
s, bindingChan, errChan := setupTestScheduler(ctx, queuedPodStore, scache, informerFactory, broadcaster, fns...) s, bindingChan, errChan := setupTestScheduler(ctx, t, queuedPodStore, scache, informerFactory, broadcaster, fns...)
return s, bindingChan, errChan return s, bindingChan, errChan
} }
@ -2708,3 +2708,11 @@ func makePredicateError(failReason string) error {
s := fmt.Sprintf("0/1 nodes are available: %v.", failReason) s := fmt.Sprintf("0/1 nodes are available: %v.", failReason)
return fmt.Errorf(s) return fmt.Errorf(s)
} }
func mustNewPodInfo(t *testing.T, pod *v1.Pod) *framework.PodInfo {
podInfo, err := framework.NewPodInfo(pod)
if err != nil {
t.Fatal(err)
}
return podInfo
}

View File

@ -292,7 +292,7 @@ func TestFailureHandler(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
testPodInfo := &framework.QueuedPodInfo{PodInfo: framework.NewPodInfo(testPod)} testPodInfo := &framework.QueuedPodInfo{PodInfo: mustNewPodInfo(t, testPod)}
s.FailureHandler(ctx, fwk, testPodInfo, tt.injectErr, v1.PodReasonUnschedulable, nil) s.FailureHandler(ctx, fwk, testPodInfo, tt.injectErr, v1.PodReasonUnschedulable, nil)
var got *v1.Pod var got *v1.Pod
@ -367,7 +367,7 @@ func TestFailureHandler_NodeNotFound(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
testPodInfo := &framework.QueuedPodInfo{PodInfo: framework.NewPodInfo(testPod)} testPodInfo := &framework.QueuedPodInfo{PodInfo: mustNewPodInfo(t, testPod)}
s.FailureHandler(ctx, fwk, testPodInfo, tt.injectErr, v1.PodReasonUnschedulable, nil) s.FailureHandler(ctx, fwk, testPodInfo, tt.injectErr, v1.PodReasonUnschedulable, nil)
gotNodes := schedulerCache.Dump().Nodes gotNodes := schedulerCache.Dump().Nodes
@ -406,7 +406,7 @@ func TestFailureHandler_PodAlreadyBound(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
testPodInfo := &framework.QueuedPodInfo{PodInfo: framework.NewPodInfo(testPod)} testPodInfo := &framework.QueuedPodInfo{PodInfo: mustNewPodInfo(t, testPod)}
s.FailureHandler(ctx, fwk, testPodInfo, fmt.Errorf("binding rejected: timeout"), v1.PodReasonUnschedulable, nil) s.FailureHandler(ctx, fwk, testPodInfo, fmt.Errorf("binding rejected: timeout"), v1.PodReasonUnschedulable, nil)
pod := getPodFromPriorityQueue(queue, testPod) pod := getPodFromPriorityQueue(queue, testPod)