From a63fca344f857fbb7f51e16cbedae4e0929b2b2c Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Sun, 5 Jun 2016 19:37:13 -0700 Subject: [PATCH] Add agent initialization wait method in controller Agent initialization wait method is added to make sure callers for controller methods which depend on agent initialization to be complete can wait on it. Signed-off-by: Jana Radhakrishnan --- libnetwork/controller.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libnetwork/controller.go b/libnetwork/controller.go index 5eb71a857f..549c476853 100644 --- a/libnetwork/controller.go +++ b/libnetwork/controller.go @@ -114,6 +114,9 @@ type NetworkController interface { // SetClusterProvider sets cluster provider SetClusterProvider(provider cluster.Provider) + + // Wait for agent initialization complete in libnetwork controller + AgentInitWait() } // NetworkWalker is a client provided function which will be used to walk the Networks. @@ -143,6 +146,7 @@ type controller struct { ingressSandbox *sandbox sboxOnce sync.Once agent *agent + agentInitDone chan struct{} sync.Mutex } @@ -159,6 +163,7 @@ func New(cfgOptions ...config.Option) (NetworkController, error) { sandboxes: sandboxTable{}, svcRecords: make(map[string]svcInfo), serviceBindings: make(map[string]*service), + agentInitDone: make(chan struct{}), } if err := c.initStores(); err != nil { @@ -248,6 +253,10 @@ func (c *controller) clusterAgentInit() { } return false }) + + if c.agent != nil { + close(c.agentInitDone) + } } } if remoteAddr != "" { @@ -262,6 +271,12 @@ func (c *controller) clusterAgentInit() { } } +// AgentInitWait waits for agent initialization to be completed in the +// controller. +func (c *controller) AgentInitWait() { + <-c.agentInitDone +} + func (c *controller) makeDriverConfig(ntype string) map[string]interface{} { if c.cfg == nil { return nil