diff --git a/pkg/namespace/namespace_controller.go b/pkg/namespace/namespace_controller.go index cb3bff21b39..cf8412d5649 100644 --- a/pkg/namespace/namespace_controller.go +++ b/pkg/namespace/namespace_controller.go @@ -62,14 +62,24 @@ func NewNamespaceManager(kubeClient client.Interface, resyncPeriod time.Duration ) return &NamespaceManager{ - controller: controller, - StopEverything: make(chan struct{}), + controller: controller, } } // Run begins observing the system. It starts a goroutine and returns immediately. func (nm *NamespaceManager) Run() { - go nm.controller.Run(nm.StopEverything) + if nm.StopEverything == nil { + nm.StopEverything = make(chan struct{}) + go nm.controller.Run(nm.StopEverything) + } +} + +// Stop gracefully shutsdown this controller +func (nm *NamespaceManager) Stop() { + if nm.StopEverything != nil { + close(nm.StopEverything) + nm.StopEverything = nil + } } // finalized returns true if the spec.finalizers is empty list diff --git a/pkg/namespace/namespace_controller_test.go b/pkg/namespace/namespace_controller_test.go index cb133309701..53fb4daa02b 100644 --- a/pkg/namespace/namespace_controller_test.go +++ b/pkg/namespace/namespace_controller_test.go @@ -18,8 +18,10 @@ package namespace import ( "testing" + "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest" "github.com/GoogleCloudPlatform/kubernetes/pkg/client/testclient" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" ) @@ -131,3 +133,25 @@ func TestSyncNamespaceThatIsActive(t *testing.T) { t.Errorf("Expected no action from controller, but got: %v", actionSet) } } + +func TestRunStop(t *testing.T) { + o := testclient.NewObjects(api.Scheme) + client := &testclient.Fake{ReactFn: testclient.ObjectReaction(o, latest.RESTMapper)} + nsMgr := NewNamespaceManager(client, 1*time.Second) + + if nsMgr.StopEverything != nil { + t.Errorf("Non-running manager should not have a stop channel. Got %v", nsMgr.StopEverything) + } + + nsMgr.Run() + + if nsMgr.StopEverything == nil { + t.Errorf("Running manager should have a stop channel. Got nil") + } + + nsMgr.Stop() + + if nsMgr.StopEverything != nil { + t.Errorf("Non-running manager should not have a stop channel. Got %v", nsMgr.StopEverything) + } +}