diff --git a/drivers/virtualbox/network.go b/drivers/virtualbox/network.go index f3efe9283b..41524a6095 100644 --- a/drivers/virtualbox/network.go +++ b/drivers/virtualbox/network.go @@ -15,7 +15,8 @@ const ( ) 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. @@ -152,6 +153,10 @@ func getOrCreateHostOnlyNetwork(hostIP net.IP, netmask net.IPMask, dhcpIP net.IP return nil, err } + if len(nets) != countUniqueIps(nets) { + return nil, errDuplicateHostOnlyInterfaceNetworks + } + hostOnlyNet := getHostOnlyNetwork(nets, hostIP, netmask) if hostOnlyNet != nil { return hostOnlyNet, nil @@ -182,6 +187,16 @@ func getOrCreateHostOnlyNetwork(hostIP net.IP, netmask net.IPMask, dhcpIP net.IP 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. type dhcpServer struct { NetworkName string diff --git a/drivers/virtualbox/network_test.go b/drivers/virtualbox/network_test.go index a2b2c6aeb6..d40f2b6e97 100644 --- a/drivers/virtualbox/network_test.go +++ b/drivers/virtualbox/network_test.go @@ -211,3 +211,15 @@ func TestGetHostOnlyNetwork(t *testing.T) { assert.Equal(t, "HostInterfaceNetworking-vboxnet0", net.NetworkName) 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) +}