Skip to content

Commit

Permalink
Merge pull request gravitational#492 from gravitational/ev/486
Browse files Browse the repository at this point in the history
Fixed the regression with GuessAdvertiseIP()
  • Loading branch information
klizhentas authored Aug 4, 2016
2 parents aac45e0 + e932dbe commit 82da884
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 81 deletions.
51 changes: 22 additions & 29 deletions lib/utils/addr.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
adrs := make([]net.Addr, 0)
for _, iface := range ifaces {
ifadrs, err := iface.Addrs()
if err != nil {
log.Warn(err)
} else {
adrs = append(adrs, ifadrs...)
}
}
return guessHostIP(input), nil
return guessHostIP(adrs), nil
}

func guessHostIP(ifaces []netInterface) (ip net.IP) {
func guessHostIP(addrs []net.Addr) (ip net.IP) {
// collect the list of all IPv4s
var ips []net.IP
for _, iface := range ifaces {
addrs, err := iface.Addrs()
if err != nil {
log.Warn(err)
continue
}
for _, addr := range addrs {
var ipAddr net.IP
a, ok := addr.(*net.IPAddr)
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] {
Expand All @@ -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)
}
73 changes: 21 additions & 52 deletions lib/utils/addr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 82da884

Please sign in to comment.