@@ -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,30 @@ func newPortAllocator() (*portAllocator, error) {
117118 return & portAllocator {portSpaces : portSpaces }, nil
118119}
119120
120- func newPortSpace (protocol api.PortConfig_Protocol ) (* portSpace , error ) {
121- masterName := fmt .Sprintf ("%s-master-ports" , protocol )
122- dynamicName := fmt .Sprintf ("%s-dynamic-ports" , protocol )
121+ type (
122+ // these are deliberately aliases, otherwise we'd only match the same type, not signature.
123+ legacyIdmConstructor = func (ds datastore.DataStore , id string , start , end uint64 ) (* idm.Idm , error )
124+ idmConstructor = func (id string , start , end uint64 ) (* idm.Idm , error )
125+ )
126+
127+ func newIdm (newFn any , id string , start , end uint64 ) (* idm.Idm , error ) {
128+ switch fn := newFn .(type ) {
129+ case idmConstructor :
130+ return fn (id , start , end )
131+ case legacyIdmConstructor :
132+ return fn (nil , id , start , end )
133+ default :
134+ return nil , fmt .Errorf ("invalid constructor signature: %T" , newFn )
135+ }
136+ }
123137
124- master , err := idm .New (nil , masterName , masterPortStart , masterPortEnd )
138+ func newPortSpace (protocol api.PortConfig_Protocol ) (* portSpace , error ) {
139+ master , err := newIdm (idm .New , protocol .String ()+ "-master-ports" , masterPortStart , masterPortEnd )
125140 if err != nil {
126141 return nil , err
127142 }
128143
129- dynamic , err := idm .New ( nil , dynamicName , dynamicPortStart , dynamicPortEnd )
144+ dynamic , err := newIdm ( idm .New , protocol . String () + "-dynamic-ports" , dynamicPortStart , dynamicPortEnd )
130145 if err != nil {
131146 return nil , err
132147 }
0 commit comments