From e7625c8d91c7d932edcaf0d93d7a6e9e2fadd58f Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Tue, 9 Sep 2014 15:45:31 -0700 Subject: [PATCH] Add current state to replica controller. --- pkg/registry/controller/rest.go | 14 ++++++++-- pkg/registry/controller/rest_test.go | 41 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/pkg/registry/controller/rest.go b/pkg/registry/controller/rest.go index 703d8f0a99e..d494c7791af 100644 --- a/pkg/registry/controller/rest.go +++ b/pkg/registry/controller/rest.go @@ -92,7 +92,7 @@ func (rs *REST) Get(id string) (runtime.Object, error) { if err != nil { return nil, err } - rs.fillCurrentState(&controller) + rs.fillCurrentState(controller) return controller, err } @@ -149,7 +149,11 @@ func (rs *REST) Watch(label, field labels.Selector, resourceVersion uint64) (wat } return watch.Filter(incoming, func(e watch.Event) (watch.Event, bool) { repController := e.Object.(*api.ReplicationController) - return e, label.Matches(labels.Set(repController.Labels)) + match := label.Matches(labels.Set(repController.Labels)) + if match { + rs.fillCurrentState(repController) + } + return e, match }), nil } @@ -168,9 +172,13 @@ func (rs *REST) waitForController(ctrl *api.ReplicationController) (runtime.Obje } func (rs *REST) fillCurrentState(ctrl *api.ReplicationController) error { - list, err := rs.podLister.ListPods(ctrl.DesiredState.ReplicaSelector) + if rs.podLister == nil { + return nil + } + list, err := rs.podLister.ListPods(labels.Set(ctrl.DesiredState.ReplicaSelector).AsSelector()) if err != nil { return err } ctrl.CurrentState.Replicas = len(list.Items) + return nil } diff --git a/pkg/registry/controller/rest_test.go b/pkg/registry/controller/rest_test.go index 2332a1eecaa..d2f66810aa6 100644 --- a/pkg/registry/controller/rest_test.go +++ b/pkg/registry/controller/rest_test.go @@ -316,3 +316,44 @@ func TestControllerStorageValidatesUpdate(t *testing.T) { } } } + +type fakePodLister struct { + e error + l api.PodList + s labels.Selector +} + +func (f *fakePodLister) ListPods(s labels.Selector) (*api.PodList, error) { + f.s = s + return &f.l, f.e +} + +func TestFillCurrentState(t *testing.T) { + fakeLister := fakePodLister{ + l: api.PodList{ + Items: []api.Pod{ + {JSONBase: api.JSONBase{ID: "foo"}}, + {JSONBase: api.JSONBase{ID: "bar"}}, + }, + }, + } + mockRegistry := registrytest.ControllerRegistry{} + storage := REST{ + registry: &mockRegistry, + podLister: &fakeLister, + } + controller := api.ReplicationController{ + DesiredState: api.ReplicationControllerState{ + ReplicaSelector: map[string]string{ + "foo": "bar", + }, + }, + } + storage.fillCurrentState(&controller) + if controller.CurrentState.Replicas != 2 { + t.Errorf("expected 2, got: %d", controller.CurrentState.Replicas) + } + if !reflect.DeepEqual(fakeLister.s, labels.Set(controller.DesiredState.ReplicaSelector).AsSelector()) { + t.Errorf("unexpected output: %#v %#v", labels.Set(controller.DesiredState.ReplicaSelector).AsSelector(), fakeLister.s) + } +}