mirror of https://github.com/status-im/consul.git
Fix envoy canBind (#6238)
* Fix envoy cli canBind function The string form of an Addr was including the CIDR causing the str equals to not match. * Remove debug prints
This commit is contained in:
parent
847b90288a
commit
1fdda51839
|
@ -165,7 +165,8 @@ func parseAddress(addrStr string) (string, int, error) {
|
||||||
return addr, port, nil
|
return addr, port, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func canBind(addr string) bool {
|
// canBindInternal is here mainly so we can unit test this with a constant net.Addr list
|
||||||
|
func canBindInternal(addr string, ifAddrs []net.Addr) bool {
|
||||||
if addr == "" {
|
if addr == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -175,19 +176,32 @@ func canBind(addr string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ipStr := ip.String()
|
||||||
|
|
||||||
|
for _, addr := range ifAddrs {
|
||||||
|
switch v := addr.(type) {
|
||||||
|
case *net.IPNet:
|
||||||
|
if v.IP.String() == ipStr {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
if addr.String() == ipStr {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func canBind(addr string) bool {
|
||||||
ifAddrs, err := net.InterfaceAddrs()
|
ifAddrs, err := net.InterfaceAddrs()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, addr := range ifAddrs {
|
return canBindInternal(addr, ifAddrs)
|
||||||
if addr.String() == ip.String() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cmd) Run(args []string) int {
|
func (c *cmd) Run(args []string) int {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"os"
|
"os"
|
||||||
|
@ -20,7 +21,7 @@ import (
|
||||||
|
|
||||||
var update = flag.Bool("update", false, "update golden files")
|
var update = flag.Bool("update", false, "update golden files")
|
||||||
|
|
||||||
func TestCatalogCommand_noTabs(t *testing.T) {
|
func TestEnvoyCommand_noTabs(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
if strings.ContainsRune(New(nil).Help(), '\t') {
|
if strings.ContainsRune(New(nil).Help(), '\t') {
|
||||||
t.Fatal("help has tabs")
|
t.Fatal("help has tabs")
|
||||||
|
@ -527,3 +528,99 @@ func testMockAgentProxyConfig(cfg map[string]interface{}) http.HandlerFunc {
|
||||||
w.Write(cfgJSON)
|
w.Write(cfgJSON)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEnvoyCommand_canBindInternal(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
type testCheck struct {
|
||||||
|
expected bool
|
||||||
|
addr string
|
||||||
|
}
|
||||||
|
|
||||||
|
type testCase struct {
|
||||||
|
ifAddrs []net.Addr
|
||||||
|
checks map[string]testCheck
|
||||||
|
}
|
||||||
|
|
||||||
|
parseIPNets := func(t *testing.T, in ...string) []net.Addr {
|
||||||
|
var out []net.Addr
|
||||||
|
for _, addr := range in {
|
||||||
|
ip := net.ParseIP(addr)
|
||||||
|
require.NotNil(t, ip)
|
||||||
|
out = append(out, &net.IPNet{IP: ip})
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
parseIPs := func(t *testing.T, in ...string) []net.Addr {
|
||||||
|
var out []net.Addr
|
||||||
|
for _, addr := range in {
|
||||||
|
ip := net.ParseIP(addr)
|
||||||
|
require.NotNil(t, ip)
|
||||||
|
out = append(out, &net.IPAddr{IP: ip})
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
cases := map[string]testCase{
|
||||||
|
"IPNet": {
|
||||||
|
parseIPNets(t, "10.3.0.2", "198.18.0.1", "2001:db8:a0b:12f0::1"),
|
||||||
|
map[string]testCheck{
|
||||||
|
"ipv4": {
|
||||||
|
true,
|
||||||
|
"10.3.0.2",
|
||||||
|
},
|
||||||
|
"secondary ipv4": {
|
||||||
|
true,
|
||||||
|
"198.18.0.1",
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
true,
|
||||||
|
"2001:db8:a0b:12f0::1",
|
||||||
|
},
|
||||||
|
"ipv4 not found": {
|
||||||
|
false,
|
||||||
|
"1.2.3.4",
|
||||||
|
},
|
||||||
|
"ipv6 not found": {
|
||||||
|
false,
|
||||||
|
"::ffff:192.168.0.1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"IPAddr": {
|
||||||
|
parseIPs(t, "10.3.0.2", "198.18.0.1", "2001:db8:a0b:12f0::1"),
|
||||||
|
map[string]testCheck{
|
||||||
|
"ipv4": {
|
||||||
|
true,
|
||||||
|
"10.3.0.2",
|
||||||
|
},
|
||||||
|
"secondary ipv4": {
|
||||||
|
true,
|
||||||
|
"198.18.0.1",
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
true,
|
||||||
|
"2001:db8:a0b:12f0::1",
|
||||||
|
},
|
||||||
|
"ipv4 not found": {
|
||||||
|
false,
|
||||||
|
"1.2.3.4",
|
||||||
|
},
|
||||||
|
"ipv6 not found": {
|
||||||
|
false,
|
||||||
|
"::ffff:192.168.0.1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, tcase := range cases {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
for checkName, check := range tcase.checks {
|
||||||
|
t.Run(checkName, func(t *testing.T) {
|
||||||
|
require.Equal(t, check.expected, canBindInternal(check.addr, tcase.ifAddrs))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue