@@ -3,6 +3,7 @@ package cnmallocator
33import (
44 "fmt"
55
6+ "github.com/docker/docker/libnetwork/datastore"
67 "github.com/docker/docker/libnetwork/idm"
78 "github.com/moby/swarmkit/v2/api"
89)
@@ -117,16 +118,38 @@ func newPortAllocator() (*portAllocator, error) {
117118 return & portAllocator {portSpaces : portSpaces }, nil
118119}
119120
121+ type (
122+ legacyConstructor func (ds datastore.DataStore , id string , start , end uint64 ) (* idm.Idm , error )
123+ idmConstructor func (id string , start , end uint64 ) (* idm.Idm , error )
124+ )
125+
126+ func adaptConstructor (newFn any ) (idmConstructor , error ) {
127+ if fn , ok := newFn .(idmConstructor ); ok {
128+ return fn , nil
129+ }
130+ if fn , ok := newFn .(legacyConstructor ); ok {
131+ return func (id string , start , end uint64 ) (* idm.Idm , error ) {
132+ return fn (nil , id , start , end )
133+ }, nil
134+ }
135+ return nil , fmt .Errorf ("invalid constructor: %+v (%T)" , newFn , newFn )
136+ }
137+
120138func newPortSpace (protocol api.PortConfig_Protocol ) (* portSpace , error ) {
139+ fn , err := adaptConstructor (idm .New )
140+ if err != nil {
141+ return nil , err
142+ }
143+
121144 masterName := fmt .Sprintf ("%s-master-ports" , protocol )
122145 dynamicName := fmt .Sprintf ("%s-dynamic-ports" , protocol )
123146
124- master , err := idm . New ( nil , masterName , masterPortStart , masterPortEnd )
147+ master , err := fn ( masterName , masterPortStart , masterPortEnd )
125148 if err != nil {
126149 return nil , err
127150 }
128151
129- dynamic , err := idm . New ( nil , dynamicName , dynamicPortStart , dynamicPortEnd )
152+ dynamic , err := fn ( dynamicName , dynamicPortStart , dynamicPortEnd )
130153 if err != nil {
131154 return nil , err
132155 }
0 commit comments