|
|
|
|
@@ -23,6 +23,7 @@ import (
|
|
|
|
|
|
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
|
"k8s.io/kubernetes/pkg/api/v1"
|
|
|
|
|
apps "k8s.io/kubernetes/pkg/apis/apps/v1beta1"
|
|
|
|
|
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
|
|
|
|
|
schedulerapi "k8s.io/kubernetes/plugin/pkg/scheduler/api"
|
|
|
|
|
"k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache"
|
|
|
|
|
@@ -60,6 +61,7 @@ func TestSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
rcs []*v1.ReplicationController
|
|
|
|
|
rss []*extensions.ReplicaSet
|
|
|
|
|
services []*v1.Service
|
|
|
|
|
sss []*apps.StatefulSet
|
|
|
|
|
expectedList schedulerapi.HostPriorityList
|
|
|
|
|
test string
|
|
|
|
|
}{
|
|
|
|
|
@@ -202,6 +204,19 @@ func TestSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 5}},
|
|
|
|
|
test: "service with partial pod label matches with service and replica set",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels2}},
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
{Spec: zone2Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
},
|
|
|
|
|
nodes: []string{"machine1", "machine2"},
|
|
|
|
|
services: []*v1.Service{{Spec: v1.ServiceSpec{Selector: map[string]string{"baz": "blah"}}}},
|
|
|
|
|
sss: []*apps.StatefulSet{{Spec: apps.StatefulSetSpec{Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}}}},
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 5}},
|
|
|
|
|
test: "service with partial pod label matches with service and replica set",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"foo": "bar", "bar": "foo"}, OwnerReferences: controllerRef("ReplicationController", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
@@ -230,6 +245,19 @@ func TestSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 5}},
|
|
|
|
|
test: "disjoined service and replica set should be treated equally",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"foo": "bar", "bar": "foo"}, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels2}},
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
{Spec: zone2Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
},
|
|
|
|
|
nodes: []string{"machine1", "machine2"},
|
|
|
|
|
services: []*v1.Service{{Spec: v1.ServiceSpec{Selector: map[string]string{"bar": "foo"}}}},
|
|
|
|
|
sss: []*apps.StatefulSet{{Spec: apps.StatefulSetSpec{Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}}}},
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 5}},
|
|
|
|
|
test: "disjoined service and replica set should be treated equally",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("ReplicationController", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
@@ -256,6 +284,19 @@ func TestSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 0}},
|
|
|
|
|
test: "Replica set with partial pod label matches",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels2}},
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
{Spec: zone2Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
},
|
|
|
|
|
nodes: []string{"machine1", "machine2"},
|
|
|
|
|
sss: []*apps.StatefulSet{{Spec: apps.StatefulSetSpec{Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}}}},
|
|
|
|
|
// We use StatefulSet, instead of ReplicationController. The result should be exactly as above.
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 0}},
|
|
|
|
|
test: "StatefulSet with partial pod label matches",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("ReplicationController", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
@@ -281,14 +322,28 @@ func TestSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 5}},
|
|
|
|
|
test: "Another replication set with partial pod label matches",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
pods: []*v1.Pod{
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels2, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
{Spec: zone1Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
{Spec: zone2Spec, ObjectMeta: metav1.ObjectMeta{Labels: labels1, OwnerReferences: controllerRef("StatefulSet", "name", "abc123")}},
|
|
|
|
|
},
|
|
|
|
|
nodes: []string{"machine1", "machine2"},
|
|
|
|
|
sss: []*apps.StatefulSet{{Spec: apps.StatefulSetSpec{Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"baz": "blah"}}}}},
|
|
|
|
|
// We use StatefulSet, instead of ReplicationController. The result should be exactly as above.
|
|
|
|
|
expectedList: []schedulerapi.HostPriority{{Host: "machine1", Score: 0}, {Host: "machine2", Score: 5}},
|
|
|
|
|
test: "Another stateful set with partial pod label matches",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, test := range tests {
|
|
|
|
|
nodeNameToInfo := schedulercache.CreateNodeNameToInfoMap(test.pods, nil)
|
|
|
|
|
selectorSpread := SelectorSpread{
|
|
|
|
|
serviceLister: schedulertesting.FakeServiceLister(test.services),
|
|
|
|
|
controllerLister: schedulertesting.FakeControllerLister(test.rcs),
|
|
|
|
|
replicaSetLister: schedulertesting.FakeReplicaSetLister(test.rss),
|
|
|
|
|
serviceLister: schedulertesting.FakeServiceLister(test.services),
|
|
|
|
|
controllerLister: schedulertesting.FakeControllerLister(test.rcs),
|
|
|
|
|
replicaSetLister: schedulertesting.FakeReplicaSetLister(test.rss),
|
|
|
|
|
statefulSetLister: schedulertesting.FakeStatefulSetLister(test.sss),
|
|
|
|
|
}
|
|
|
|
|
list, err := selectorSpread.CalculateSpreadPriority(test.pod, nodeNameToInfo, makeNodeList(test.nodes))
|
|
|
|
|
if err != nil {
|
|
|
|
|
@@ -346,6 +401,7 @@ func TestZoneSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
rcs []*v1.ReplicationController
|
|
|
|
|
rss []*extensions.ReplicaSet
|
|
|
|
|
services []*v1.Service
|
|
|
|
|
sss []*apps.StatefulSet
|
|
|
|
|
expectedList schedulerapi.HostPriorityList
|
|
|
|
|
test string
|
|
|
|
|
}{
|
|
|
|
|
@@ -493,9 +549,10 @@ func TestZoneSelectorSpreadPriority(t *testing.T) {
|
|
|
|
|
for _, test := range tests {
|
|
|
|
|
nodeNameToInfo := schedulercache.CreateNodeNameToInfoMap(test.pods, nil)
|
|
|
|
|
selectorSpread := SelectorSpread{
|
|
|
|
|
serviceLister: schedulertesting.FakeServiceLister(test.services),
|
|
|
|
|
controllerLister: schedulertesting.FakeControllerLister(test.rcs),
|
|
|
|
|
replicaSetLister: schedulertesting.FakeReplicaSetLister(test.rss),
|
|
|
|
|
serviceLister: schedulertesting.FakeServiceLister(test.services),
|
|
|
|
|
controllerLister: schedulertesting.FakeControllerLister(test.rcs),
|
|
|
|
|
replicaSetLister: schedulertesting.FakeReplicaSetLister(test.rss),
|
|
|
|
|
statefulSetLister: schedulertesting.FakeStatefulSetLister(test.sss),
|
|
|
|
|
}
|
|
|
|
|
list, err := selectorSpread.CalculateSpreadPriority(test.pod, nodeNameToInfo, makeLabeledNodeList(labeledNodes))
|
|
|
|
|
if err != nil {
|
|
|
|
|
|