Merge pull request #492 from gravitational/ev/486

Fixed the regression with GuessAdvertiseIP()
This commit is contained in:
Alexander Klizhentas 2016-08-04 16:28:07 -07:00 committed by GitHub
commit 82da884d8e
2 changed files with 44 additions and 82 deletions

View file

@ -276,40 +276,38 @@ func GuessHostIP() (ip net.IP, err error) {
if err != nil {
return nil, trace.Wrap(err)
}
input := make([]netInterface, len(ifaces))
for i, iface := range ifaces {
input[i] = netInterface(&iface)
}
return guessHostIP(input), nil
}
func guessHostIP(ifaces []netInterface) (ip net.IP) {
// collect the list of all IPv4s
var ips []net.IP
adrs := make([]net.Addr, 0)
for _, iface := range ifaces {
addrs, err := iface.Addrs()
ifadrs, err := iface.Addrs()
if err != nil {
log.Warn(err)
continue
} else {
adrs = append(adrs, ifadrs...)
}
for _, addr := range addrs {
var ipAddr net.IP
a, ok := addr.(*net.IPAddr)
}
return guessHostIP(adrs), nil
}
func guessHostIP(addrs []net.Addr) (ip net.IP) {
// collect the list of all IPv4s
var ips []net.IP
for _, addr := range addrs {
var ipAddr net.IP
a, ok := addr.(*net.IPAddr)
if ok {
ipAddr = a.IP
} else {
in, ok := addr.(*net.IPNet)
if ok {
ipAddr = a.IP
ipAddr = in.IP
} else {
in, ok := addr.(*net.IPNet)
if ok {
ipAddr = in.IP
} else {
continue
}
}
if ipAddr.To4() == nil || ipAddr.IsLoopback() || ipAddr.IsMulticast() {
continue
}
ips = append(ips, ipAddr)
}
if ipAddr.To4() == nil || ipAddr.IsLoopback() || ipAddr.IsMulticast() {
continue
}
ips = append(ips, ipAddr)
}
for i := range ips {
switch ips[i][12] {
@ -335,8 +333,3 @@ func guessHostIP(ifaces []netInterface) (ip net.IP) {
}
return ip
}
// netInterface defines a partial view of net.Interface for testing
type netInterface interface {
Addrs() ([]net.Addr, error)
}

View file

@ -127,97 +127,66 @@ func (s *AddrTestSuite) TestLoopbackAddrs(c *C) {
func (s *AddrTestSuite) TestGuessesIPAddress(c *C) {
var testCases = []struct {
ifaces []netInterface
addrs []net.Addr
expected net.IP
comment string
}{
{
ifaces: []netInterface{
iface{
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("10.0.100.80")},
&net.IPAddr{IP: net.ParseIP("192.13.1.80")},
&net.IPAddr{IP: net.ParseIP("172.192.12.1")},
},
},
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("10.0.100.80")},
&net.IPAddr{IP: net.ParseIP("192.13.1.80")},
&net.IPAddr{IP: net.ParseIP("172.192.12.1")},
},
expected: net.ParseIP("10.0.100.80"),
comment: "prefers 10.x.y.z",
},
{
ifaces: []netInterface{
iface{
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("192.13.1.80")},
&net.IPAddr{IP: net.ParseIP("172.192.12.1")},
},
},
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("192.13.1.80")},
&net.IPAddr{IP: net.ParseIP("172.192.12.1")},
},
expected: net.ParseIP("192.13.1.80"),
comment: "prefers 192.x.y.z",
},
{
ifaces: []netInterface{
iface{
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("172.192.12.1")},
&net.IPAddr{IP: net.ParseIP("52.35.21.180")},
},
},
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("172.192.12.1")},
&net.IPAddr{IP: net.ParseIP("52.35.21.180")},
},
expected: net.ParseIP("172.192.12.1"),
comment: "prefers 172.x.y.z",
},
{
ifaces: []netInterface{
iface{
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("192.192.12.1")},
&net.IPAddr{IP: net.ParseIP("192.192.12.2")},
&net.IPAddr{IP: net.ParseIP("52.35.21.180")},
},
},
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("192.192.12.1")},
&net.IPAddr{IP: net.ParseIP("192.192.12.2")},
&net.IPAddr{IP: net.ParseIP("52.35.21.180")},
},
expected: net.ParseIP("192.192.12.2"),
comment: "prefers last",
},
{
ifaces: []netInterface{
iface{
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("52.35.21.180")},
&net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")},
},
},
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("52.35.21.180")},
&net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")},
},
expected: net.ParseIP("52.35.21.180"),
comment: "ignores IPv6",
},
{
ifaces: []netInterface{
iface{
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")},
},
},
addrs: []net.Addr{
&net.IPAddr{IP: net.ParseIP("fe80::af:6dff:fefd:150f")},
},
expected: net.ParseIP("127.0.0.1"),
comment: "falls back to loopback",
},
}
for _, testCase := range testCases {
ip := guessHostIP(testCase.ifaces)
ip := guessHostIP(testCase.addrs)
c.Assert(ip, DeepEquals, testCase.expected, Commentf(testCase.comment))
}
}
type iface struct {
addrs []net.Addr
}
func (r iface) Addrs() ([]net.Addr, error) { return r.addrs, nil }
func (s *AddrTestSuite) TestMarshal(c *C) {
testCases := []struct {
in *NetAddr