FIX #2231 - Detect duplicate interfaces

Signed-off-by: David Gageot <david@gageot.net>
This commit is contained in:
David Gageot 2015-11-20 14:40:55 +01:00
parent 35b2b042e1
commit bf52eceed5
2 changed files with 28 additions and 1 deletions

View File

@ -15,7 +15,8 @@ const (
) )
var ( var (
reHostonlyInterfaceCreated = regexp.MustCompile(`Interface '(.+)' was successfully created`) reHostonlyInterfaceCreated = regexp.MustCompile(`Interface '(.+)' was successfully created`)
errDuplicateHostOnlyInterfaceNetworks = errors.New("VirtualBox is configured with multiple host-only interfaces with the same IP. Please remove all of them but one.")
) )
// Host-only network. // Host-only network.
@ -152,6 +153,10 @@ func getOrCreateHostOnlyNetwork(hostIP net.IP, netmask net.IPMask, dhcpIP net.IP
return nil, err return nil, err
} }
if len(nets) != countUniqueIps(nets) {
return nil, errDuplicateHostOnlyInterfaceNetworks
}
hostOnlyNet := getHostOnlyNetwork(nets, hostIP, netmask) hostOnlyNet := getHostOnlyNetwork(nets, hostIP, netmask)
if hostOnlyNet != nil { if hostOnlyNet != nil {
return hostOnlyNet, nil return hostOnlyNet, nil
@ -182,6 +187,16 @@ func getOrCreateHostOnlyNetwork(hostIP net.IP, netmask net.IPMask, dhcpIP net.IP
return hostOnlyNet, nil return hostOnlyNet, nil
} }
func countUniqueIps(nets map[string]*hostOnlyNetwork) int {
ips := map[string]bool{}
for _, n := range nets {
ips[n.IPv4.IP.String()] = true
}
return len(ips)
}
// DHCP server info. // DHCP server info.
type dhcpServer struct { type dhcpServer struct {
NetworkName string NetworkName string

View File

@ -211,3 +211,15 @@ func TestGetHostOnlyNetwork(t *testing.T) {
assert.Equal(t, "HostInterfaceNetworking-vboxnet0", net.NetworkName) assert.Equal(t, "HostInterfaceNetworking-vboxnet0", net.NetworkName)
assert.NoError(t, err) assert.NoError(t, err)
} }
func TestFailWithDuplicateHostOnlyNetworks(t *testing.T) {
vbox := &VBoxManagerMock{
args: "list hostonlyifs",
stdOut: stdOutTwoHostOnlyNetwork,
}
net, err := getOrCreateHostOnlyNetwork(net.ParseIP("192.168.99.1"), parseIPv4Mask("255.255.255.0"), nil, nil, nil, vbox)
assert.Nil(t, net)
assert.Equal(t, errDuplicateHostOnlyInterfaceNetworks, err)
}