Browse code

libnet: convert to new-style driver registration

Per the Interface Segregation Principle, network drivers should not have
to depend on GetPluginGetter methods they do not use. The remote network
driver is the only one which needs a PluginGetter, and it is already
special-cased in Controller so there is no sense warping the interfaces
to achieve a foolish consistency. Replace all other network drivers' Init
functions with Register functions which take a driverapi.Registerer
argument instead of a driverapi.DriverCallback. Add back in Init wrapper
functions for only the drivers which Swarmkit references so that
Swarmkit can continue to build.

Refactor the libnetwork Controller to use the new drvregistry.Networks
and drvregistry.IPAMs driver registries in place of the legacy ones.

Signed-off-by: Cory Snider <csnider@mirantis.com>

Cory Snider authored on 2023/01/25 08:19:26
Showing 23 changed files
... ...
@@ -13,7 +13,6 @@ import (
13 13
 	"github.com/docker/docker/libnetwork/drivers/overlay"
14 14
 	"github.com/docker/docker/libnetwork/netlabel"
15 15
 	"github.com/docker/docker/libnetwork/types"
16
-	"github.com/docker/docker/pkg/plugingetter"
17 16
 	"github.com/docker/docker/pkg/reexec"
18 17
 	"github.com/vishvananda/netlink"
19 18
 )
... ...
@@ -28,10 +27,6 @@ type endpoint struct {
28 28
 	name string
29 29
 }
30 30
 
