From f5aadc36011536e1fc3be241213f599a4e3d1cfb Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Fri, 30 Jun 2023 13:54:18 +0200 Subject: [PATCH 1/2] manager/allocator/cnmallocator: add temporary adaptor for constructor Add an adaptor to help with a signature change in the Idm constructor. Signed-off-by: Sebastiaan van Stijn --- .../allocator/cnmallocator/portallocator.go | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/manager/allocator/cnmallocator/portallocator.go b/manager/allocator/cnmallocator/portallocator.go index 3e5e1c4443..8d0a24f3d8 100644 --- a/manager/allocator/cnmallocator/portallocator.go +++ b/manager/allocator/cnmallocator/portallocator.go @@ -3,6 +3,7 @@ package cnmallocator import ( "fmt" + "github.com/docker/docker/libnetwork/datastore" "github.com/docker/docker/libnetwork/idm" "github.com/moby/swarmkit/v2/api" ) @@ -117,16 +118,30 @@ func newPortAllocator() (*portAllocator, error) { return &portAllocator{portSpaces: portSpaces}, nil } -func newPortSpace(protocol api.PortConfig_Protocol) (*portSpace, error) { - masterName := fmt.Sprintf("%s-master-ports", protocol) - dynamicName := fmt.Sprintf("%s-dynamic-ports", protocol) +type ( + // these are deliberately aliases, otherwise we'd only match the same type, not signature. + legacyIdmConstructor = func(ds datastore.DataStore, id string, start, end uint64) (*idm.Idm, error) + idmConstructor = func(id string, start, end uint64) (*idm.Idm, error) +) + +func newIdm(newFn any, id string, start, end uint64) (*idm.Idm, error) { + switch fn := newFn.(type) { + case idmConstructor: + return fn(id, start, end) + case legacyIdmConstructor: + return fn(nil, id, start, end) + default: + return nil, fmt.Errorf("invalid constructor signature: %T", newFn) + } +} - master, err := idm.New(nil, masterName, masterPortStart, masterPortEnd) +func newPortSpace(protocol api.PortConfig_Protocol) (*portSpace, error) { + master, err := newIdm(idm.New, protocol.String()+"-master-ports", masterPortStart, masterPortEnd) if err != nil { return nil, err } - dynamic, err := idm.New(nil, dynamicName, dynamicPortStart, dynamicPortEnd) + dynamic, err := newIdm(idm.New, protocol.String()+"-dynamic-ports", dynamicPortStart, dynamicPortEnd) if err != nil { return nil, err } From 47210e3c8bb788d54f5d29d73e92c538e820995f Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 28 Jun 2021 13:04:32 +0200 Subject: [PATCH 2/2] manager/allocator/cnmallocator: add adaptor for allocator signature changes Signed-off-by: Sebastiaan van Stijn --- .../cnmallocator/networkallocator.go | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/manager/allocator/cnmallocator/networkallocator.go b/manager/allocator/cnmallocator/networkallocator.go index 9aae338fa2..21bed7d99d 100644 --- a/manager/allocator/cnmallocator/networkallocator.go +++ b/manager/allocator/cnmallocator/networkallocator.go @@ -99,6 +99,24 @@ type NetworkConfig struct { VXLANUDPPort uint32 } +type ( + registryConstructor = func(drvregistry.DriverNotifyFunc, plugingetter.PluginGetter) (*drvregistry.DrvRegistry, error) + legacyConstructor = func(drvregistry.Placeholder, drvregistry.Placeholder, drvregistry.DriverNotifyFunc, drvregistry.Placeholder, plugingetter.PluginGetter) (*drvregistry.DrvRegistry, error) +) + +func newDriverRegistry(newFn any, pg plugingetter.PluginGetter) (*drvregistry.DrvRegistry, error) { + switch fn := newFn.(type) { + case registryConstructor: + // There are no driver configurations and notification + // functions as of now. + return fn(nil, pg) + case legacyConstructor: + return fn(nil, nil, nil, nil, pg) + default: + return nil, fmt.Errorf("invalid constructor signature: %T", newFn) + } +} + // New returns a new NetworkAllocator handle func New(pg plugingetter.PluginGetter, netConfig *NetworkConfig) (networkallocator.NetworkAllocator, error) { na := &cnmNetworkAllocator{ @@ -108,9 +126,8 @@ func New(pg plugingetter.PluginGetter, netConfig *NetworkConfig) (networkallocat nodes: make(map[string]map[string]struct{}), } - // There are no driver configurations and notification - // functions as of now. - reg, err := drvregistry.New(nil, nil, nil, nil, pg) + // FIXME(thaJeztah): drvregistry.New was deprecated in https://github.com/moby/moby/commit/5595311209cc915e8b0ace0a1bbd8b52a7baecb0, but there's no other way to pass a PluginGetter to it. + reg, err := newDriverRegistry(drvregistry.New, pg) if err != nil { return nil, err }