diff --git a/libnetwork/drivers/bridge/bridge.go b/libnetwork/drivers/bridge/bridge.go index 3c70128124..e0e50a907b 100644 --- a/libnetwork/drivers/bridge/bridge.go +++ b/libnetwork/drivers/bridge/bridge.go @@ -22,6 +22,7 @@ import ( "github.com/docker/docker/libnetwork/netutils" "github.com/docker/docker/libnetwork/ns" "github.com/docker/docker/libnetwork/options" + "github.com/docker/docker/libnetwork/portallocator" "github.com/docker/docker/libnetwork/portmapper" "github.com/docker/docker/libnetwork/types" "github.com/sirupsen/logrus" @@ -155,12 +156,16 @@ type driver struct { store datastore.DataStore nlh *netlink.Handle configNetwork sync.Mutex + portAllocator *portallocator.PortAllocator // Overridable for tests. sync.Mutex } // New constructs a new bridge driver func newDriver() *driver { - return &driver{networks: map[string]*bridgeNetwork{}} + return &driver{ + networks: map[string]*bridgeNetwork{}, + portAllocator: portallocator.Get(), + } } // Init registers a new instance of bridge driver @@ -685,8 +690,8 @@ func (d *driver) createNetwork(config *networkConfiguration) (err error) { id: config.ID, endpoints: make(map[string]*bridgeEndpoint), config: config, - portMapper: portmapper.New(d.config.UserlandProxyPath), - portMapperV6: portmapper.New(d.config.UserlandProxyPath), + portMapper: portmapper.NewWithPortAllocator(d.portAllocator, d.config.UserlandProxyPath), + portMapperV6: portmapper.NewWithPortAllocator(d.portAllocator, d.config.UserlandProxyPath), bridge: bridgeIface, driver: d, } diff --git a/libnetwork/drivers/bridge/bridge_test.go b/libnetwork/drivers/bridge/bridge_test.go index e3600f9d5f..fe3cc50fa3 100644 --- a/libnetwork/drivers/bridge/bridge_test.go +++ b/libnetwork/drivers/bridge/bridge_test.go @@ -17,6 +17,7 @@ import ( "github.com/docker/docker/libnetwork/netlabel" "github.com/docker/docker/libnetwork/netutils" "github.com/docker/docker/libnetwork/options" + "github.com/docker/docker/libnetwork/portallocator" "github.com/docker/docker/libnetwork/testutils" "github.com/docker/docker/libnetwork/types" "github.com/vishvananda/netlink" @@ -607,6 +608,7 @@ func TestQueryEndpointInfoHairpin(t *testing.T) { func testQueryEndpointInfo(t *testing.T, ulPxyEnabled bool) { defer testutils.SetupTestOSContext(t)() d := newDriver() + d.portAllocator = portallocator.NewInstance() config := &configuration{ EnableIPTables: true, @@ -1079,6 +1081,7 @@ func TestCreateParallel(t *testing.T) { defer c.Cleanup(t) d := newDriver() + d.portAllocator = portallocator.NewInstance() if err := d.configure(nil); err != nil { t.Fatalf("Failed to setup driver config: %v", err) diff --git a/libnetwork/portallocator/portallocator.go b/libnetwork/portallocator/portallocator.go index a4fd39919c..d4ea711c45 100644 --- a/libnetwork/portallocator/portallocator.go +++ b/libnetwork/portallocator/portallocator.go @@ -83,12 +83,13 @@ func Get() *PortAllocator { // When this happens singleton behavior will be removed. Clients do not // need to worry about this, they will not see a change in behavior. once.Do(func() { - instance = newInstance() + instance = NewInstance() }) return instance } -func newInstance() *PortAllocator { +// NewInstance is meant for use by libnetwork tests. It is not meant to be called directly. +func NewInstance() *PortAllocator { start, end, err := getDynamicPortRange() if err != nil { logrus.WithError(err).Infof("falling back to default port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd) diff --git a/libnetwork/portallocator/portallocator_test.go b/libnetwork/portallocator/portallocator_test.go index 4d94885a74..d5169f2ad7 100644 --- a/libnetwork/portallocator/portallocator_test.go +++ b/libnetwork/portallocator/portallocator_test.go @@ -6,7 +6,7 @@ import ( ) func resetPortAllocator() { - instance = newInstance() + instance = NewInstance() } func TestRequestNewPort(t *testing.T) {