31
-func (r *router) GetPluginGetter() plugingetter.PluginGetter {
32
-	return nil
33
-}
34
-
35 31
 func (r *router) RegisterDriver(name string, driver driverapi.Driver, c driverapi.Capability) error {
36 32
 	r.d = driver
37 33
 	return nil
... ...
@@ -126,7 +121,7 @@ func main() {
126 126
 	}
127 127
 
128 128
 	r := &router{}
129
-	if err := overlay.Init(r, opt); err != nil {
129
+	if err := overlay.Register(r, opt); err != nil {
130 130
 		fmt.Printf("Failed to initialize overlay driver: %v\n", err)
131 131
 		os.Exit(1)
132 132
 	}
... ...
@@ -58,6 +58,7 @@ import (
58 58
 	"github.com/docker/docker/libnetwork/diagnostic"
59 59
 	"github.com/docker/docker/libnetwork/discoverapi"
60 60
 	"github.com/docker/docker/libnetwork/driverapi"
61
+	remotedriver "github.com/docker/docker/libnetwork/drivers/remote"
61 62
 	"github.com/docker/docker/libnetwork/drvregistry"
62 63
 	"github.com/docker/docker/libnetwork/ipamapi"
63 64
 	"github.com/docker/docker/libnetwork/netlabel"
... ...
@@ -85,7 +86,8 @@ type sandboxTable map[string]*Sandbox
85 85
 // Controller manages networks.
86 86
 type Controller struct {
87 87
 	id               string
88
-	drvRegistry      *drvregistry.DrvRegistry
88
+	drvRegistry      drvregistry.Networks
89
+	ipamRegistry     drvregistry.IPAMs
89 90
 	sandboxes        sandboxTable
90 91
 	cfg              *config.Config
91 92
 	store            datastore.DataStore
... ...
@@ -108,7 +110,7 @@ type Controller struct {
108 108
 }
109 109
 
110 110
 type initializer struct {
111
-	fn    drvregistry.InitFunc
111
+	fn    func(driverapi.Registerer, map[string]interface{}) error
112 112
 	ntype string
113 113
 }
114 114
 
... ...
@@ -130,31 +132,24 @@ func New(cfgOptions ...config.Option) (*Controller, error) {
130 130
 		return nil, err
131 131
 	}
132 132
 
133
-	drvRegistry, err := drvregistry.New(nil, nil, c.RegisterDriver, nil, c.cfg.PluginGetter)
134
-	if err != nil {
133
+	c.drvRegistry.Notify = c.RegisterDriver
134
+
135
+	// External plugins don't need config passed through daemon. They can
136
+	// bootstrap themselves.
137
+	if err := remotedriver.Register(&c.drvRegistry, c.cfg.PluginGetter); err != nil {
135 138
 		return nil, err
136 139
 	}
137 140
 
138 141
 	for _, i := range getInitializers() {
139
-		var dcfg map[string]interface{}
140
-
141
-		// External plugins don't need config passed through daemon. They can
142
-		// bootstrap themselves
143
-		if i.ntype != "remote" {
144
-			dcfg = c.makeDriverConfig(i.ntype)
145
-		}
146
-
147
-		if err := drvRegistry.AddDriver(i.ntype, i.fn, dcfg); err != nil {
142
+		if err := i.fn(&c.drvRegistry, c.makeDriverConfig(i.ntype)); err != nil {
148 143
 			return nil, err
149 144
 		}
150 145
 	}
151 146
 
152
-	if err = initIPAMDrivers(drvRegistry, c.cfg.PluginGetter, c.cfg.DefaultAddressPool); err != nil {
147
+	if err := initIPAMDrivers(&c.ipamRegistry, c.cfg.PluginGetter, c.cfg.DefaultAddressPool); err != nil {
153 148
 		return nil, err
154 149
 	}
155 150
 
156
-	c.drvRegistry = drvRegistry
157
-
158 151
 	c.WalkNetworks(populateSpecial)
159 152
 
160 153
 	// Reserve pools first before doing cleanup. Otherwise the
... ...
@@ -387,7 +382,7 @@ func (c *Controller) BuiltinDrivers() []string {
387 387
 // BuiltinIPAMDrivers returns the list of builtin ipam drivers.
388 388
 func (c *Controller) BuiltinIPAMDrivers() []string {
389 389
 	drivers := []string{}
390
-	c.drvRegistry.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool {
390
+	c.ipamRegistry.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool {
391 391
 		if driver.IsBuiltIn() {
392 392
 			drivers = append(drivers, name)
393 393
 		}
... ...
@@ -461,7 +456,7 @@ func (c *Controller) isDistributedControl() bool {
461 461
 }
462 462
 
463 463
 func (c *Controller) GetPluginGetter() plugingetter.PluginGetter {
464
-	return c.drvRegistry.GetPluginGetter()
464
+	return c.cfg.PluginGetter
465 465
 }
466 466
 
467 467
 func (c *Controller) RegisterDriver(networkType string, driver driverapi.Driver, capability driverapi.Capability) error {
... ...
@@ -476,7 +471,7 @@ const overlayDSROptionString = "dsr"
476 476
 // are network specific and modeled in a generic way.
477 477
 func (c *Controller) NewNetwork(networkType, name string, id string, options ...NetworkOption) (Network, error) {
478 478
 	var (
479
-		caps           *driverapi.Capability
479
+		caps           driverapi.Capability
480 480
 		err            error
481 481
 		t              *network
482 482
 		skipCfgEpCount bool
... ...
@@ -1101,7 +1096,7 @@ func (c *Controller) loadIPAMDriver(name string) error {
1101 1101
 }
1102 1102
 
1103 1103
 func (c *Controller) getIPAMDriver(name string) (ipamapi.Ipam, *ipamapi.Capability, error) {
1104
-	id, cap := c.drvRegistry.IPAM(name)
1104
+	id, cap := c.ipamRegistry.IPAM(name)
1105 1105
 	if id == nil {
1106 1106
 		// Might be a plugin name. Try loading it
1107 1107
 		if err := c.loadIPAMDriver(name); err != nil {
... ...
@@ -1109,7 +1104,7 @@ func (c *Controller) getIPAMDriver(name string) (ipamapi.Ipam, *ipamapi.Capabili
1109 1109
 		}
1110 1110
 
1111 1111
 		// Now that we resolved the plugin, try again looking up the registry
1112
-		id, cap = c.drvRegistry.IPAM(name)
1112
+		id, cap = c.ipamRegistry.IPAM(name)
1113 1113
 		if id == nil {
1114 1114
 			return nil, nil, types.BadRequestErrorf("invalid ipam driver: %q", name)
1115 1115
 		}
... ...
@@ -166,8 +166,8 @@ func newDriver() *driver {
166 166
 	}
167 167
 }
168 168
 
169
-// Init registers a new instance of bridge driver
170
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
169
+// Register registers a new instance of bridge driver.
170
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
171 171
 	d := newDriver()
172 172
 	if err := d.configure(config); err != nil {
173 173
 		return err
... ...
@@ -177,7 +177,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
177 177
 		DataScope:         datastore.LocalScope,
178 178
 		ConnectivityScope: datastore.LocalScope,
179 179
 	}
180
-	return dc.RegisterDriver(networkType, d, c)
180
+	return r.RegisterDriver(networkType, d, c)
181 181
 }
182 182
 
183 183
 // Validate performs a static validation on the network configuration parameters.
... ...
@@ -11,13 +11,20 @@ const networkType = "bridge"
11 11
 
12 12
 type driver struct{}
13 13
 
14
-// Init registers a new instance of bridge manager driver
14
+// Init registers a new instance of bridge manager driver.
15
+//
16
+// Deprecated: use [Register].
15 17
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
18
+	return Register(dc, config)
19
+}
20
+
21
+// Register registers a new instance of the bridge manager driver with r.
22
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
16 23
 	c := driverapi.Capability{
17 24
 		DataScope:         datastore.LocalScope,
18 25
 		ConnectivityScope: datastore.LocalScope,
19 26
 	}
20
-	return dc.RegisterDriver(networkType, &driver{}, c)
27
+	return r.RegisterDriver(networkType, &driver{}, c)
21 28
 }
22 29
 
23 30
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -16,13 +16,19 @@ type driver struct {
16 16
 	sync.Mutex
17 17
 }
18 18
 
19
-// Init registers a new instance of host driver
19
+// Init registers a new instance of host driver.
20
+//
21
+// Deprecated: use [Register].
20 22
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
23
+	return Register(dc, config)
24
+}
25
+
26
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
21 27
 	c := driverapi.Capability{
22 28
 		DataScope:         datastore.LocalScope,
23 29
 		ConnectivityScope: datastore.LocalScope,
24 30
 	}
25
-	return dc.RegisterDriver(networkType, &driver{}, c)
31
+	return r.RegisterDriver(networkType, &driver{}, c)
26 32
 }
27 33
 
28 34
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -62,8 +62,8 @@ type network struct {
62 62
 	sync.Mutex
63 63
 }
64 64
 
65
-// Init initializes and registers the libnetwork ipvlan driver
66
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
65
+// Register initializes and registers the libnetwork ipvlan driver.
66
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
67 67
 	c := driverapi.Capability{
68 68
 		DataScope:         datastore.LocalScope,
69 69
 		ConnectivityScope: datastore.GlobalScope,
... ...
@@ -75,7 +75,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
75 75
 		return err
76 76
 	}
77 77
 
78
-	return dc.RegisterDriver(driverName, d, c)
78
+	return r.RegisterDriver(driverName, d, c)
79 79
 }
80 80
 
81 81
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -7,7 +7,6 @@ import (
7 7
 	"testing"
8 8
 
9 9
 	"github.com/docker/docker/libnetwork/driverapi"
10
-	"github.com/docker/docker/pkg/plugingetter"
11 10
 )
12 11
 
13 12
 const testNetworkType = "ipvlan"
... ...
@@ -17,10 +16,6 @@ type driverTester struct {
17 17
 	d *driver
18 18
 }
19 19
 
20
-func (dt *driverTester) GetPluginGetter() plugingetter.PluginGetter {
21
-	return nil
22
-}
23
-
24 20
 func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
25 21
 	cap driverapi.Capability) error {
26 22
 	if name != testNetworkType {
... ...
@@ -37,15 +32,15 @@ func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
37 37
 	return nil
38 38
 }
39 39
 
40
-func TestIpvlanInit(t *testing.T) {
41
-	if err := Init(&driverTester{t: t}, nil); err != nil {
40
+func TestIpvlanRegister(t *testing.T) {
41
+	if err := Register(&driverTester{t: t}, nil); err != nil {
42 42
 		t.Fatal(err)
43 43
 	}
44 44
 }
45 45
 
46 46
 func TestIpvlanNilConfig(t *testing.T) {
47 47
 	dt := &driverTester{t: t}
48
-	if err := Init(dt, nil); err != nil {
48
+	if err := Register(dt, nil); err != nil {
49 49
 		t.Fatal(err)
50 50
 	}
51 51
 
... ...
@@ -56,7 +51,7 @@ func TestIpvlanNilConfig(t *testing.T) {
56 56
 
57 57
 func TestIpvlanType(t *testing.T) {
58 58
 	dt := &driverTester{t: t}
59
-	if err := Init(dt, nil); err != nil {
59
+	if err := Register(dt, nil); err != nil {
60 60
 		t.Fatal(err)
61 61
 	}
62 62
 
... ...
@@ -11,13 +11,20 @@ const networkType = "ipvlan"
11 11
 
12 12
 type driver struct{}
13 13
 
14
-// Init registers a new instance of ipvlan manager driver
14
+// Init registers a new instance of the ipvlan manager driver.
15
+//
16
+// Deprecated: use [Register].
15 17
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
18
+	return Register(dc, config)
19
+}
20
+
21
+// Register registers a new instance of the ipvlan manager driver.
22
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
16 23
 	c := driverapi.Capability{
17 24
 		DataScope:         datastore.LocalScope,
18 25
 		ConnectivityScope: datastore.GlobalScope,
19 26
 	}
20
-	return dc.RegisterDriver(networkType, &driver{}, c)
27
+	return r.RegisterDriver(networkType, &driver{}, c)
21 28
 }
22 29
 
23 30
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -56,8 +56,8 @@ type network struct {
56 56
 	sync.Mutex
57 57
 }
58 58
 
59
-// Init initializes and registers the libnetwork macvlan driver
60
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
59
+// Register initializes and registers the libnetwork macvlan driver
60
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
61 61
 	c := driverapi.Capability{
62 62
 		DataScope:         datastore.LocalScope,
63 63
 		ConnectivityScope: datastore.GlobalScope,
... ...
@@ -69,7 +69,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
69 69
 		return err
70 70
 	}
71 71
 
72
-	return dc.RegisterDriver(driverName, d, c)
72
+	return r.RegisterDriver(driverName, d, c)
73 73
 }
74 74
 
75 75
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -7,7 +7,6 @@ import (
7 7
 	"testing"
8 8
 
9 9
 	"github.com/docker/docker/libnetwork/driverapi"
10
-	"github.com/docker/docker/pkg/plugingetter"
11 10
 )
12 11
 
13 12
 const testNetworkType = "macvlan"
... ...
@@ -17,10 +16,6 @@ type driverTester struct {
17 17
 	d *driver
18 18
 }
19 19
 
20
-func (dt *driverTester) GetPluginGetter() plugingetter.PluginGetter {
21
-	return nil
22
-}
23
-
24 20
 func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
25 21
 	cap driverapi.Capability) error {
26 22
 	if name != testNetworkType {
... ...
@@ -37,15 +32,15 @@ func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
37 37
 	return nil
38 38
 }
39 39
 
40
-func TestMacvlanInit(t *testing.T) {
41
-	if err := Init(&driverTester{t: t}, nil); err != nil {
40
+func TestMacvlanRegister(t *testing.T) {
41
+	if err := Register(&driverTester{t: t}, nil); err != nil {
42 42
 		t.Fatal(err)
43 43
 	}
44 44
 }
45 45
 
46 46
 func TestMacvlanNilConfig(t *testing.T) {
47 47
 	dt := &driverTester{t: t}
48
-	if err := Init(dt, nil); err != nil {
48
+	if err := Register(dt, nil); err != nil {
49 49
 		t.Fatal(err)
50 50
 	}
51 51
 
... ...
@@ -56,7 +51,7 @@ func TestMacvlanNilConfig(t *testing.T) {
56 56
 
57 57
 func TestMacvlanType(t *testing.T) {
58 58
 	dt := &driverTester{t: t}
59
-	if err := Init(dt, nil); err != nil {
59
+	if err := Register(dt, nil); err != nil {
60 60
 		t.Fatal(err)
61 61
 	}
62 62
 
... ...
@@ -11,13 +11,20 @@ const networkType = "macvlan"
11 11
 
12 12
 type driver struct{}
13 13
 
14
-// Init registers a new instance of macvlan manager driver
14
+// Init registers a new instance of the macvlan manager driver.
15
+//
16
+// Deprecated: use [Register].
15 17
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
18
+	return Register(dc, config)
19
+}
20
+
21
+// Register registers a new instance of the macvlan manager driver.
22
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
16 23
 	c := driverapi.Capability{
17 24
 		DataScope:         datastore.LocalScope,
18 25
 		ConnectivityScope: datastore.GlobalScope,
19 26
 	}
20
-	return dc.RegisterDriver(networkType, &driver{}, c)
27
+	return r.RegisterDriver(networkType, &driver{}, c)
21 28
 }
22 29
 
23 30
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -16,12 +16,12 @@ type driver struct {
16 16
 	sync.Mutex
17 17
 }
18 18
 
19
-// Init registers a new instance of null driver
20
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
19
+// Register registers a new instance of the null driver.
20
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
21 21
 	c := driverapi.Capability{
22 22
 		DataScope: datastore.LocalScope,
23 23
 	}
24
-	return dc.RegisterDriver(networkType, &driver{}, c)
24
+	return r.RegisterDriver(networkType, &driver{}, c)
25 25
 }
26 26
 
27 27
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -58,8 +58,8 @@ type driver struct {
58 58
 	sync.Mutex
59 59
 }
60 60
 
61
-// Init registers a new instance of overlay driver
62
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
61
+// Register registers a new instance of the overlay driver.
62
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
63 63
 	c := driverapi.Capability{
64 64
 		DataScope:         datastore.GlobalScope,
65 65
 		ConnectivityScope: datastore.GlobalScope,
... ...
@@ -107,7 +107,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
107 107
 		logrus.Warnf("Failure during overlay endpoints restore: %v", err)
108 108
 	}
109 109
 
110
-	return dc.RegisterDriver(networkType, d, c)
110
+	return r.RegisterDriver(networkType, d, c)
111 111
 }
112 112
 
113 113
 // Endpoints are stored in the local store. Restore them and reconstruct the overlay sandbox
... ...
@@ -59,7 +59,7 @@ func setupDriver(t *testing.T) *driverTester {
59 59
 		},
60 60
 	}
61 61
 
62
-	if err := Init(dt, config); err != nil {
62
+	if err := Register(dt, config); err != nil {
63 63
 		t.Fatal(err)
64 64
 	}
65 65
 
... ...
@@ -114,14 +114,14 @@ func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
114 114
 }
115 115
 
116 116
 func TestOverlayInit(t *testing.T) {
117
-	if err := Init(&driverTester{t: t}, nil); err != nil {
117
+	if err := Register(&driverTester{t: t}, nil); err != nil {
118 118
 		t.Fatal(err)
119 119
 	}
120 120
 }
121 121
 
122 122
 func TestOverlayFiniWithoutConfig(t *testing.T) {
123 123
 	dt := &driverTester{t: t}
124
-	if err := Init(dt, nil); err != nil {
124
+	if err := Register(dt, nil); err != nil {
125 125
 		t.Fatal(err)
126 126
 	}
127 127
 
... ...
@@ -151,7 +151,7 @@ func TestOverlayConfig(t *testing.T) {
151 151
 
152 152
 func TestOverlayType(t *testing.T) {
153 153
 	dt := &driverTester{t: t}
154
-	if err := Init(dt, nil); err != nil {
154
+	if err := Register(dt, nil); err != nil {
155 155
 		t.Fatal(err)
156 156
 	}
157 157
 
... ...
@@ -44,8 +44,15 @@ type network struct {
44 44
 	sync.Mutex
45 45
 }
46 46
 
47
-// Init registers a new instance of overlay driver
47
+// Init registers a new instance of the overlay driver.
48
+//
49
+// Deprecated: use [Register].
48 50
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
51
+	return Register(dc, config)
52
+}
53
+
54
+// Register registers a new instance of the overlay driver.
55
+func Register(r driverapi.DriverCallback, config map[string]interface{}) error {
49 56
 	var err error
50 57
 	c := driverapi.Capability{
51 58
 		DataScope:         datastore.GlobalScope,
... ...
@@ -62,7 +69,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
62 62
 		return fmt.Errorf("failed to initialize vxlan id manager: %v", err)
63 63
 	}
64 64
 
65
-	return dc.RegisterDriver(networkType, d, c)
65
+	return r.RegisterDriver(networkType, d, c)
66 66
 }
67 67
 
68 68
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
... ...
@@ -30,7 +30,15 @@ func newDriver(name string, client *plugins.Client) driverapi.Driver {
30 30
 
31 31
 // Init makes sure a remote driver is registered when a network driver
32 32
 // plugin is activated.
33
+//
34
+// Deprecated: use [Register].
33 35
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
36
+	return Register(dc, dc.GetPluginGetter())
37
+}
38
+
39
+// Register makes sure a remote driver is registered with r when a network
40
+// driver plugin is activated.
41
+func Register(r driverapi.Registerer, pg plugingetter.PluginGetter) error {
34 42
 	newPluginHandler := func(name string, client *plugins.Client) {
35 43
 		// negotiate driver capability with client
36 44
 		d := newDriver(name, client)
... ...
@@ -39,14 +47,14 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
39 39
 			logrus.Errorf("error getting capability for %s due to %v", name, err)
40 40
 			return
41 41
 		}
42
-		if err = dc.RegisterDriver(name, d, *c); err != nil {
42
+		if err = r.RegisterDriver(name, d, *c); err != nil {
43 43
 			logrus.Errorf("error registering driver for %s due to %v", name, err)
44 44
 		}
45 45
 	}
46 46
 
47 47
 	// Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins.
48 48
 	handleFunc := plugins.Handle
49
-	if pg := dc.GetPluginGetter(); pg != nil {
49
+	if pg != nil {
50 50
 		handleFunc = pg.Handle
51 51
 		activePlugins := pg.GetAllManagedPluginsByCap(driverapi.NetworkPluginEndpointType)
52 52
 		for _, ap := range activePlugins {
... ...
@@ -30,8 +30,8 @@ type driver struct {
30 30
 	sync.Mutex
31 31
 }
32 32
 
33
-// Init registers a new instance of overlay driver
34
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
33
+// Register registers a new instance of the overlay driver.
34
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
35 35
 	c := driverapi.Capability{
36 36
 		DataScope:         datastore.GlobalScope,
37 37
 		ConnectivityScope: datastore.GlobalScope,
... ...
@@ -68,7 +68,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
68 68
 
69 69
 	d.restoreHNSNetworks()
70 70
 
71
-	return dc.RegisterDriver(networkType, d, c)
71
+	return r.RegisterDriver(networkType, d, c)
72 72
 }
73 73
 
74 74
 func (d *driver) restoreHNSNetworks() error {
... ...
@@ -127,8 +127,8 @@ func newDriver(networkType string) *driver {
127 127
 }
128 128
 
129 129
 // GetInit returns an initializer for the given network type
130
-func GetInit(networkType string) func(dc driverapi.DriverCallback, config map[string]interface{}) error {
131
-	return func(dc driverapi.DriverCallback, config map[string]interface{}) error {
130
+func GetInit(networkType string) func(dc driverapi.Registerer, config map[string]interface{}) error {
131
+	return func(dc driverapi.Registerer, config map[string]interface{}) error {
132 132
 		if !IsBuiltinLocalDriver(networkType) {
133 133
 			return types.BadRequestErrorf("Network type not supported: %s", networkType)
134 134
 		}
... ...
@@ -2,12 +2,10 @@ package libnetwork
2 2
 
3 3
 import (
4 4
 	"github.com/docker/docker/libnetwork/drivers/null"
5
-	"github.com/docker/docker/libnetwork/drivers/remote"
6 5
 )
7 6
 
8 7
 func getInitializers() []initializer {
9 8
 	return []initializer{
10
-		{null.Init, "null"},
11
-		{remote.Init, "remote"},
9
+		{null.Register, "null"},
12 10
 	}
13 11
 }
... ...
@@ -7,18 +7,16 @@ import (
7 7
 	"github.com/docker/docker/libnetwork/drivers/macvlan"
8 8
 	"github.com/docker/docker/libnetwork/drivers/null"
9 9
 	"github.com/docker/docker/libnetwork/drivers/overlay"
10
-	"github.com/docker/docker/libnetwork/drivers/remote"
11 10
 )
12 11
 
13 12
 func getInitializers() []initializer {
14 13
 	in := []initializer{
15
-		{bridge.Init, "bridge"},
16
-		{host.Init, "host"},
17
-		{ipvlan.Init, "ipvlan"},
18
-		{macvlan.Init, "macvlan"},
19
-		{null.Init, "null"},
20
-		{overlay.Init, "overlay"},
21
-		{remote.Init, "remote"},
14
+		{bridge.Register, "bridge"},
15
+		{host.Register, "host"},
16
+		{ipvlan.Register, "ipvlan"},
17
+		{macvlan.Register, "macvlan"},
18
+		{null.Register, "null"},
19
+		{overlay.Register, "overlay"},
22 20
 	}
23 21
 	return in
24 22
 }
... ...
@@ -2,16 +2,14 @@ package libnetwork
2 2
 
3 3
 import (
4 4
 	"github.com/docker/docker/libnetwork/drivers/null"
5
-	"github.com/docker/docker/libnetwork/drivers/remote"
6 5
 	"github.com/docker/docker/libnetwork/drivers/windows"
7 6
 	"github.com/docker/docker/libnetwork/drivers/windows/overlay"
8 7
 )
9 8
 
10 9
 func getInitializers() []initializer {
11 10
 	return []initializer{
12
-		{null.Init, "null"},
13
-		{overlay.Init, "overlay"},
14
-		{remote.Init, "remote"},
11
+		{null.Register, "null"},
12
+		{overlay.Register, "overlay"},
15 13
 		{windows.GetInit("transparent"), "transparent"},
16 14
 		{windows.GetInit("l2bridge"), "l2bridge"},
17 15
 		{windows.GetInit("l2tunnel"), "l2tunnel"},
... ...
@@ -576,7 +576,7 @@ func TestIpamReleaseOnNetDriverFailures(t *testing.T) {
576 576
 	}
577 577
 	defer c.Stop()
578 578
 
579
-	if err := c.drvRegistry.AddDriver(badDriverName, badDriverInit, nil); err != nil {
579
+	if err := badDriverRegister(&c.drvRegistry); err != nil {
580 580
 		t.Fatal(err)
581 581
 	}
582 582
 
... ...
@@ -643,7 +643,7 @@ type badDriver struct {
643 643
 
644 644
 var bd = badDriver{failNetworkCreation: true}
645 645
 
646
-func badDriverInit(reg driverapi.DriverCallback, opt map[string]interface{}) error {
646
+func badDriverRegister(reg driverapi.Registerer) error {
647 647
 	return reg.RegisterDriver(badDriverName, &bd, driverapi.Capability{DataScope: datastore.LocalScope})
648 648
 }
649 649
 
... ...
@@ -916,7 +916,7 @@ func NetworkDeleteOptionRemoveLB(p *networkDeleteParams) {
916 916
 	p.rmLBEndpoint = true
917 917
 }
918 918
 
919
-func (n *network) resolveDriver(name string, load bool) (driverapi.Driver, *driverapi.Capability, error) {
919
+func (n *network) resolveDriver(name string, load bool) (driverapi.Driver, driverapi.Capability, error) {
920 920
 	c := n.getController()
921 921
 
922 922
 	// Check if a driver for the specified network type is available
... ...
@@ -925,16 +925,16 @@ func (n *network) resolveDriver(name string, load bool) (driverapi.Driver, *driv
925 925
 		if load {
926 926
 			err := c.loadDriver(name)
927 927
 			if err != nil {
928
-				return nil, nil, err
928
+				return nil, driverapi.Capability{}, err
929 929
 			}
930 930
 
931 931
 			d, cap = c.drvRegistry.Driver(name)
932 932
 			if d == nil {
933
-				return nil, nil, fmt.Errorf("could not resolve driver %s in registry", name)
933
+				return nil, driverapi.Capability{}, fmt.Errorf("could not resolve driver %s in registry", name)
934 934
 			}
935 935
 		} else {
936 936
 			// don't fail if driver loading is not required
937
-			return nil, nil, nil
937
+			return nil, driverapi.Capability{}, nil
938 938
 		}
939 939
 	}
940 940
 
... ...
@@ -957,7 +957,7 @@ func (n *network) driver(load bool) (driverapi.Driver, error) {
957 957
 
958 958
 	n.mu.Lock()
959 959
 	// If load is not required, driver, cap and err may all be nil
960
-	if n.scope == "" && cap != nil {
960
+	if n.scope == "" {
961 961
 		n.scope = cap.DataScope
962 962
 	}
963 963
 	if n.dynamic {
... ...
@@ -1772,7 +1772,11 @@ func (n *network) getIPData(ipVer int) []driverapi.IPAMData {
1772 1772
 }
1773 1773
 
1774 1774
 func (n *network) deriveAddressSpace() (string, error) {
1775
-	local, global, err := n.getController().drvRegistry.IPAMDefaultAddressSpaces(n.ipamType)
1775
+	ipam, _ := n.getController().ipamRegistry.IPAM(n.ipamType)
1776
+	if ipam == nil {
1777
+		return "", types.NotFoundErrorf("failed to get default address space: unknown ipam type %q", n.ipamType)
1778
+	}
1779
+	local, global, err := ipam.GetDefaultAddressSpaces()
1776 1780
 	if err != nil {
1777 1781
 		return "", types.NotFoundErrorf("failed to get default address space: %v", err)
1778 1782
 	}