@@ -6,12 +6,12 @@ import (
66 "sync"
77
88 "github.com/Sirupsen/logrus"
9- "github.com/docker/libkv/store"
109 "github.com/docker/libnetwork/datastore"
1110 "github.com/docker/libnetwork/discoverapi"
1211 "github.com/docker/libnetwork/driverapi"
1312 "github.com/docker/libnetwork/idm"
1413 "github.com/docker/libnetwork/netlabel"
14+ "github.com/docker/libnetwork/types"
1515 "github.com/hashicorp/serf/serf"
1616)
1717
@@ -25,6 +25,8 @@ const (
2525 vxlanVethMTU = 1450
2626)
2727
28+ var initVxlanIdm = make (chan (bool ), 1 )
29+
2830type driver struct {
2931 eventCh chan serf.Event
3032 notifyCh chan ovNotify
@@ -56,6 +58,18 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
5658 config : config ,
5759 }
5860
61+ if data , ok := config [netlabel .GlobalKVClient ]; ok {
62+ var err error
63+ dsc , ok := data .(discoverapi.DatastoreConfigData )
64+ if ! ok {
65+ return types .InternalErrorf ("incorrect data in datastore configuration: %v" , data )
66+ }
67+ d .store , err = datastore .NewDataStoreFromConfig (dsc )
68+ if err != nil {
69+ return types .InternalErrorf ("failed to initialize data store: %v" , err )
70+ }
71+ }
72+
5973 return dc .RegisterDriver (networkType , d , c )
6074}
6175
@@ -73,42 +87,33 @@ func Fini(drv driverapi.Driver) {
7387}
7488
7589func (d * driver ) configure () error {
76- var err error
90+ if d .store == nil {
91+ return types .NoServiceErrorf ("datastore is not available" )
92+ }
7793
78- if len ( d . config ) == 0 {
79- return nil
94+ if d . vxlanIdm == nil {
95+ return d . initializeVxlanIdm ()
8096 }
8197
82- d .once .Do (func () {
83- provider , provOk := d .config [netlabel .GlobalKVProvider ]
84- provURL , urlOk := d .config [netlabel .GlobalKVProviderURL ]
98+ return nil
99+ }
85100
86- if provOk && urlOk {
87- cfg := & datastore.ScopeCfg {
88- Client : datastore.ScopeClientCfg {
89- Provider : provider .(string ),
90- Address : provURL .(string ),
91- },
92- }
93- provConfig , confOk := d .config [netlabel .GlobalKVProviderConfig ]
94- if confOk {
95- cfg .Client .Config = provConfig .(* store.Config )
96- }
97- d .store , err = datastore .NewDataStore (datastore .GlobalScope , cfg )
98- if err != nil {
99- err = fmt .Errorf ("failed to initialize data store: %v" , err )
100- return
101- }
102- }
101+ func (d * driver ) initializeVxlanIdm () error {
102+ var err error
103103
104- d .vxlanIdm , err = idm .New (d .store , "vxlan-id" , vxlanIDStart , vxlanIDEnd )
105- if err != nil {
106- err = fmt .Errorf ("failed to initialize vxlan id manager: %v" , err )
107- return
108- }
109- })
104+ initVxlanIdm <- true
105+ defer func () { <- initVxlanIdm }()
106+
107+ if d .vxlanIdm != nil {
108+ return nil
109+ }
110+
111+ d .vxlanIdm , err = idm .New (d .store , "vxlan-id" , vxlanIDStart , vxlanIDEnd )
112+ if err != nil {
113+ return fmt .Errorf ("failed to initialize vxlan id manager: %v" , err )
114+ }
110115
111- return err
116+ return nil
112117}
113118
114119func (d * driver ) Type () string {
@@ -187,12 +192,27 @@ func (d *driver) pushLocalEndpointEvent(action, nid, eid string) {
187192
188193// DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster
189194func (d * driver ) DiscoverNew (dType discoverapi.DiscoveryType , data interface {}) error {
190- if dType == discoverapi .NodeDiscovery {
195+ switch dType {
196+ case discoverapi .NodeDiscovery :
191197 nodeData , ok := data .(discoverapi.NodeDiscoveryData )
192198 if ! ok || nodeData .Address == "" {
193199 return fmt .Errorf ("invalid discovery data" )
194200 }
195201 d .nodeJoin (nodeData .Address , nodeData .Self )
202+ case discoverapi .DatastoreConfig :
203+ var err error
204+ if d .store != nil {
205+ return types .ForbiddenErrorf ("cannot accept datastore configuration: Overlay driver has a datastore configured already" )
206+ }
207+ dsc , ok := data .(discoverapi.DatastoreConfigData )
208+ if ! ok {
209+ return types .InternalErrorf ("incorrect data in datastore configuration: %v" , data )
210+ }
211+ d .store , err = datastore .NewDataStoreFromConfig (dsc )
212+ if err != nil {
213+ return types .InternalErrorf ("failed to initialize data store: %v" , err )
214+ }
215+ default :
196216 }
197217 return nil
198218}
0 commit comments