Bläddra i källkod

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 2 år sedan
förälder
incheckning
28edc8e2d6

+ 1 - 6
libnetwork/cmd/ovrouter/ovrouter.go

@@ -13,7 +13,6 @@ import (
 	"github.com/docker/docker/libnetwork/drivers/overlay"
 	"github.com/docker/docker/libnetwork/drivers/overlay"
 	"github.com/docker/docker/libnetwork/netlabel"
 	"github.com/docker/docker/libnetwork/netlabel"
 	"github.com/docker/docker/libnetwork/types"
 	"github.com/docker/docker/libnetwork/types"
-	"github.com/docker/docker/pkg/plugingetter"
 	"github.com/docker/docker/pkg/reexec"
 	"github.com/docker/docker/pkg/reexec"
 	"github.com/vishvananda/netlink"
 	"github.com/vishvananda/netlink"
 )
 )
@@ -28,10 +27,6 @@ type endpoint struct {
 	name string
 	name string
 }
 }
 
 
-func (r *router) GetPluginGetter() plugingetter.PluginGetter {
-	return nil
-}
-
 func (r *router) RegisterDriver(name string, driver driverapi.Driver, c driverapi.Capability) error {
 func (r *router) RegisterDriver(name string, driver driverapi.Driver, c driverapi.Capability) error {
 	r.d = driver
 	r.d = driver
 	return nil
 	return nil
@@ -126,7 +121,7 @@ func main() {
 	}
 	}
 
 
 	r := &router{}
 	r := &router{}
-	if err := overlay.Init(r, opt); err != nil {
+	if err := overlay.Register(r, opt); err != nil {
 		fmt.Printf("Failed to initialize overlay driver: %v\n", err)
 		fmt.Printf("Failed to initialize overlay driver: %v\n", err)
 		os.Exit(1)
 		os.Exit(1)
 	}
 	}

+ 16 - 21
libnetwork/controller.go

@@ -58,6 +58,7 @@ import (
 	"github.com/docker/docker/libnetwork/diagnostic"
 	"github.com/docker/docker/libnetwork/diagnostic"
 	"github.com/docker/docker/libnetwork/discoverapi"
 	"github.com/docker/docker/libnetwork/discoverapi"
 	"github.com/docker/docker/libnetwork/driverapi"
 	"github.com/docker/docker/libnetwork/driverapi"
+	remotedriver "github.com/docker/docker/libnetwork/drivers/remote"
 	"github.com/docker/docker/libnetwork/drvregistry"
 	"github.com/docker/docker/libnetwork/drvregistry"
 	"github.com/docker/docker/libnetwork/ipamapi"
 	"github.com/docker/docker/libnetwork/ipamapi"
 	"github.com/docker/docker/libnetwork/netlabel"
 	"github.com/docker/docker/libnetwork/netlabel"
@@ -85,7 +86,8 @@ type sandboxTable map[string]*Sandbox
 // Controller manages networks.
 // Controller manages networks.
 type Controller struct {
 type Controller struct {
 	id               string
 	id               string
-	drvRegistry      *drvregistry.DrvRegistry
+	drvRegistry      drvregistry.Networks
+	ipamRegistry     drvregistry.IPAMs
 	sandboxes        sandboxTable
 	sandboxes        sandboxTable
 	cfg              *config.Config
 	cfg              *config.Config
 	store            datastore.DataStore
 	store            datastore.DataStore
@@ -108,7 +110,7 @@ type Controller struct {
 }
 }
 
 
 type initializer struct {
 type initializer struct {
-	fn    drvregistry.InitFunc
+	fn    func(driverapi.Registerer, map[string]interface{}) error
 	ntype string
 	ntype string
 }
 }
 
 
@@ -130,31 +132,24 @@ func New(cfgOptions ...config.Option) (*Controller, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	drvRegistry, err := drvregistry.New(nil, nil, c.RegisterDriver, nil, c.cfg.PluginGetter)
-	if err != nil {
+	c.drvRegistry.Notify = c.RegisterDriver
+
+	// External plugins don't need config passed through daemon. They can
+	// bootstrap themselves.
+	if err := remotedriver.Register(&c.drvRegistry, c.cfg.PluginGetter); err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
 	for _, i := range getInitializers() {
 	for _, i := range getInitializers() {
-		var dcfg map[string]interface{}
-
-		// External plugins don't need config passed through daemon. They can
-		// bootstrap themselves
-		if i.ntype != "remote" {
-			dcfg = c.makeDriverConfig(i.ntype)
-		}
-
-		if err := drvRegistry.AddDriver(i.ntype, i.fn, dcfg); err != nil {
+		if err := i.fn(&c.drvRegistry, c.makeDriverConfig(i.ntype)); err != nil {
 			return nil, err
 			return nil, err
 		}
 		}
 	}
 	}
 
 
-	if err = initIPAMDrivers(drvRegistry, c.cfg.PluginGetter, c.cfg.DefaultAddressPool); err != nil {
+	if err := initIPAMDrivers(&c.ipamRegistry, c.cfg.PluginGetter, c.cfg.DefaultAddressPool); err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	c.drvRegistry = drvRegistry
-
 	c.WalkNetworks(populateSpecial)
 	c.WalkNetworks(populateSpecial)
 
 
 	// Reserve pools first before doing cleanup. Otherwise the
 	// Reserve pools first before doing cleanup. Otherwise the
@@ -387,7 +382,7 @@ func (c *Controller) BuiltinDrivers() []string {
 // BuiltinIPAMDrivers returns the list of builtin ipam drivers.
 // BuiltinIPAMDrivers returns the list of builtin ipam drivers.
 func (c *Controller) BuiltinIPAMDrivers() []string {
 func (c *Controller) BuiltinIPAMDrivers() []string {
 	drivers := []string{}
 	drivers := []string{}
-	c.drvRegistry.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool {
+	c.ipamRegistry.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool {
 		if driver.IsBuiltIn() {
 		if driver.IsBuiltIn() {
 			drivers = append(drivers, name)
 			drivers = append(drivers, name)
 		}
 		}
@@ -461,7 +456,7 @@ func (c *Controller) isDistributedControl() bool {
 }
 }
 
 
 func (c *Controller) GetPluginGetter() plugingetter.PluginGetter {
 func (c *Controller) GetPluginGetter() plugingetter.PluginGetter {
-	return c.drvRegistry.GetPluginGetter()
+	return c.cfg.PluginGetter
 }
 }
 
 
 func (c *Controller) RegisterDriver(networkType string, driver driverapi.Driver, capability driverapi.Capability) error {
 func (c *Controller) RegisterDriver(networkType string, driver driverapi.Driver, capability driverapi.Capability) error {
@@ -476,7 +471,7 @@ const overlayDSROptionString = "dsr"
 // are network specific and modeled in a generic way.
 // are network specific and modeled in a generic way.
 func (c *Controller) NewNetwork(networkType, name string, id string, options ...NetworkOption) (Network, error) {
 func (c *Controller) NewNetwork(networkType, name string, id string, options ...NetworkOption) (Network, error) {
 	var (
 	var (
-		caps           *driverapi.Capability
+		caps           driverapi.Capability
 		err            error
 		err            error
 		t              *network
 		t              *network
 		skipCfgEpCount bool
 		skipCfgEpCount bool
@@ -1101,7 +1096,7 @@ func (c *Controller) loadIPAMDriver(name string) error {
 }
 }
 
 
 func (c *Controller) getIPAMDriver(name string) (ipamapi.Ipam, *ipamapi.Capability, error) {
 func (c *Controller) getIPAMDriver(name string) (ipamapi.Ipam, *ipamapi.Capability, error) {
-	id, cap := c.drvRegistry.IPAM(name)
+	id, cap := c.ipamRegistry.IPAM(name)
 	if id == nil {
 	if id == nil {
 		// Might be a plugin name. Try loading it
 		// Might be a plugin name. Try loading it
 		if err := c.loadIPAMDriver(name); err != nil {
 		if err := c.loadIPAMDriver(name); err != nil {
@@ -1109,7 +1104,7 @@ func (c *Controller) getIPAMDriver(name string) (ipamapi.Ipam, *ipamapi.Capabili
 		}
 		}
 
 
 		// Now that we resolved the plugin, try again looking up the registry
 		// Now that we resolved the plugin, try again looking up the registry
-		id, cap = c.drvRegistry.IPAM(name)
+		id, cap = c.ipamRegistry.IPAM(name)
 		if id == nil {
 		if id == nil {
 			return nil, nil, types.BadRequestErrorf("invalid ipam driver: %q", name)
 			return nil, nil, types.BadRequestErrorf("invalid ipam driver: %q", name)
 		}
 		}

+ 3 - 3
libnetwork/drivers/bridge/bridge.go

@@ -166,8 +166,8 @@ func newDriver() *driver {
 	}
 	}
 }
 }
 
 
-// Init registers a new instance of bridge driver
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+// Register registers a new instance of bridge driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	d := newDriver()
 	d := newDriver()
 	if err := d.configure(config); err != nil {
 	if err := d.configure(config); err != nil {
 		return err
 		return err
@@ -177,7 +177,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 	}
 	}
-	return dc.RegisterDriver(networkType, d, c)
+	return r.RegisterDriver(networkType, d, c)
 }
 }
 
 
 // Validate performs a static validation on the network configuration parameters.
 // Validate performs a static validation on the network configuration parameters.

+ 9 - 2
libnetwork/drivers/bridge/brmanager/brmanager.go

@@ -11,13 +11,20 @@ const networkType = "bridge"
 
 
 type driver struct{}
 type driver struct{}
 
 
-// Init registers a new instance of bridge manager driver
+// Init registers a new instance of bridge manager driver.
+//
+// Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+	return Register(dc, config)
+}
+
+// Register registers a new instance of the bridge manager driver with r.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 	}
 	}
-	return dc.RegisterDriver(networkType, &driver{}, c)
+	return r.RegisterDriver(networkType, &driver{}, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 8 - 2
libnetwork/drivers/host/host.go

@@ -16,13 +16,19 @@ type driver struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init registers a new instance of host driver
+// Init registers a new instance of host driver.
+//
+// Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+	return Register(dc, config)
+}
+
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 	}
 	}
-	return dc.RegisterDriver(networkType, &driver{}, c)
+	return r.RegisterDriver(networkType, &driver{}, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 3 - 3
libnetwork/drivers/ipvlan/ipvlan.go

@@ -62,8 +62,8 @@ type network struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init initializes and registers the libnetwork ipvlan driver
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+// Register initializes and registers the libnetwork ipvlan driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
@@ -75,7 +75,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 		return err
 		return err
 	}
 	}
 
 
-	return dc.RegisterDriver(driverName, d, c)
+	return r.RegisterDriver(driverName, d, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 4 - 9
libnetwork/drivers/ipvlan/ipvlan_test.go

@@ -7,7 +7,6 @@ import (
 	"testing"
 	"testing"
 
 
 	"github.com/docker/docker/libnetwork/driverapi"
 	"github.com/docker/docker/libnetwork/driverapi"
-	"github.com/docker/docker/pkg/plugingetter"
 )
 )
 
 
 const testNetworkType = "ipvlan"
 const testNetworkType = "ipvlan"
@@ -17,10 +16,6 @@ type driverTester struct {
 	d *driver
 	d *driver
 }
 }
 
 
-func (dt *driverTester) GetPluginGetter() plugingetter.PluginGetter {
-	return nil
-}
-
 func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 	cap driverapi.Capability) error {
 	cap driverapi.Capability) error {
 	if name != testNetworkType {
 	if name != testNetworkType {
@@ -37,15 +32,15 @@ func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 	return nil
 	return nil
 }
 }
 
 
-func TestIpvlanInit(t *testing.T) {
-	if err := Init(&driverTester{t: t}, nil); err != nil {
+func TestIpvlanRegister(t *testing.T) {
+	if err := Register(&driverTester{t: t}, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 }
 }
 
 
 func TestIpvlanNilConfig(t *testing.T) {
 func TestIpvlanNilConfig(t *testing.T) {
 	dt := &driverTester{t: t}
 	dt := &driverTester{t: t}
-	if err := Init(dt, nil); err != nil {
+	if err := Register(dt, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -56,7 +51,7 @@ func TestIpvlanNilConfig(t *testing.T) {
 
 
 func TestIpvlanType(t *testing.T) {
 func TestIpvlanType(t *testing.T) {
 	dt := &driverTester{t: t}
 	dt := &driverTester{t: t}
-	if err := Init(dt, nil); err != nil {
+	if err := Register(dt, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 

+ 9 - 2
libnetwork/drivers/ipvlan/ivmanager/ivmanager.go

@@ -11,13 +11,20 @@ const networkType = "ipvlan"
 
 
 type driver struct{}
 type driver struct{}
 
 
-// Init registers a new instance of ipvlan manager driver
+// Init registers a new instance of the ipvlan manager driver.
+//
+// Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+	return Register(dc, config)
+}
+
+// Register registers a new instance of the ipvlan manager driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 	}
 	}
-	return dc.RegisterDriver(networkType, &driver{}, c)
+	return r.RegisterDriver(networkType, &driver{}, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 3 - 3
libnetwork/drivers/macvlan/macvlan.go

@@ -56,8 +56,8 @@ type network struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init initializes and registers the libnetwork macvlan driver
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+// Register initializes and registers the libnetwork macvlan driver
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
@@ -69,7 +69,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 		return err
 		return err
 	}
 	}
 
 
-	return dc.RegisterDriver(driverName, d, c)
+	return r.RegisterDriver(driverName, d, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 4 - 9
libnetwork/drivers/macvlan/macvlan_test.go

@@ -7,7 +7,6 @@ import (
 	"testing"
 	"testing"
 
 
 	"github.com/docker/docker/libnetwork/driverapi"
 	"github.com/docker/docker/libnetwork/driverapi"
-	"github.com/docker/docker/pkg/plugingetter"
 )
 )
 
 
 const testNetworkType = "macvlan"
 const testNetworkType = "macvlan"
@@ -17,10 +16,6 @@ type driverTester struct {
 	d *driver
 	d *driver
 }
 }
 
 
-func (dt *driverTester) GetPluginGetter() plugingetter.PluginGetter {
-	return nil
-}
-
 func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 	cap driverapi.Capability) error {
 	cap driverapi.Capability) error {
 	if name != testNetworkType {
 	if name != testNetworkType {
@@ -37,15 +32,15 @@ func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 	return nil
 	return nil
 }
 }
 
 
-func TestMacvlanInit(t *testing.T) {
-	if err := Init(&driverTester{t: t}, nil); err != nil {
+func TestMacvlanRegister(t *testing.T) {
+	if err := Register(&driverTester{t: t}, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 }
 }
 
 
 func TestMacvlanNilConfig(t *testing.T) {
 func TestMacvlanNilConfig(t *testing.T) {
 	dt := &driverTester{t: t}
 	dt := &driverTester{t: t}
-	if err := Init(dt, nil); err != nil {
+	if err := Register(dt, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -56,7 +51,7 @@ func TestMacvlanNilConfig(t *testing.T) {
 
 
 func TestMacvlanType(t *testing.T) {
 func TestMacvlanType(t *testing.T) {
 	dt := &driverTester{t: t}
 	dt := &driverTester{t: t}
-	if err := Init(dt, nil); err != nil {
+	if err := Register(dt, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 

+ 9 - 2
libnetwork/drivers/macvlan/mvmanager/mvmanager.go

@@ -11,13 +11,20 @@ const networkType = "macvlan"
 
 
 type driver struct{}
 type driver struct{}
 
 
-// Init registers a new instance of macvlan manager driver
+// Init registers a new instance of the macvlan manager driver.
+//
+// Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+	return Register(dc, config)
+}
+
+// Register registers a new instance of the macvlan manager driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 	}
 	}
-	return dc.RegisterDriver(networkType, &driver{}, c)
+	return r.RegisterDriver(networkType, &driver{}, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 3 - 3
libnetwork/drivers/null/null.go

@@ -16,12 +16,12 @@ type driver struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init registers a new instance of null driver
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+// Register registers a new instance of the null driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope: datastore.LocalScope,
 		DataScope: datastore.LocalScope,
 	}
 	}
-	return dc.RegisterDriver(networkType, &driver{}, c)
+	return r.RegisterDriver(networkType, &driver{}, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 3 - 3
libnetwork/drivers/overlay/overlay.go

@@ -58,8 +58,8 @@ type driver struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init registers a new instance of overlay driver
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+// Register registers a new instance of the overlay driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.GlobalScope,
 		DataScope:         datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
@@ -107,7 +107,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 		logrus.Warnf("Failure during overlay endpoints restore: %v", err)
 		logrus.Warnf("Failure during overlay endpoints restore: %v", err)
 	}
 	}
 
 
-	return dc.RegisterDriver(networkType, d, c)
+	return r.RegisterDriver(networkType, d, c)
 }
 }
 
 
 // Endpoints are stored in the local store. Restore them and reconstruct the overlay sandbox
 // Endpoints are stored in the local store. Restore them and reconstruct the overlay sandbox

+ 4 - 4
libnetwork/drivers/overlay/overlay_test.go

@@ -59,7 +59,7 @@ func setupDriver(t *testing.T) *driverTester {
 		},
 		},
 	}
 	}
 
 
-	if err := Init(dt, config); err != nil {
+	if err := Register(dt, config); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -114,14 +114,14 @@ func (dt *driverTester) RegisterDriver(name string, drv driverapi.Driver,
 }
 }
 
 
 func TestOverlayInit(t *testing.T) {
 func TestOverlayInit(t *testing.T) {
-	if err := Init(&driverTester{t: t}, nil); err != nil {
+	if err := Register(&driverTester{t: t}, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 }
 }
 
 
 func TestOverlayFiniWithoutConfig(t *testing.T) {
 func TestOverlayFiniWithoutConfig(t *testing.T) {
 	dt := &driverTester{t: t}
 	dt := &driverTester{t: t}
-	if err := Init(dt, nil); err != nil {
+	if err := Register(dt, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -151,7 +151,7 @@ func TestOverlayConfig(t *testing.T) {
 
 
 func TestOverlayType(t *testing.T) {
 func TestOverlayType(t *testing.T) {
 	dt := &driverTester{t: t}
 	dt := &driverTester{t: t}
-	if err := Init(dt, nil); err != nil {
+	if err := Register(dt, nil); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 

+ 9 - 2
libnetwork/drivers/overlay/ovmanager/ovmanager.go

@@ -44,8 +44,15 @@ type network struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init registers a new instance of overlay driver
+// Init registers a new instance of the overlay driver.
+//
+// Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+	return Register(dc, config)
+}
+
+// Register registers a new instance of the overlay driver.
+func Register(r driverapi.DriverCallback, config map[string]interface{}) error {
 	var err error
 	var err error
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.GlobalScope,
 		DataScope:         datastore.GlobalScope,
@@ -62,7 +69,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 		return fmt.Errorf("failed to initialize vxlan id manager: %v", err)
 		return fmt.Errorf("failed to initialize vxlan id manager: %v", err)
 	}
 	}
 
 
-	return dc.RegisterDriver(networkType, d, c)
+	return r.RegisterDriver(networkType, d, c)
 }
 }
 
 
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
 func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {

+ 10 - 2
libnetwork/drivers/remote/driver.go

@@ -30,7 +30,15 @@ func newDriver(name string, client *plugins.Client) driverapi.Driver {
 
 
 // Init makes sure a remote driver is registered when a network driver
 // Init makes sure a remote driver is registered when a network driver
 // plugin is activated.
 // plugin is activated.
+//
+// Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+	return Register(dc, dc.GetPluginGetter())
+}
+
+// Register makes sure a remote driver is registered with r when a network
+// driver plugin is activated.
+func Register(r driverapi.Registerer, pg plugingetter.PluginGetter) error {
 	newPluginHandler := func(name string, client *plugins.Client) {
 	newPluginHandler := func(name string, client *plugins.Client) {
 		// negotiate driver capability with client
 		// negotiate driver capability with client
 		d := newDriver(name, client)
 		d := newDriver(name, client)
@@ -39,14 +47,14 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 			logrus.Errorf("error getting capability for %s due to %v", name, err)
 			logrus.Errorf("error getting capability for %s due to %v", name, err)
 			return
 			return
 		}
 		}
-		if err = dc.RegisterDriver(name, d, *c); err != nil {
+		if err = r.RegisterDriver(name, d, *c); err != nil {
 			logrus.Errorf("error registering driver for %s due to %v", name, err)
 			logrus.Errorf("error registering driver for %s due to %v", name, err)
 		}
 		}
 	}
 	}
 
 
 	// Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins.
 	// Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins.
 	handleFunc := plugins.Handle
 	handleFunc := plugins.Handle
-	if pg := dc.GetPluginGetter(); pg != nil {
+	if pg != nil {
 		handleFunc = pg.Handle
 		handleFunc = pg.Handle
 		activePlugins := pg.GetAllManagedPluginsByCap(driverapi.NetworkPluginEndpointType)
 		activePlugins := pg.GetAllManagedPluginsByCap(driverapi.NetworkPluginEndpointType)
 		for _, ap := range activePlugins {
 		for _, ap := range activePlugins {

+ 3 - 3
libnetwork/drivers/windows/overlay/overlay_windows.go

@@ -30,8 +30,8 @@ type driver struct {
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
-// Init registers a new instance of overlay driver
-func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
+// Register registers a new instance of the overlay driver.
+func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	c := driverapi.Capability{
 	c := driverapi.Capability{
 		DataScope:         datastore.GlobalScope,
 		DataScope:         datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
@@ -68,7 +68,7 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
 
 
 	d.restoreHNSNetworks()
 	d.restoreHNSNetworks()
 
 
-	return dc.RegisterDriver(networkType, d, c)
+	return r.RegisterDriver(networkType, d, c)
 }
 }
 
 
 func (d *driver) restoreHNSNetworks() error {
 func (d *driver) restoreHNSNetworks() error {

+ 2 - 2
libnetwork/drivers/windows/windows.go

@@ -127,8 +127,8 @@ func newDriver(networkType string) *driver {
 }
 }
 
 
 // GetInit returns an initializer for the given network type
 // GetInit returns an initializer for the given network type
-func GetInit(networkType string) func(dc driverapi.DriverCallback, config map[string]interface{}) error {
-	return func(dc driverapi.DriverCallback, config map[string]interface{}) error {
+func GetInit(networkType string) func(dc driverapi.Registerer, config map[string]interface{}) error {
+	return func(dc driverapi.Registerer, config map[string]interface{}) error {
 		if !IsBuiltinLocalDriver(networkType) {
 		if !IsBuiltinLocalDriver(networkType) {
 			return types.BadRequestErrorf("Network type not supported: %s", networkType)
 			return types.BadRequestErrorf("Network type not supported: %s", networkType)
 		}
 		}

+ 1 - 3
libnetwork/drivers_freebsd.go

@@ -2,12 +2,10 @@ package libnetwork
 
 
 import (
 import (
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"github.com/docker/docker/libnetwork/drivers/null"
-	"github.com/docker/docker/libnetwork/drivers/remote"
 )
 )
 
 
 func getInitializers() []initializer {
 func getInitializers() []initializer {
 	return []initializer{
 	return []initializer{
-		{null.Init, "null"},
-		{remote.Init, "remote"},
+		{null.Register, "null"},
 	}
 	}
 }
 }

+ 6 - 8
libnetwork/drivers_linux.go

@@ -7,18 +7,16 @@ import (
 	"github.com/docker/docker/libnetwork/drivers/macvlan"
 	"github.com/docker/docker/libnetwork/drivers/macvlan"
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"github.com/docker/docker/libnetwork/drivers/overlay"
 	"github.com/docker/docker/libnetwork/drivers/overlay"
-	"github.com/docker/docker/libnetwork/drivers/remote"
 )
 )
 
 
 func getInitializers() []initializer {
 func getInitializers() []initializer {
 	in := []initializer{
 	in := []initializer{
-		{bridge.Init, "bridge"},
-		{host.Init, "host"},
-		{ipvlan.Init, "ipvlan"},
-		{macvlan.Init, "macvlan"},
-		{null.Init, "null"},
-		{overlay.Init, "overlay"},
-		{remote.Init, "remote"},
+		{bridge.Register, "bridge"},
+		{host.Register, "host"},
+		{ipvlan.Register, "ipvlan"},
+		{macvlan.Register, "macvlan"},
+		{null.Register, "null"},
+		{overlay.Register, "overlay"},
 	}
 	}
 	return in
 	return in
 }
 }

+ 2 - 4
libnetwork/drivers_windows.go

@@ -2,16 +2,14 @@ package libnetwork
 
 
 import (
 import (
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"github.com/docker/docker/libnetwork/drivers/null"
-	"github.com/docker/docker/libnetwork/drivers/remote"
 	"github.com/docker/docker/libnetwork/drivers/windows"
 	"github.com/docker/docker/libnetwork/drivers/windows"
 	"github.com/docker/docker/libnetwork/drivers/windows/overlay"
 	"github.com/docker/docker/libnetwork/drivers/windows/overlay"
 )
 )
 
 
 func getInitializers() []initializer {
 func getInitializers() []initializer {
 	return []initializer{
 	return []initializer{
-		{null.Init, "null"},
-		{overlay.Init, "overlay"},
-		{remote.Init, "remote"},
+		{null.Register, "null"},
+		{overlay.Register, "overlay"},
 		{windows.GetInit("transparent"), "transparent"},
 		{windows.GetInit("transparent"), "transparent"},
 		{windows.GetInit("l2bridge"), "l2bridge"},
 		{windows.GetInit("l2bridge"), "l2bridge"},
 		{windows.GetInit("l2tunnel"), "l2tunnel"},
 		{windows.GetInit("l2tunnel"), "l2tunnel"},

+ 2 - 2
libnetwork/libnetwork_internal_test.go

@@ -576,7 +576,7 @@ func TestIpamReleaseOnNetDriverFailures(t *testing.T) {
 	}
 	}
 	defer c.Stop()
 	defer c.Stop()
 
 
-	if err := c.drvRegistry.AddDriver(badDriverName, badDriverInit, nil); err != nil {
+	if err := badDriverRegister(&c.drvRegistry); err != nil {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
@@ -643,7 +643,7 @@ type badDriver struct {
 
 
 var bd = badDriver{failNetworkCreation: true}
 var bd = badDriver{failNetworkCreation: true}
 
 
-func badDriverInit(reg driverapi.DriverCallback, opt map[string]interface{}) error {
+func badDriverRegister(reg driverapi.Registerer) error {
 	return reg.RegisterDriver(badDriverName, &bd, driverapi.Capability{DataScope: datastore.LocalScope})
 	return reg.RegisterDriver(badDriverName, &bd, driverapi.Capability{DataScope: datastore.LocalScope})
 }
 }
 
 

+ 10 - 6
libnetwork/network.go

@@ -916,7 +916,7 @@ func NetworkDeleteOptionRemoveLB(p *networkDeleteParams) {
 	p.rmLBEndpoint = true
 	p.rmLBEndpoint = true
 }
 }
 
 
-func (n *network) resolveDriver(name string, load bool) (driverapi.Driver, *driverapi.Capability, error) {
+func (n *network) resolveDriver(name string, load bool) (driverapi.Driver, driverapi.Capability, error) {
 	c := n.getController()
 	c := n.getController()
 
 
 	// Check if a driver for the specified network type is available
 	// 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
 		if load {
 		if load {
 			err := c.loadDriver(name)
 			err := c.loadDriver(name)
 			if err != nil {
 			if err != nil {
-				return nil, nil, err
+				return nil, driverapi.Capability{}, err
 			}
 			}
 
 
 			d, cap = c.drvRegistry.Driver(name)
 			d, cap = c.drvRegistry.Driver(name)
 			if d == nil {
 			if d == nil {
-				return nil, nil, fmt.Errorf("could not resolve driver %s in registry", name)
+				return nil, driverapi.Capability{}, fmt.Errorf("could not resolve driver %s in registry", name)
 			}
 			}
 		} else {
 		} else {
 			// don't fail if driver loading is not required
 			// don't fail if driver loading is not required
-			return nil, nil, nil
+			return nil, driverapi.Capability{}, nil
 		}
 		}
 	}
 	}
 
 
@@ -957,7 +957,7 @@ func (n *network) driver(load bool) (driverapi.Driver, error) {
 
 
 	n.mu.Lock()
 	n.mu.Lock()
 	// If load is not required, driver, cap and err may all be nil
 	// If load is not required, driver, cap and err may all be nil
-	if n.scope == "" && cap != nil {
+	if n.scope == "" {
 		n.scope = cap.DataScope
 		n.scope = cap.DataScope
 	}
 	}
 	if n.dynamic {
 	if n.dynamic {
@@ -1772,7 +1772,11 @@ func (n *network) getIPData(ipVer int) []driverapi.IPAMData {
 }
 }
 
 
 func (n *network) deriveAddressSpace() (string, error) {
 func (n *network) deriveAddressSpace() (string, error) {
-	local, global, err := n.getController().drvRegistry.IPAMDefaultAddressSpaces(n.ipamType)
+	ipam, _ := n.getController().ipamRegistry.IPAM(n.ipamType)
+	if ipam == nil {
+		return "", types.NotFoundErrorf("failed to get default address space: unknown ipam type %q", n.ipamType)
+	}
+	local, global, err := ipam.GetDefaultAddressSpaces()
 	if err != nil {
 	if err != nil {
 		return "", types.NotFoundErrorf("failed to get default address space: %v", err)
 		return "", types.NotFoundErrorf("failed to get default address space: %v", err)
 	}
 	}