Add a system modeler to scheduler
So it can try to predict the effect its bindings will have.
This commit is contained in:
@@ -34,8 +34,16 @@ type fakeBinder struct {
|
||||
|
||||
func (fb fakeBinder) Bind(binding *api.Binding) error { return fb.b(binding) }
|
||||
|
||||
func podWithID(id string) *api.Pod {
|
||||
return &api.Pod{ObjectMeta: api.ObjectMeta{Name: id, SelfLink: testapi.SelfLink("pods", id)}}
|
||||
func podWithID(id, desiredHost string) *api.Pod {
|
||||
return &api.Pod{
|
||||
ObjectMeta: api.ObjectMeta{Name: id, SelfLink: testapi.SelfLink("pods", id)},
|
||||
Spec: api.PodSpec{
|
||||
Host: desiredHost,
|
||||
},
|
||||
Status: api.PodStatus{
|
||||
Host: desiredHost,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type mockScheduler struct {
|
||||
@@ -53,32 +61,34 @@ func TestScheduler(t *testing.T) {
|
||||
errB := errors.New("binder")
|
||||
|
||||
table := []struct {
|
||||
injectBindError error
|
||||
sendPod *api.Pod
|
||||
algo scheduler.Scheduler
|
||||
expectErrorPod *api.Pod
|
||||
expectError error
|
||||
expectBind *api.Binding
|
||||
eventReason string
|
||||
injectBindError error
|
||||
sendPod *api.Pod
|
||||
algo scheduler.Scheduler
|
||||
expectErrorPod *api.Pod
|
||||
expectAssumedPod *api.Pod
|
||||
expectError error
|
||||
expectBind *api.Binding
|
||||
eventReason string
|
||||
}{
|
||||
{
|
||||
sendPod: podWithID("foo"),
|
||||
algo: mockScheduler{"machine1", nil},
|
||||
expectBind: &api.Binding{ObjectMeta: api.ObjectMeta{Name: "foo"}, Target: api.ObjectReference{Kind: "Node", Name: "machine1"}},
|
||||
eventReason: "scheduled",
|
||||
sendPod: podWithID("foo", ""),
|
||||
algo: mockScheduler{"machine1", nil},
|
||||
expectBind: &api.Binding{ObjectMeta: api.ObjectMeta{Name: "foo"}, Target: api.ObjectReference{Kind: "Node", Name: "machine1"}},
|
||||
expectAssumedPod: podWithID("foo", "machine1"),
|
||||
eventReason: "scheduled",
|
||||
}, {
|
||||
sendPod: podWithID("foo"),
|
||||
sendPod: podWithID("foo", ""),
|
||||
algo: mockScheduler{"machine1", errS},
|
||||
expectError: errS,
|
||||
expectErrorPod: podWithID("foo"),
|
||||
expectErrorPod: podWithID("foo", ""),
|
||||
eventReason: "failedScheduling",
|
||||
}, {
|
||||
sendPod: podWithID("foo"),
|
||||
sendPod: podWithID("foo", ""),
|
||||
algo: mockScheduler{"machine1", nil},
|
||||
expectBind: &api.Binding{ObjectMeta: api.ObjectMeta{Name: "foo"}, Target: api.ObjectReference{Kind: "Node", Name: "machine1"}},
|
||||
injectBindError: errB,
|
||||
expectError: errB,
|
||||
expectErrorPod: podWithID("foo"),
|
||||
expectErrorPod: podWithID("foo", ""),
|
||||
eventReason: "failedScheduling",
|
||||
},
|
||||
}
|
||||
@@ -86,8 +96,14 @@ func TestScheduler(t *testing.T) {
|
||||
for i, item := range table {
|
||||
var gotError error
|
||||
var gotPod *api.Pod
|
||||
var gotAssumedPod *api.Pod
|
||||
var gotBinding *api.Binding
|
||||
c := &Config{
|
||||
Modeler: &FakeModeler{
|
||||
AssumePodFunc: func(pod *api.Pod) {
|
||||
gotAssumedPod = pod
|
||||
},
|
||||
},
|
||||
MinionLister: scheduler.FakeMinionLister(
|
||||
api.NodeList{Items: []api.Node{{ObjectMeta: api.ObjectMeta{Name: "machine1"}}}},
|
||||
),
|
||||
@@ -114,6 +130,9 @@ func TestScheduler(t *testing.T) {
|
||||
close(called)
|
||||
})
|
||||
s.scheduleOne()
|
||||
if e, a := item.expectAssumedPod, gotAssumedPod; !reflect.DeepEqual(e, a) {
|
||||
t.Errorf("%v: assumed pod: wanted %v, got %v", i, e, a)
|
||||
}
|
||||
if e, a := item.expectErrorPod, gotPod; !reflect.DeepEqual(e, a) {
|
||||
t.Errorf("%v: error pod: wanted %v, got %v", i, e, a)
|
||||
}
|
||||
|
Reference in New Issue
Block a user