Browse Source

Merge pull request #45881 from corhere/libn/register-configless-drivers

libnetwork: stop passing config to drivers which ignore the config argument
Bjorn Neergaard 2 years ago
parent
commit
98d3da79ef

+ 2 - 9
libnetwork/controller.go

@@ -110,11 +110,6 @@ type Controller struct {
 	mu               sync.Mutex
 	mu               sync.Mutex
 }
 }
 
 
-type initializer struct {
-	fn    func(driverapi.Registerer, map[string]interface{}) error
-	ntype string
-}
-
 // New creates a new instance of network controller.
 // New creates a new instance of network controller.
 func New(cfgOptions ...config.Option) (*Controller, error) {
 func New(cfgOptions ...config.Option) (*Controller, error) {
 	c := &Controller{
 	c := &Controller{
@@ -141,10 +136,8 @@ func New(cfgOptions ...config.Option) (*Controller, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	for _, i := range getInitializers() {
-		if err := i.fn(&c.drvRegistry, c.makeDriverConfig(i.ntype)); err != nil {
-			return nil, err
-		}
+	if err := registerNetworkDrivers(&c.drvRegistry, c.makeDriverConfig); err != nil {
+		return nil, err
 	}
 	}
 
 
 	if err := initIPAMDrivers(&c.ipamRegistry, c.cfg.PluginGetter, c.cfg.DefaultAddressPool); err != nil {
 	if err := initIPAMDrivers(&c.ipamRegistry, c.cfg.PluginGetter, c.cfg.DefaultAddressPool); err != nil {

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

@@ -28,7 +28,7 @@ import (
 )
 )
 
 
 const (
 const (
-	networkType                = "bridge"
+	NetworkType                = "bridge"
 	vethPrefix                 = "veth"
 	vethPrefix                 = "veth"
 	vethLen                    = len(vethPrefix) + 7
 	vethLen                    = len(vethPrefix) + 7
 	defaultContainerVethPrefix = "eth"
 	defaultContainerVethPrefix = "eth"
@@ -174,7 +174,7 @@ func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	if err := d.configure(config); err != nil {
 	if err := d.configure(config); err != nil {
 		return err
 		return err
 	}
 	}
-	return r.RegisterDriver(networkType, d, driverapi.Capability{
+	return r.RegisterDriver(NetworkType, d, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 	})
 	})
@@ -1433,7 +1433,7 @@ func (d *driver) link(network *bridgeNetwork, endpoint *bridgeEndpoint, enable b
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return networkType
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

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

@@ -15,11 +15,11 @@ type driver struct{}
 //
 //
 // Deprecated: use [Register].
 // Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
-	return Register(dc, nil)
+	return Register(dc)
 }
 }
 
 
 // Register registers a new instance of the bridge manager driver with r.
 // Register registers a new instance of the bridge manager driver with r.
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
+func Register(r driverapi.Registerer) error {
 	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
 	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,

+ 7 - 7
libnetwork/drivers/host/host.go

@@ -9,7 +9,7 @@ import (
 	"github.com/docker/docker/libnetwork/types"
 	"github.com/docker/docker/libnetwork/types"
 )
 )
 
 
-const networkType = "host"
+const NetworkType = "host"
 
 
 type driver struct {
 type driver struct {
 	network string
 	network string
@@ -20,11 +20,11 @@ type driver struct {
 //
 //
 // Deprecated: use [Register].
 // Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
-	return Register(dc, nil)
+	return Register(dc)
 }
 }
 
 
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
-	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
+func Register(r driverapi.Registerer) error {
+	return r.RegisterDriver(NetworkType, &driver{}, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 		ConnectivityScope: datastore.LocalScope,
 	})
 	})
@@ -50,7 +50,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
 	defer d.Unlock()
 	defer d.Unlock()
 
 
 	if d.network != "" {
 	if d.network != "" {
-		return types.ForbiddenErrorf("only one instance of \"%s\" network is allowed", networkType)
+		return types.ForbiddenErrorf("only one instance of \"%s\" network is allowed", NetworkType)
 	}
 	}
 
 
 	d.network = id
 	d.network = id
@@ -59,7 +59,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
 }
 }
 
 
 func (d *driver) DeleteNetwork(nid string) error {
 func (d *driver) DeleteNetwork(nid string) error {
-	return types.ForbiddenErrorf("network of type \"%s\" cannot be deleted", networkType)
+	return types.ForbiddenErrorf("network of type \"%s\" cannot be deleted", NetworkType)
 }
 }
 
 
 func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error {
 func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error {
@@ -93,7 +93,7 @@ func (d *driver) RevokeExternalConnectivity(nid, eid string) error {
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return networkType
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

+ 1 - 1
libnetwork/drivers/host/host_test.go

@@ -9,7 +9,7 @@ import (
 func TestDriver(t *testing.T) {
 func TestDriver(t *testing.T) {
 	d := &driver{}
 	d := &driver{}
 
 
-	if d.Type() != networkType {
+	if d.Type() != NetworkType {
 		t.Fatal("Unexpected network type returned by driver")
 		t.Fatal("Unexpected network type returned by driver")
 	}
 	}
 
 

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

@@ -18,7 +18,7 @@ const (
 	vethPrefix          = "veth"
 	vethPrefix          = "veth"
 	vethLen             = len(vethPrefix) + 7
 	vethLen             = len(vethPrefix) + 7
 
 
-	driverName    = "ipvlan"      // driver type name
+	NetworkType   = "ipvlan"      // driver type name
 	parentOpt     = "parent"      // parent interface -o parent
 	parentOpt     = "parent"      // parent interface -o parent
 	driverModeOpt = "ipvlan_mode" // mode -o ipvlan_mode
 	driverModeOpt = "ipvlan_mode" // mode -o ipvlan_mode
 	driverFlagOpt = "ipvlan_flag" // flag -o ipvlan_flag
 	driverFlagOpt = "ipvlan_flag" // flag -o ipvlan_flag
@@ -70,7 +70,7 @@ func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	if err := d.initStore(config); err != nil {
 	if err := d.initStore(config); err != nil {
 		return err
 		return err
 	}
 	}
-	return r.RegisterDriver(driverName, d, driverapi.Capability{
+	return r.RegisterDriver(NetworkType, d, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 	})
 	})
@@ -89,7 +89,7 @@ func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, erro
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return driverName
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

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

@@ -15,11 +15,11 @@ type driver struct{}
 //
 //
 // Deprecated: use [Register].
 // Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
-	return Register(dc, nil)
+	return Register(dc)
 }
 }
 
 
 // Register registers a new instance of the ipvlan manager driver.
 // Register registers a new instance of the ipvlan manager driver.
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
+func Register(r driverapi.Registerer) error {
 	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
 	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,

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

@@ -17,7 +17,7 @@ const (
 	containerVethPrefix = "eth"
 	containerVethPrefix = "eth"
 	vethPrefix          = "veth"
 	vethPrefix          = "veth"
 	vethLen             = len(vethPrefix) + 7
 	vethLen             = len(vethPrefix) + 7
-	driverName          = "macvlan"      // driver type name
+	NetworkType         = "macvlan"      // driver type name
 	modePrivate         = "private"      // macvlan mode private
 	modePrivate         = "private"      // macvlan mode private
 	modeVepa            = "vepa"         // macvlan mode vepa
 	modeVepa            = "vepa"         // macvlan mode vepa
 	modeBridge          = "bridge"       // macvlan mode bridge
 	modeBridge          = "bridge"       // macvlan mode bridge
@@ -64,7 +64,7 @@ func Register(r driverapi.Registerer, config map[string]interface{}) error {
 	if err := d.initStore(config); err != nil {
 	if err := d.initStore(config); err != nil {
 		return err
 		return err
 	}
 	}
-	return r.RegisterDriver(driverName, d, driverapi.Capability{
+	return r.RegisterDriver(NetworkType, d, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 	})
 	})
@@ -83,7 +83,7 @@ func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, erro
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return driverName
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

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

@@ -15,11 +15,11 @@ type driver struct{}
 //
 //
 // Deprecated: use [Register].
 // Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
-	return Register(dc, nil)
+	return Register(dc)
 }
 }
 
 
 // Register registers a new instance of the macvlan manager driver.
 // Register registers a new instance of the macvlan manager driver.
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
+func Register(r driverapi.Registerer) error {
 	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
 	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
 		DataScope:         datastore.LocalScope,
 		DataScope:         datastore.LocalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,

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

@@ -9,7 +9,7 @@ import (
 	"github.com/docker/docker/libnetwork/types"
 	"github.com/docker/docker/libnetwork/types"
 )
 )
 
 
-const networkType = "null"
+const NetworkType = "null"
 
 
 type driver struct {
 type driver struct {
 	network string
 	network string
@@ -17,8 +17,8 @@ type driver struct {
 }
 }
 
 
 // Register registers a new instance of the null driver.
 // Register registers a new instance of the null driver.
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
-	return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{
+func Register(r driverapi.Registerer) error {
+	return r.RegisterDriver(NetworkType, &driver{}, driverapi.Capability{
 		DataScope: datastore.LocalScope,
 		DataScope: datastore.LocalScope,
 	})
 	})
 }
 }
@@ -43,7 +43,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
 	defer d.Unlock()
 	defer d.Unlock()
 
 
 	if d.network != "" {
 	if d.network != "" {
-		return types.ForbiddenErrorf("only one instance of \"%s\" network is allowed", networkType)
+		return types.ForbiddenErrorf("only one instance of \"%s\" network is allowed", NetworkType)
 	}
 	}
 
 
 	d.network = id
 	d.network = id
@@ -52,7 +52,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
 }
 }
 
 
 func (d *driver) DeleteNetwork(nid string) error {
 func (d *driver) DeleteNetwork(nid string) error {
-	return types.ForbiddenErrorf("network of type \"%s\" cannot be deleted", networkType)
+	return types.ForbiddenErrorf("network of type \"%s\" cannot be deleted", NetworkType)
 }
 }
 
 
 func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error {
 func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error {
@@ -86,7 +86,7 @@ func (d *driver) RevokeExternalConnectivity(nid, eid string) error {
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return networkType
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

+ 1 - 1
libnetwork/drivers/null/null_test.go

@@ -9,7 +9,7 @@ import (
 func TestDriver(t *testing.T) {
 func TestDriver(t *testing.T) {
 	d := &driver{}
 	d := &driver{}
 
 
-	if d.Type() != networkType {
+	if d.Type() != NetworkType {
 		t.Fatalf("Unexpected network type returned by driver")
 		t.Fatalf("Unexpected network type returned by driver")
 	}
 	}
 
 

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

@@ -16,7 +16,7 @@ import (
 )
 )
 
 
 const (
 const (
-	networkType  = "overlay"
+	NetworkType  = "overlay"
 	vethPrefix   = "veth"
 	vethPrefix   = "veth"
 	vethLen      = len(vethPrefix) + 7
 	vethLen      = len(vethPrefix) + 7
 	vxlanEncap   = 50
 	vxlanEncap   = 50
@@ -47,7 +47,7 @@ func Register(r driverapi.Registerer, config map[string]interface{}) error {
 		secMap: &encrMap{nodes: map[string][]*spi{}},
 		secMap: &encrMap{nodes: map[string][]*spi{}},
 		config: config,
 		config: config,
 	}
 	}
-	return r.RegisterDriver(networkType, d, driverapi.Capability{
+	return r.RegisterDriver(NetworkType, d, driverapi.Capability{
 		DataScope:         datastore.GlobalScope,
 		DataScope:         datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 	})
 	})
@@ -61,7 +61,7 @@ func (d *driver) configure() error {
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return networkType
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

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

@@ -50,11 +50,11 @@ type network struct {
 //
 //
 // Deprecated: use [Register].
 // Deprecated: use [Register].
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
 func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error {
-	return Register(dc, nil)
+	return Register(dc)
 }
 }
 
 
 // Register registers a new instance of the overlay driver.
 // Register registers a new instance of the overlay driver.
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
+func Register(r driverapi.Registerer) error {
 	return r.RegisterDriver(networkType, newDriver(), driverapi.Capability{
 	return r.RegisterDriver(networkType, newDriver(), driverapi.Capability{
 		DataScope:         datastore.GlobalScope,
 		DataScope:         datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,

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

@@ -17,7 +17,7 @@ import (
 )
 )
 
 
 const (
 const (
-	networkType = "overlay"
+	NetworkType = "overlay"
 )
 )
 
 
 type driver struct {
 type driver struct {
@@ -26,14 +26,14 @@ type driver struct {
 }
 }
 
 
 // Register registers a new instance of the overlay driver.
 // Register registers a new instance of the overlay driver.
-func Register(r driverapi.Registerer, _ map[string]interface{}) error {
+func Register(r driverapi.Registerer) error {
 	d := &driver{
 	d := &driver{
 		networks: networkTable{},
 		networks: networkTable{},
 	}
 	}
 
 
 	d.restoreHNSNetworks()
 	d.restoreHNSNetworks()
 
 
-	return r.RegisterDriver(networkType, d, driverapi.Capability{
+	return r.RegisterDriver(NetworkType, d, driverapi.Capability{
 		DataScope:         datastore.GlobalScope,
 		DataScope:         datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 		ConnectivityScope: datastore.GlobalScope,
 	})
 	})
@@ -48,7 +48,7 @@ func (d *driver) restoreHNSNetworks() error {
 	}
 	}
 
 
 	for _, v := range hnsresponse {
 	for _, v := range hnsresponse {
-		if v.Type != networkType {
+		if v.Type != NetworkType {
 			continue
 			continue
 		}
 		}
 
 
@@ -105,7 +105,7 @@ func (d *driver) convertToOverlayNetwork(v *hcsshim.HNSNetwork) *network {
 }
 }
 
 
 func (d *driver) Type() string {
 func (d *driver) Type() string {
-	return networkType
+	return NetworkType
 }
 }
 
 
 func (d *driver) IsBuiltIn() bool {
 func (d *driver) IsBuiltIn() bool {

+ 21 - 18
libnetwork/drivers/windows/windows.go

@@ -109,16 +109,20 @@ const (
 	errNotFound = "HNS failed with error : The object identifier does not represent a valid object. "
 	errNotFound = "HNS failed with error : The object identifier does not represent a valid object. "
 )
 )
 
 
+var builtinLocalDrivers = map[string]struct{}{
+	"transparent": {},
+	"l2bridge":    {},
+	"l2tunnel":    {},
+	"nat":         {},
+	"internal":    {},
+	"private":     {},
+	"ics":         {},
+}
+
 // IsBuiltinLocalDriver validates if network-type is a builtin local-scoped driver
 // IsBuiltinLocalDriver validates if network-type is a builtin local-scoped driver
 func IsBuiltinLocalDriver(networkType string) bool {
 func IsBuiltinLocalDriver(networkType string) bool {
-	if "l2bridge" == networkType || "l2tunnel" == networkType ||
-		"nat" == networkType || "ics" == networkType ||
-		"transparent" == networkType || "internal" == networkType ||
-		"private" == networkType {
-		return true
-	}
-
-	return false
+	_, ok := builtinLocalDrivers[networkType]
+	return ok
 }
 }
 
 
 // New constructs a new bridge driver
 // New constructs a new bridge driver
@@ -127,24 +131,23 @@ 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.Registerer, config map[string]interface{}) error {
-	return func(dc driverapi.Registerer, config map[string]interface{}) error {
-		if !IsBuiltinLocalDriver(networkType) {
-			return types.BadRequestErrorf("Network type not supported: %s", networkType)
-		}
-
+func RegisterBuiltinLocalDrivers(r driverapi.Registerer, driverConfig func(string) map[string]interface{}) error {
+	for networkType := range builtinLocalDrivers {
 		d := newDriver(networkType)
 		d := newDriver(networkType)
-
-		err := d.initStore(config)
+		err := d.initStore(driverConfig(networkType))
 		if err != nil {
 		if err != nil {
-			return err
+			return fmt.Errorf("failed to initialize %q driver: %w", networkType, err)
 		}
 		}
 
 
-		return dc.RegisterDriver(networkType, d, driverapi.Capability{
+		err = r.RegisterDriver(networkType, d, driverapi.Capability{
 			DataScope:         datastore.LocalScope,
 			DataScope:         datastore.LocalScope,
 			ConnectivityScope: datastore.LocalScope,
 			ConnectivityScope: datastore.LocalScope,
 		})
 		})
+		if err != nil {
+			return fmt.Errorf("failed to register %q driver: %w", networkType, err)
+		}
 	}
 	}
+	return nil
 }
 }
 
 
 func (d *driver) getNetwork(id string) (*hnsNetwork, error) {
 func (d *driver) getNetwork(id string) (*hnsNetwork, error) {

+ 2 - 4
libnetwork/drivers_freebsd.go

@@ -4,8 +4,6 @@ import (
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"github.com/docker/docker/libnetwork/drivers/null"
 )
 )
 
 
-func getInitializers() []initializer {
-	return []initializer{
-		{null.Register, "null"},
-	}
+func registerNetworkDrivers(r driverapi.Registerer, driverConfig func(string) map[string]interface{}) error {
+	return null.Register(r)
 }
 }

+ 24 - 9
libnetwork/drivers_linux.go

@@ -1,6 +1,9 @@
 package libnetwork
 package libnetwork
 
 
 import (
 import (
+	"fmt"
+
+	"github.com/docker/docker/libnetwork/driverapi"
 	"github.com/docker/docker/libnetwork/drivers/bridge"
 	"github.com/docker/docker/libnetwork/drivers/bridge"
 	"github.com/docker/docker/libnetwork/drivers/host"
 	"github.com/docker/docker/libnetwork/drivers/host"
 	"github.com/docker/docker/libnetwork/drivers/ipvlan"
 	"github.com/docker/docker/libnetwork/drivers/ipvlan"
@@ -9,14 +12,26 @@ import (
 	"github.com/docker/docker/libnetwork/drivers/overlay"
 	"github.com/docker/docker/libnetwork/drivers/overlay"
 )
 )
 
 
-func getInitializers() []initializer {
-	in := []initializer{
-		{bridge.Register, "bridge"},
-		{host.Register, "host"},
-		{ipvlan.Register, "ipvlan"},
-		{macvlan.Register, "macvlan"},
-		{null.Register, "null"},
-		{overlay.Register, "overlay"},
+func registerNetworkDrivers(r driverapi.Registerer, driverConfig func(string) map[string]interface{}) error {
+	noConfig := func(fn func(driverapi.Registerer) error) func(driverapi.Registerer, map[string]interface{}) error {
+		return func(r driverapi.Registerer, _ map[string]interface{}) error { return fn(r) }
+	}
+
+	for _, nr := range []struct {
+		ntype    string
+		register func(driverapi.Registerer, map[string]interface{}) error
+	}{
+		{ntype: bridge.NetworkType, register: bridge.Register},
+		{ntype: host.NetworkType, register: noConfig(host.Register)},
+		{ntype: ipvlan.NetworkType, register: ipvlan.Register},
+		{ntype: macvlan.NetworkType, register: macvlan.Register},
+		{ntype: null.NetworkType, register: noConfig(null.Register)},
+		{ntype: overlay.NetworkType, register: overlay.Register},
+	} {
+		if err := nr.register(r, driverConfig(nr.ntype)); err != nil {
+			return fmt.Errorf("failed to register %q driver: %w", nr.ntype, err)
+		}
 	}
 	}
-	return in
+
+	return nil
 }
 }

+ 1 - 1
libnetwork/drivers_unsupported.go

@@ -2,6 +2,6 @@
 
 
 package libnetwork
 package libnetwork
 
 
-func getInitializers() []initializer {
+func registerNetworkDrivers(r driverapi.Registerer, driverConfig func(string) map[string]interface{}) error {
 	return nil
 	return nil
 }
 }

+ 16 - 11
libnetwork/drivers_windows.go

@@ -1,21 +1,26 @@
 package libnetwork
 package libnetwork
 
 
 import (
 import (
+	"fmt"
+
+	"github.com/docker/docker/libnetwork/driverapi"
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"github.com/docker/docker/libnetwork/drivers/null"
 	"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 {
-	return []initializer{
-		{null.Register, "null"},
-		{overlay.Register, "overlay"},
-		{windows.GetInit("transparent"), "transparent"},
-		{windows.GetInit("l2bridge"), "l2bridge"},
-		{windows.GetInit("l2tunnel"), "l2tunnel"},
-		{windows.GetInit("nat"), "nat"},
-		{windows.GetInit("internal"), "internal"},
-		{windows.GetInit("private"), "private"},
-		{windows.GetInit("ics"), "ics"},
+func registerNetworkDrivers(r driverapi.Registerer, driverConfig func(string) map[string]interface{}) error {
+	for _, nr := range []struct {
+		ntype    string
+		register func(driverapi.Registerer) error
+	}{
+		{ntype: null.NetworkType, register: null.Register},
+		{ntype: overlay.NetworkType, register: overlay.Register},
+	} {
+		if err := nr.register(r); err != nil {
+			return fmt.Errorf("failed to register %q driver: %w", nr.ntype, err)
+		}
 	}
 	}
+
+	return windows.RegisterBuiltinLocalDrivers(r, driverConfig)
 }
 }