@@ -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