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