diff --git a/pkg/scheduler/util/BUILD b/pkg/scheduler/util/BUILD index 61b523aea93..600be6f23c4 100644 --- a/pkg/scheduler/util/BUILD +++ b/pkg/scheduler/util/BUILD @@ -16,7 +16,9 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/api/v1/pod:go_default_library", + "//pkg/scheduler/api:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) diff --git a/pkg/scheduler/util/utils_test.go b/pkg/scheduler/util/utils_test.go index af29a98792b..cc97326d515 100644 --- a/pkg/scheduler/util/utils_test.go +++ b/pkg/scheduler/util/utils_test.go @@ -17,12 +17,16 @@ limitations under the License. package util import ( + "fmt" "reflect" "testing" + "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/kubernetes/pkg/api/v1/pod" + "k8s.io/kubernetes/pkg/scheduler/api" ) // TestSortableList tests SortableList by storing pods in the list and sorting @@ -171,3 +175,92 @@ func TestGetContainerPorts(t *testing.T) { } } } + +func TestGetPodFullName(t *testing.T) { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "test", + Name: "pod", + }, + } + got := GetPodFullName(pod) + expected := fmt.Sprintf("%s_%s", pod.Name, pod.Namespace) + if got != expected { + t.Errorf("Got wrong full name, got: %s, expected: %s", got, expected) + } +} + +func newPriorityPodWithStartTime(name string, priority int32, startTime time.Time) *v1.Pod { + return &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.PodSpec{ + Priority: &priority, + }, + Status: v1.PodStatus{ + StartTime: &metav1.Time{Time: startTime}, + }, + } +} + +func TestGetEarliestPodStartTime(t *testing.T) { + currentTime := time.Now() + pod1 := newPriorityPodWithStartTime("pod1", 1, currentTime.Add(time.Second)) + pod2 := newPriorityPodWithStartTime("pod2", 2, currentTime.Add(time.Second)) + pod3 := newPriorityPodWithStartTime("pod3", 2, currentTime) + victims := &api.Victims{ + Pods: []*v1.Pod{pod1, pod2, pod3}, + } + startTime := GetEarliestPodStartTime(victims) + if !startTime.Equal(pod3.Status.StartTime) { + t.Errorf("Got wrong earliest pod start time") + } + + pod1 = newPriorityPodWithStartTime("pod1", 2, currentTime) + pod2 = newPriorityPodWithStartTime("pod2", 2, currentTime.Add(time.Second)) + pod3 = newPriorityPodWithStartTime("pod3", 2, currentTime.Add(2*time.Second)) + victims = &api.Victims{ + Pods: []*v1.Pod{pod1, pod2, pod3}, + } + startTime = GetEarliestPodStartTime(victims) + if !startTime.Equal(pod1.Status.StartTime) { + t.Errorf("Got wrong earliest pod start time, got %v, expected %v", startTime, pod1.Status.StartTime) + } +} + +func TestMoreImportantPod(t *testing.T) { + currentTime := time.Now() + pod1 := newPriorityPodWithStartTime("pod1", 1, currentTime) + pod2 := newPriorityPodWithStartTime("pod2", 2, currentTime.Add(time.Second)) + pod3 := newPriorityPodWithStartTime("pod3", 2, currentTime) + + tests := map[string]struct { + p1 *v1.Pod + p2 *v1.Pod + expected bool + }{ + "Pod with higher priority": { + p1: pod1, + p2: pod2, + expected: false, + }, + "Pod with older created time": { + p1: pod2, + p2: pod3, + expected: false, + }, + "Pods with same start time": { + p1: pod3, + p2: pod1, + expected: true, + }, + } + + for k, v := range tests { + got := MoreImportantPod(v.p1, v.p2) + if got != v.expected { + t.Errorf("%s failed, expected %t but got %t", k, v.expected, got) + } + } +}