diff --git a/.travis.yml b/.travis.yml index cecac9097e..7f9d4b69c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,13 @@ sudo: required services: - docker +# FIXME(#46924): these two commands are required to enable IPv6, +# they shouldn't exist, please revert once more official solutions appeared. +# see https://github.com/travis-ci/travis-ci/issues/8891#issuecomment-353403729 +before_install: + - echo '{"ipv6":true,"fixed-cidr-v6":"2001:db8:1::/64"}' | sudo tee /etc/docker/daemon.json + - sudo service docker restart + language: generic notifications: diff --git a/internal/net/net.go b/internal/net/net.go index cecee833b4..b7fefb8b3b 100644 --- a/internal/net/net.go +++ b/internal/net/net.go @@ -24,7 +24,7 @@ import ( // IsIPV6 checks if the input contains a valid IPV6 address func IsIPV6(ip _net.IP) bool { - return ip.To4() == nil + return ip != nil && ip.To4() == nil } // IsPortAvailable checks if a TCP port is available or not @@ -37,8 +37,25 @@ func IsPortAvailable(p int) bool { return false } -// IsIPv6Enabled checks if IPV6 is enabled or not +// IsIPv6Enabled checks if IPV6 is enabled or not and we have +// at least one configured in the pod func IsIPv6Enabled() bool { cmd := exec.Command("test", "-f", "/proc/net/if_inet6") - return cmd.Run() == nil + if cmd.Run() != nil { + return false + } + + addrs, err := _net.InterfaceAddrs() + if err != nil { + return false + } + + for _, addr := range addrs { + ip, _, _ := _net.ParseCIDR(addr.String()) + if IsIPV6(ip) { + return true + } + } + + return false } diff --git a/internal/net/net_test.go b/internal/net/net_test.go index 6ab4223caa..25127f6e60 100644 --- a/internal/net/net_test.go +++ b/internal/net/net_test.go @@ -58,3 +58,10 @@ func TestIsPortAvailable(t *testing.T) { t.Fatalf("expected port %v to not be available", p) } } + +func TestIsIPv6Enabled(t *testing.T) { + isEnabled := IsIPv6Enabled() + if !isEnabled { + t.Fatalf("expected IPV6 be enabled") + } +}