@@ -3,6 +3,7 @@ package cnmallocator
3
3
import (
4
4
"fmt"
5
5
6
+ "github.com/docker/docker/libnetwork/datastore"
6
7
"github.com/docker/docker/libnetwork/idm"
7
8
"github.com/moby/swarmkit/v2/api"
8
9
)
@@ -117,16 +118,30 @@ func newPortAllocator() (*portAllocator, error) {
117
118
return & portAllocator {portSpaces : portSpaces }, nil
118
119
}
119
120
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
+ }
123
137
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 )
125
140
if err != nil {
126
141
return nil , err
127
142
}
128
143
129
- dynamic , err := idm .New ( nil , dynamicName , dynamicPortStart , dynamicPortEnd )
144
+ dynamic , err := newIdm ( idm .New , protocol . String () + "-dynamic-ports" , dynamicPortStart , dynamicPortEnd )
130
145
if err != nil {
131
146
return nil , err
132
147
}
0 commit comments