mirror of https://github.com/k3s-io/k3s
Merge pull request #69412 from tossmilestone/scheduler-factory-test
Refactor scheduler factory testpull/58/head
commit
060218a862
|
@ -253,7 +253,7 @@ func getLogsAction(namespace string, opts *corev1.PodLogOptions) testclient.Acti
|
||||||
action.Verb = "get"
|
action.Verb = "get"
|
||||||
action.Namespace = namespace
|
action.Namespace = namespace
|
||||||
action.Resource = podsResource
|
action.Resource = podsResource
|
||||||
action.Subresource = "logs"
|
action.Subresource = "log"
|
||||||
action.Value = opts
|
action.Value = opts
|
||||||
return action
|
return action
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,13 +74,13 @@ go_test(
|
||||||
"//staging/src/k8s.io/api/core/v1: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/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/testing:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/util/testing:go_default_library",
|
|
||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,8 +19,6 @@ package factory
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
|
||||||
"net/http/httptest"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -28,13 +26,13 @@ import (
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
restclient "k8s.io/client-go/rest"
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
|
fakeV1 "k8s.io/client-go/kubernetes/typed/core/v1/fake"
|
||||||
|
clienttesting "k8s.io/client-go/testing"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
utiltesting "k8s.io/client-go/util/testing"
|
|
||||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/algorithm"
|
"k8s.io/kubernetes/pkg/scheduler/algorithm"
|
||||||
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
|
schedulerapi "k8s.io/kubernetes/pkg/scheduler/api"
|
||||||
|
@ -53,14 +51,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreate(t *testing.T) {
|
func TestCreate(t *testing.T) {
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
factory.Create()
|
factory.Create()
|
||||||
}
|
}
|
||||||
|
@ -71,14 +62,7 @@ func TestCreateFromConfig(t *testing.T) {
|
||||||
var configData []byte
|
var configData []byte
|
||||||
var policy schedulerapi.Policy
|
var policy schedulerapi.Policy
|
||||||
|
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
|
|
||||||
// Pre-register some predicate and priority functions
|
// Pre-register some predicate and priority functions
|
||||||
|
@ -116,14 +100,7 @@ func TestCreateFromConfigWithHardPodAffinitySymmetricWeight(t *testing.T) {
|
||||||
var configData []byte
|
var configData []byte
|
||||||
var policy schedulerapi.Policy
|
var policy schedulerapi.Policy
|
||||||
|
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
|
|
||||||
// Pre-register some predicate and priority functions
|
// Pre-register some predicate and priority functions
|
||||||
|
@ -162,14 +139,7 @@ func TestCreateFromEmptyConfig(t *testing.T) {
|
||||||
var configData []byte
|
var configData []byte
|
||||||
var policy schedulerapi.Policy
|
var policy schedulerapi.Policy
|
||||||
|
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
|
|
||||||
configData = []byte(`{}`)
|
configData = []byte(`{}`)
|
||||||
|
@ -184,14 +154,7 @@ func TestCreateFromEmptyConfig(t *testing.T) {
|
||||||
// predicate/priority.
|
// predicate/priority.
|
||||||
// The predicate/priority from DefaultProvider will be used.
|
// The predicate/priority from DefaultProvider will be used.
|
||||||
func TestCreateFromConfigWithUnspecifiedPredicatesOrPriorities(t *testing.T) {
|
func TestCreateFromConfigWithUnspecifiedPredicatesOrPriorities(t *testing.T) {
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
|
|
||||||
RegisterFitPredicate("PredicateOne", PredicateOne)
|
RegisterFitPredicate("PredicateOne", PredicateOne)
|
||||||
|
@ -224,14 +187,7 @@ func TestCreateFromConfigWithUnspecifiedPredicatesOrPriorities(t *testing.T) {
|
||||||
// predicate/priority.
|
// predicate/priority.
|
||||||
// Empty predicate/priority sets will be used.
|
// Empty predicate/priority sets will be used.
|
||||||
func TestCreateFromConfigWithEmptyPredicatesOrPriorities(t *testing.T) {
|
func TestCreateFromConfigWithEmptyPredicatesOrPriorities(t *testing.T) {
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
|
|
||||||
RegisterFitPredicate("PredicateOne", PredicateOne)
|
RegisterFitPredicate("PredicateOne", PredicateOne)
|
||||||
|
@ -283,24 +239,14 @@ func TestDefaultErrorFunc(t *testing.T) {
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "bar"},
|
||||||
Spec: apitesting.V1DeepEqualSafePodSpec(),
|
Spec: apitesting.V1DeepEqualSafePodSpec(),
|
||||||
}
|
}
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testPod}})
|
||||||
StatusCode: 200,
|
|
||||||
ResponseBody: runtime.EncodeOrDie(schedulertesting.Test.Codec(), testPod),
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
mux := http.NewServeMux()
|
|
||||||
|
|
||||||
// FakeHandler mustn't be sent requests other than the one you want to test.
|
|
||||||
mux.Handle(schedulertesting.Test.ResourcePath(string(v1.ResourcePods), "bar", "foo"), &handler)
|
|
||||||
server := httptest.NewServer(mux)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
factory := newConfigFactory(client, v1.DefaultHardPodAffinitySymmetricWeight)
|
||||||
queue := &internalqueue.FIFO{FIFO: cache.NewFIFO(cache.MetaNamespaceKeyFunc)}
|
queue := &internalqueue.FIFO{FIFO: cache.NewFIFO(cache.MetaNamespaceKeyFunc)}
|
||||||
podBackoff := util.CreatePodBackoff(1*time.Millisecond, 1*time.Second)
|
podBackoff := util.CreatePodBackoff(1*time.Millisecond, 1*time.Second)
|
||||||
errFunc := factory.MakeDefaultErrorFunc(podBackoff, queue)
|
errFunc := factory.MakeDefaultErrorFunc(podBackoff, queue)
|
||||||
|
|
||||||
errFunc(testPod, nil)
|
errFunc(testPod, nil)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
// This is a terrible way to do this but I plan on replacing this
|
// This is a terrible way to do this but I plan on replacing this
|
||||||
// whole error handling system in the future. The test will time
|
// whole error handling system in the future. The test will time
|
||||||
|
@ -310,7 +256,27 @@ func TestDefaultErrorFunc(t *testing.T) {
|
||||||
if !exists {
|
if !exists {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
handler.ValidateRequest(t, schedulertesting.Test.ResourcePath(string(v1.ResourcePods), "bar", "foo"), "GET", nil)
|
requestReceived := false
|
||||||
|
actions := client.Actions()
|
||||||
|
for _, a := range actions {
|
||||||
|
if a.GetVerb() == "get" {
|
||||||
|
getAction, ok := a.(clienttesting.GetAction)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("Can't cast action object to GetAction interface")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
name := getAction.GetName()
|
||||||
|
ns := a.GetNamespace()
|
||||||
|
if name != "foo" || ns != "bar" {
|
||||||
|
t.Errorf("Expected name %s namespace %s, got %s %s",
|
||||||
|
"foo", "bar", name, ns)
|
||||||
|
}
|
||||||
|
requestReceived = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !requestReceived {
|
||||||
|
t.Errorf("Get pod request not received")
|
||||||
|
}
|
||||||
if e, a := testPod, got; !reflect.DeepEqual(e, a) {
|
if e, a := testPod, got; !reflect.DeepEqual(e, a) {
|
||||||
t.Errorf("Expected %v, got %v", e, a)
|
t.Errorf("Expected %v, got %v", e, a)
|
||||||
}
|
}
|
||||||
|
@ -371,35 +337,38 @@ func TestBind(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testBind(binding *v1.Binding, t *testing.T) {
|
func testBind(binding *v1.Binding, t *testing.T) {
|
||||||
handler := utiltesting.FakeHandler{
|
testPod := &v1.Pod{
|
||||||
StatusCode: 200,
|
ObjectMeta: metav1.ObjectMeta{Name: binding.GetName(), Namespace: metav1.NamespaceDefault},
|
||||||
ResponseBody: "",
|
Spec: apitesting.V1DeepEqualSafePodSpec(),
|
||||||
T: t,
|
|
||||||
}
|
}
|
||||||
server := httptest.NewServer(&handler)
|
client := fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testPod}})
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
b := binder{client}
|
b := binder{client}
|
||||||
|
|
||||||
if err := b.Bind(binding); err != nil {
|
if err := b.Bind(binding); err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pod := client.CoreV1().Pods(metav1.NamespaceDefault).(*fakeV1.FakePods)
|
||||||
|
|
||||||
|
bind, err := pod.GetBinding(binding.GetName())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
expectedBody := runtime.EncodeOrDie(schedulertesting.Test.Codec(), binding)
|
expectedBody := runtime.EncodeOrDie(schedulertesting.Test.Codec(), binding)
|
||||||
handler.ValidateRequest(t,
|
bind.APIVersion = ""
|
||||||
schedulertesting.Test.SubResourcePath(string(v1.ResourcePods), metav1.NamespaceDefault, "foo", "binding"),
|
bind.Kind = ""
|
||||||
"POST", &expectedBody)
|
body := runtime.EncodeOrDie(schedulertesting.Test.Codec(), bind)
|
||||||
|
if expectedBody != body {
|
||||||
|
t.Errorf("Expected body %s, Got %s", expectedBody, body)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInvalidHardPodAffinitySymmetricWeight(t *testing.T) {
|
func TestInvalidHardPodAffinitySymmetricWeight(t *testing.T) {
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
// factory of "default-scheduler"
|
// factory of "default-scheduler"
|
||||||
factory := newConfigFactory(client, -1)
|
factory := newConfigFactory(client, -1)
|
||||||
_, err := factory.Create()
|
_, err := factory.Create()
|
||||||
|
@ -409,14 +378,7 @@ func TestInvalidHardPodAffinitySymmetricWeight(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInvalidFactoryArgs(t *testing.T) {
|
func TestInvalidFactoryArgs(t *testing.T) {
|
||||||
handler := utiltesting.FakeHandler{
|
client := fake.NewSimpleClientset()
|
||||||
StatusCode: 500,
|
|
||||||
ResponseBody: "",
|
|
||||||
T: t,
|
|
||||||
}
|
|
||||||
server := httptest.NewServer(&handler)
|
|
||||||
defer server.Close()
|
|
||||||
client := clientset.NewForConfigOrDie(&restclient.Config{Host: server.URL, ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group: "", Version: "v1"}}})
|
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -539,7 +501,7 @@ func TestSkipPodUpdate(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newConfigFactory(client *clientset.Clientset, hardPodAffinitySymmetricWeight int32) Configurator {
|
func newConfigFactory(client clientset.Interface, hardPodAffinitySymmetricWeight int32) Configurator {
|
||||||
informerFactory := informers.NewSharedInformerFactory(client, 0)
|
informerFactory := informers.NewSharedInformerFactory(client, 0)
|
||||||
return NewConfigFactory(&ConfigFactoryArgs{
|
return NewConfigFactory(&ConfigFactoryArgs{
|
||||||
v1.DefaultSchedulerName,
|
v1.DefaultSchedulerName,
|
||||||
|
|
|
@ -26,20 +26,31 @@ import (
|
||||||
func (c *FakePods) Bind(binding *v1.Binding) error {
|
func (c *FakePods) Bind(binding *v1.Binding) error {
|
||||||
action := core.CreateActionImpl{}
|
action := core.CreateActionImpl{}
|
||||||
action.Verb = "create"
|
action.Verb = "create"
|
||||||
|
action.Namespace = binding.Namespace
|
||||||
action.Resource = podsResource
|
action.Resource = podsResource
|
||||||
action.Subresource = "bindings"
|
action.Subresource = "binding"
|
||||||
action.Object = binding
|
action.Object = binding
|
||||||
|
|
||||||
_, err := c.Fake.Invokes(action, binding)
|
_, err := c.Fake.Invokes(action, binding)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *FakePods) GetBinding(name string) (result *v1.Binding, err error) {
|
||||||
|
obj, err := c.Fake.
|
||||||
|
Invokes(core.NewGetSubresourceAction(podsResource, c.ns, "binding", name), &v1.Binding{})
|
||||||
|
|
||||||
|
if obj == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return obj.(*v1.Binding), err
|
||||||
|
}
|
||||||
|
|
||||||
func (c *FakePods) GetLogs(name string, opts *v1.PodLogOptions) *restclient.Request {
|
func (c *FakePods) GetLogs(name string, opts *v1.PodLogOptions) *restclient.Request {
|
||||||
action := core.GenericActionImpl{}
|
action := core.GenericActionImpl{}
|
||||||
action.Verb = "get"
|
action.Verb = "get"
|
||||||
action.Namespace = c.ns
|
action.Namespace = c.ns
|
||||||
action.Resource = podsResource
|
action.Resource = podsResource
|
||||||
action.Subresource = "logs"
|
action.Subresource = "log"
|
||||||
action.Value = opts
|
action.Value = opts
|
||||||
|
|
||||||
_, _ = c.Fake.Invokes(action, &v1.Pod{})
|
_, _ = c.Fake.Invokes(action, &v1.Pod{})
|
||||||
|
|
Loading…
Reference in New Issue