Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ require (
github.com/cloudflare/cfssl v0.0.0-20180323000720-5d63dbd981b5
github.com/container-storage-interface/spec v1.2.0
github.com/docker/distribution v2.8.2+incompatible
github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible // master (v25.0.0-dev)
github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible // master (v25.0.0-dev)
github.com/docker/go-connections v0.4.0
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c
github.com/docker/go-metrics v0.0.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible h1:3OTkzTHbQj93/CJInJrkpgiKz+8THR9Y9lp/i5Jb/JE=
github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible h1:XccikgvtGCEZE9ZQoaEApdx9ZvruGYakfi2tw4d/vUg=
github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
Expand Down
7 changes: 3 additions & 4 deletions manager/allocator/cnmallocator/drivers_darwin.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package cnmallocator

import (
"github.com/docker/docker/libnetwork/driverapi"
"github.com/docker/docker/libnetwork/drivers/overlay/ovmanager"
"github.com/docker/docker/libnetwork/drivers/remote"
"github.com/moby/swarmkit/v2/manager/allocator/networkallocator"
)

var initializers = []initializer{
{remote.Init, "remote"},
{ovmanager.Init, "overlay"},
var initializers = map[string]func(driverapi.Registerer) error{
"overlay": ovmanager.Register,
}

// PredefinedNetworks returns the list of predefined network structures
Expand Down
13 changes: 5 additions & 8 deletions manager/allocator/cnmallocator/drivers_ipam.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@ import (
"strconv"
"strings"

"github.com/docker/docker/libnetwork/drvregistry"
"github.com/docker/docker/libnetwork/ipamapi"
builtinIpam "github.com/docker/docker/libnetwork/ipams/builtin"
nullIpam "github.com/docker/docker/libnetwork/ipams/null"
remoteIpam "github.com/docker/docker/libnetwork/ipams/remote"
"github.com/docker/docker/libnetwork/ipamutils"
"github.com/sirupsen/logrus"
)

func initIPAMDrivers(r *drvregistry.DrvRegistry, netConfig *NetworkConfig) error {
func initIPAMDrivers(r ipamapi.Registerer, netConfig *NetworkConfig) error {
var addressPool []*ipamutils.NetworkToSplit
var str strings.Builder
str.WriteString("Subnetlist - ")
Expand All @@ -40,12 +38,11 @@ func initIPAMDrivers(r *drvregistry.DrvRegistry, netConfig *NetworkConfig) error
logrus.Infof("Swarm initialized global default address pool to: " + str.String())
}

for _, fn := range [](func(ipamapi.Callback, interface{}, interface{}) error){
builtinIpam.Init,
remoteIpam.Init,
nullIpam.Init,
for _, fn := range [](func(ipamapi.Registerer) error){
builtinIpam.Register,
nullIpam.Register,
} {
if err := fn(r, nil, nil); err != nil {
if err := fn(r); err != nil {
return err
}
}
Expand Down
15 changes: 7 additions & 8 deletions manager/allocator/cnmallocator/drivers_network_linux.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package cnmallocator

import (
"github.com/docker/docker/libnetwork/driverapi"
"github.com/docker/docker/libnetwork/drivers/bridge/brmanager"
"github.com/docker/docker/libnetwork/drivers/host"
"github.com/docker/docker/libnetwork/drivers/ipvlan/ivmanager"
"github.com/docker/docker/libnetwork/drivers/macvlan/mvmanager"
"github.com/docker/docker/libnetwork/drivers/overlay/ovmanager"
"github.com/docker/docker/libnetwork/drivers/remote"
"github.com/moby/swarmkit/v2/manager/allocator/networkallocator"
)

var initializers = []initializer{
{remote.Init, "remote"},
{ovmanager.Init, "overlay"},
{mvmanager.Init, "macvlan"},
{brmanager.Init, "bridge"},
{ivmanager.Init, "ipvlan"},
{host.Init, "host"},
var initializers = map[string]func(driverapi.Registerer) error{
"overlay": ovmanager.Register,
"macvlan": mvmanager.Register,
"bridge": brmanager.Register,
"ipvlan": ivmanager.Register,
"host": host.Register,
}

// PredefinedNetworks returns the list of predefined network structures
Expand Down
19 changes: 12 additions & 7 deletions manager/allocator/cnmallocator/drivers_network_windows.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package cnmallocator

import (
"github.com/docker/docker/libnetwork/driverapi"
"github.com/docker/docker/libnetwork/drivers/overlay/ovmanager"
"github.com/docker/docker/libnetwork/drivers/remote"
"github.com/moby/swarmkit/v2/manager/allocator/networkallocator"
)

var initializers = []initializer{
{remote.Init, "remote"},
{ovmanager.Init, "overlay"},
{StubManagerInit("internal"), "internal"},
{StubManagerInit("l2bridge"), "l2bridge"},
{StubManagerInit("nat"), "nat"},
var initializers = map[string]func(driverapi.Registerer) error{
"overlay": ovmanager.Register,
"internal": stubManager("internal"),
"l2bridge": stubManager("l2bridge"),
"nat": stubManager("nat"),
}

// PredefinedNetworks returns the list of predefined network structures
Expand All @@ -20,3 +19,9 @@ func PredefinedNetworks() []networkallocator.PredefinedNetworkData {
{Name: "nat", Driver: "nat"},
}
}

func stubManager(ntype string) func(driverapi.Registerer) error {
return func(r driverapi.Registerer) error {
return RegisterManager(r, ntype)
}
}
15 changes: 4 additions & 11 deletions manager/allocator/cnmallocator/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,12 @@ type manager struct {
networkType string
}

func StubManagerInit(networkType string) func(dc driverapi.DriverCallback, config map[string]interface{}) error {
return func(dc driverapi.DriverCallback, config map[string]interface{}) error {
return RegisterManager(dc, networkType)
}
}

// Register registers a new instance of the manager driver for networkType with r.
func RegisterManager(r driverapi.DriverCallback, networkType string) error {
c := driverapi.Capability{
// RegisterManager registers a new instance of the manager driver for networkType with r.
func RegisterManager(r driverapi.Registerer, networkType string) error {
return r.RegisterDriver(networkType, &manager{networkType: networkType}, driverapi.Capability{
DataScope: datastore.LocalScope,
ConnectivityScope: datastore.LocalScope,
}
return r.RegisterDriver(networkType, &manager{networkType: networkType}, c)
})
}

func (d *manager) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) {
Expand Down
71 changes: 30 additions & 41 deletions manager/allocator/cnmallocator/networkallocator.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ import (

"github.com/docker/docker/libnetwork/datastore"
"github.com/docker/docker/libnetwork/driverapi"
"github.com/docker/docker/libnetwork/drivers/remote"
"github.com/docker/docker/libnetwork/drvregistry"
"github.com/docker/docker/libnetwork/ipamapi"
remoteipam "github.com/docker/docker/libnetwork/ipams/remote"
"github.com/docker/docker/libnetwork/netlabel"
"github.com/docker/docker/pkg/plugingetter"
"github.com/moby/swarmkit/v2/api"
Expand All @@ -30,9 +32,14 @@ const (
// like managing network and IPAM drivers and also creating and
// deleting networks and the associated resources.
type cnmNetworkAllocator struct {
// The driver register which manages all internal and external
// IPAM and network drivers.
drvRegistry *drvregistry.DrvRegistry
// The plugin getter instance used to get network and IPAM driver plugins.
pg plugingetter.PluginGetter

// The driver registry for all internal and external IPAM drivers.
ipamRegistry drvregistry.IPAMs

// The driver registry for all internal and external network drivers.
networkRegistry drvregistry.Networks

// The port allocator instance for allocating node ports
portAllocator *portAllocator
Expand Down Expand Up @@ -81,11 +88,6 @@ type networkDriver struct {
capability *driverapi.Capability
}

type initializer struct {
fn drvregistry.InitFunc
ntype string
}

// NetworkConfig is used to store network related cluster config in the Manager.
type NetworkConfig struct {
// DefaultAddrPool specifies default subnet pool for global scope networks
Expand All @@ -106,30 +108,31 @@ func New(pg plugingetter.PluginGetter, netConfig *NetworkConfig) (networkallocat
services: make(map[string]struct{}),
tasks: make(map[string]struct{}),
nodes: make(map[string]map[string]struct{}),
pg: pg,
}

// There are no driver configurations and notification
// functions as of now.
reg, err := drvregistry.New(nil, nil, nil, nil, pg)
if err != nil {
return nil, err
for ntype, i := range initializers {
if err := i(&na.networkRegistry); err != nil {
return nil, fmt.Errorf("failed to register %q network driver: %w", ntype, err)
}
}

if err := initializeDrivers(reg); err != nil {
return nil, err
if err := remote.Register(&na.networkRegistry, pg); err != nil {
return nil, fmt.Errorf("failed to initialize network driver plugins: %w", err)
}

if err = initIPAMDrivers(reg, netConfig); err != nil {
if err := initIPAMDrivers(&na.ipamRegistry, netConfig); err != nil {
return nil, err
}
if err := remoteipam.Register(&na.ipamRegistry, pg); err != nil {
return nil, fmt.Errorf("failed to initialize IPAM driver plugins: %w", err)
}

pa, err := newPortAllocator()
if err != nil {
return nil, err
}

na.portAllocator = pa
na.drvRegistry = reg
return na, nil
}

Expand Down Expand Up @@ -816,28 +819,27 @@ func (na *cnmNetworkAllocator) resolveDriver(n *api.Network) (*networkDriver, er
dName = n.Spec.DriverConfig.Name
}

d, drvcap := na.drvRegistry.Driver(dName)
d, drvcap := na.networkRegistry.Driver(dName)
if d == nil {
err := na.loadDriver(dName)
if err != nil {
return nil, err
}

d, drvcap = na.drvRegistry.Driver(dName)
d, drvcap = na.networkRegistry.Driver(dName)
if d == nil {
return nil, fmt.Errorf("could not resolve network driver %s", dName)
}
}

return &networkDriver{driver: d, capability: drvcap, name: dName}, nil
return &networkDriver{driver: d, capability: &drvcap, name: dName}, nil
}

func (na *cnmNetworkAllocator) loadDriver(name string) error {
pg := na.drvRegistry.GetPluginGetter()
if pg == nil {
if na.pg == nil {
return errors.New("plugin store is uninitialized")
}
_, err := pg.Get(name, driverapi.NetworkPluginEndpointType, plugingetter.Lookup)
_, err := na.pg.Get(name, driverapi.NetworkPluginEndpointType, plugingetter.Lookup)
return err
}

Expand All @@ -853,7 +855,7 @@ func (na *cnmNetworkAllocator) resolveIPAM(n *api.Network) (ipamapi.Ipam, string
dOptions = n.Spec.IPAM.Driver.Options
}

ipam, _ := na.drvRegistry.IPAM(dName)
ipam, _ := na.ipamRegistry.IPAM(dName)
if ipam == nil {
return nil, "", nil, fmt.Errorf("could not resolve IPAM driver %s", dName)
}
Expand Down Expand Up @@ -893,7 +895,7 @@ func (na *cnmNetworkAllocator) allocatePools(n *api.Network) (map[string]string,

// We don't support user defined address spaces yet so just
// retrieve default address space names for the driver.
_, asName, err := na.drvRegistry.IPAMDefaultAddressSpaces(dName)
_, asName, err := ipam.GetDefaultAddressSpaces()
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -978,15 +980,6 @@ func (na *cnmNetworkAllocator) allocatePools(n *api.Network) (map[string]string,
return pools, nil
}

func initializeDrivers(reg *drvregistry.DrvRegistry) error {
for _, i := range initializers {
if err := reg.AddDriver(i.ntype, i.fn, nil); err != nil {
return err
}
}
return nil
}

func serviceNetworks(s *api.Service) []*api.NetworkAttachmentConfig {
// Always prefer NetworkAttachmentConfig in the TaskSpec
if len(s.Spec.Task.Networks) == 0 && len(s.Spec.Networks) != 0 {
Expand All @@ -1011,12 +1004,8 @@ func (na *cnmNetworkAllocator) IsVIPOnIngressNetwork(vip *api.Endpoint_VirtualIP
// IsBuiltInDriver returns whether the passed driver is an internal network driver
func IsBuiltInDriver(name string) bool {
n := strings.ToLower(name)
for _, d := range initializers {
if n == d.ntype {
return true
}
}
return false
_, ok := initializers[n]
return ok
}

// setIPAMSerialAlloc sets the ipam allocation method to serial
Expand Down
2 changes: 1 addition & 1 deletion manager/allocator/cnmallocator/networkallocator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ func TestCorrectlyPassIPAMOptions(t *testing.T) {
na := newNetworkAllocator(t)
ipamDriver := &mockIpam{}

err = na.(*cnmNetworkAllocator).drvRegistry.RegisterIpamDriver("mockipam", ipamDriver)
err = na.(*cnmNetworkAllocator).ipamRegistry.RegisterIpamDriver("mockipam", ipamDriver)
assert.NoError(t, err)

n := &api.Network{
Expand Down
Loading