Make Reflector helpers reusable.
Scheduler uses Reflector from pkg/client/cache. It defines some helper classes. I'd like to use those helpers with pkg/client/cache in kube-proxy and kubelet too.
This commit is contained in:
@@ -28,10 +28,8 @@ import (
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/cache"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
||||
algorithm "github.com/GoogleCloudPlatform/kubernetes/pkg/scheduler"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/scheduler"
|
||||
|
||||
"github.com/golang/glog"
|
||||
@@ -130,38 +128,13 @@ func (f *ConfigFactory) CreateFromKeys(predicateKeys, priorityKeys util.StringSe
|
||||
}, nil
|
||||
}
|
||||
|
||||
type listWatch struct {
|
||||
client *client.Client
|
||||
fieldSelector labels.Selector
|
||||
resource string
|
||||
}
|
||||
|
||||
func (lw *listWatch) List() (runtime.Object, error) {
|
||||
return lw.client.
|
||||
Get().
|
||||
Resource(lw.resource).
|
||||
SelectorParam("fields", lw.fieldSelector).
|
||||
Do().
|
||||
Get()
|
||||
}
|
||||
|
||||
func (lw *listWatch) Watch(resourceVersion string) (watch.Interface, error) {
|
||||
return lw.client.
|
||||
Get().
|
||||
Prefix("watch").
|
||||
Resource(lw.resource).
|
||||
SelectorParam("fields", lw.fieldSelector).
|
||||
Param("resourceVersion", resourceVersion).
|
||||
Watch()
|
||||
}
|
||||
|
||||
// createUnassignedPodLW returns a listWatch that finds all pods that need to be
|
||||
// createUnassignedPodLW returns a cache.ListWatch that finds all pods that need to be
|
||||
// scheduled.
|
||||
func (factory *ConfigFactory) createUnassignedPodLW() *listWatch {
|
||||
return &listWatch{
|
||||
client: factory.Client,
|
||||
fieldSelector: labels.Set{"DesiredState.Host": ""}.AsSelector(),
|
||||
resource: "pods",
|
||||
func (factory *ConfigFactory) createUnassignedPodLW() *cache.ListWatch {
|
||||
return &cache.ListWatch{
|
||||
Client: factory.Client,
|
||||
FieldSelector: labels.Set{"DesiredState.Host": ""}.AsSelector(),
|
||||
Resource: "pods",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,22 +146,23 @@ func parseSelectorOrDie(s string) labels.Selector {
|
||||
return selector
|
||||
}
|
||||
|
||||
// createAssignedPodLW returns a listWatch that finds all pods that are
|
||||
// createAssignedPodLW returns a cache.ListWatch that finds all pods that are
|
||||
// already scheduled.
|
||||
func (factory *ConfigFactory) createAssignedPodLW() *listWatch {
|
||||
return &listWatch{
|
||||
client: factory.Client,
|
||||
fieldSelector: parseSelectorOrDie("DesiredState.Host!="),
|
||||
resource: "pods",
|
||||
// TODO: return a ListerWatcher interface instead?
|
||||
func (factory *ConfigFactory) createAssignedPodLW() *cache.ListWatch {
|
||||
return &cache.ListWatch{
|
||||
Client: factory.Client,
|
||||
FieldSelector: parseSelectorOrDie("DesiredState.Host!="),
|
||||
Resource: "pods",
|
||||
}
|
||||
}
|
||||
|
||||
// createMinionLW returns a listWatch that gets all changes to minions.
|
||||
func (factory *ConfigFactory) createMinionLW() *listWatch {
|
||||
return &listWatch{
|
||||
client: factory.Client,
|
||||
fieldSelector: parseSelectorOrDie(""),
|
||||
resource: "minions",
|
||||
// createMinionLW returns a cache.ListWatch that gets all changes to minions.
|
||||
func (factory *ConfigFactory) createMinionLW() *cache.ListWatch {
|
||||
return &cache.ListWatch{
|
||||
Client: factory.Client,
|
||||
FieldSelector: parseSelectorOrDie(""),
|
||||
Resource: "minions",
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -47,103 +47,6 @@ func TestCreate(t *testing.T) {
|
||||
factory.Create()
|
||||
}
|
||||
|
||||
func TestCreateLists(t *testing.T) {
|
||||
factory := NewConfigFactory(nil)
|
||||
table := []struct {
|
||||
location string
|
||||
factory func() *listWatch
|
||||
}{
|
||||
// Minion
|
||||
{
|
||||
location: "/api/" + testapi.Version() + "/minions",
|
||||
factory: factory.createMinionLW,
|
||||
},
|
||||
// Assigned pod
|
||||
{
|
||||
location: "/api/" + testapi.Version() + "/pods?fields=DesiredState.Host!%3D",
|
||||
factory: factory.createAssignedPodLW,
|
||||
},
|
||||
// Unassigned pod
|
||||
{
|
||||
location: "/api/" + testapi.Version() + "/pods?fields=DesiredState.Host%3D",
|
||||
factory: factory.createUnassignedPodLW,
|
||||
},
|
||||
}
|
||||
|
||||
for _, item := range table {
|
||||
handler := util.FakeHandler{
|
||||
StatusCode: 500,
|
||||
ResponseBody: "",
|
||||
T: t,
|
||||
}
|
||||
server := httptest.NewServer(&handler)
|
||||
defer server.Close()
|
||||
factory.Client = client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()})
|
||||
// This test merely tests that the correct request is made.
|
||||
item.factory().List()
|
||||
handler.ValidateRequest(t, item.location, "GET", nil)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCreateWatches(t *testing.T) {
|
||||
factory := NewConfigFactory(nil)
|
||||
table := []struct {
|
||||
rv string
|
||||
location string
|
||||
factory func() *listWatch
|
||||
}{
|
||||
// Minion watch
|
||||
{
|
||||
rv: "",
|
||||
location: "/api/" + testapi.Version() + "/watch/minions?resourceVersion=",
|
||||
factory: factory.createMinionLW,
|
||||
}, {
|
||||
rv: "0",
|
||||
location: "/api/" + testapi.Version() + "/watch/minions?resourceVersion=0",
|
||||
factory: factory.createMinionLW,
|
||||
}, {
|
||||
rv: "42",
|
||||
location: "/api/" + testapi.Version() + "/watch/minions?resourceVersion=42",
|
||||
factory: factory.createMinionLW,
|
||||
},
|
||||
// Assigned pod watches
|
||||
{
|
||||
rv: "",
|
||||
location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host!%3D&resourceVersion=",
|
||||
factory: factory.createAssignedPodLW,
|
||||
}, {
|
||||
rv: "42",
|
||||
location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host!%3D&resourceVersion=42",
|
||||
factory: factory.createAssignedPodLW,
|
||||
},
|
||||
// Unassigned pod watches
|
||||
{
|
||||
rv: "",
|
||||
location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host%3D&resourceVersion=",
|
||||
factory: factory.createUnassignedPodLW,
|
||||
}, {
|
||||
rv: "42",
|
||||
location: "/api/" + testapi.Version() + "/watch/pods?fields=DesiredState.Host%3D&resourceVersion=42",
|
||||
factory: factory.createUnassignedPodLW,
|
||||
},
|
||||
}
|
||||
|
||||
for _, item := range table {
|
||||
handler := util.FakeHandler{
|
||||
StatusCode: 500,
|
||||
ResponseBody: "",
|
||||
T: t,
|
||||
}
|
||||
server := httptest.NewServer(&handler)
|
||||
defer server.Close()
|
||||
factory.Client = client.NewOrDie(&client.Config{Host: server.URL, Version: testapi.Version()})
|
||||
|
||||
// This test merely tests that the correct request is made.
|
||||
item.factory().Watch(item.rv)
|
||||
handler.ValidateRequest(t, item.location, "GET", nil)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPollMinions(t *testing.T) {
|
||||
table := []struct {
|
||||
minions []api.Node
|
||||
|
Reference in New Issue
Block a user