diff --git a/libnetwork/drivers/bridge/bridge.go b/libnetwork/drivers/bridge/bridge.go index 60077d77a6..b144e78a6c 100644 --- a/libnetwork/drivers/bridge/bridge.go +++ b/libnetwork/drivers/bridge/bridge.go @@ -5,7 +5,6 @@ import ( "net" "os/exec" "strconv" - "strings" "sync" "github.com/Sirupsen/logrus" @@ -701,13 +700,13 @@ func (d *driver) CreateEndpoint(nid, eid types.UUID, epInfo driverapi.EndpointIn }() // Generate a name for what will be the host side pipe interface - name1, err := generateIfaceName() + name1, err := netutils.GenerateIfaceName(vethPrefix, vethLen) if err != nil { return err } // Generate a name for what will be the sandbox side pipe interface - name2, err := generateIfaceName() + name2, err := netutils.GenerateIfaceName(vethPrefix, vethLen) if err != nil { return err } @@ -1184,22 +1183,3 @@ func electMacAddress(epConfig *endpointConfiguration) net.HardwareAddr { } return netutils.GenerateRandomMAC() } - -// Generates a name to be used for a virtual ethernet -// interface. The name is constructed by 'veth' appended -// by a randomly generated hex value. (example: veth0f60e2c) -func generateIfaceName() (string, error) { - for i := 0; i < 3; i++ { - name, err := netutils.GenerateRandomName(vethPrefix, vethLen) - if err != nil { - continue - } - if _, err := net.InterfaceByName(name); err != nil { - if strings.Contains(err.Error(), "no such") { - return name, nil - } - return "", err - } - } - return "", &ErrIfaceName{} -} diff --git a/libnetwork/netutils/utils.go b/libnetwork/netutils/utils.go index 98da12e981..222b7a2b87 100644 --- a/libnetwork/netutils/utils.go +++ b/libnetwork/netutils/utils.go @@ -9,7 +9,9 @@ import ( "fmt" "io" "net" + "strings" + "github.com/docker/libnetwork/types" "github.com/vishvananda/netlink" ) @@ -147,3 +149,22 @@ func GenerateRandomName(prefix string, size int) (string, error) { } return prefix + hex.EncodeToString(id)[:size], nil } + +// GenerateIfaceName returns an interface name using the passed in +// prefix and the length of random bytes. The api ensures that the +// there are is no interface which exists with that name. +func GenerateIfaceName(prefix string, len int) (string, error) { + for i := 0; i < 3; i++ { + name, err := GenerateRandomName(prefix, len) + if err != nil { + continue + } + if _, err := net.InterfaceByName(name); err != nil { + if strings.Contains(err.Error(), "no such") { + return name, nil + } + return "", err + } + } + return "", types.InternalErrorf("could not generate interface name") +} diff --git a/libnetwork/types/types_test.go b/libnetwork/types/types_test.go index 9e96ea858d..15a58e1534 100644 --- a/libnetwork/types/types_test.go +++ b/libnetwork/types/types_test.go @@ -1,11 +1,12 @@ package types import ( + "flag" "testing" - - _ "github.com/docker/libnetwork/netutils" ) +var runningInContainer = flag.Bool("incontainer", false, "Indicates if the test is running in a container") + func TestErrorConstructors(t *testing.T) { var err error