From 6b73b5031c463437064b1593d00a60107d09dd99 Mon Sep 17 00:00:00 2001 From: hui luo Date: Tue, 23 Apr 2019 14:52:39 -0700 Subject: [PATCH] Split TestLoopbackHostPort into 2 tests firstly, split into two tests: TestLoopbackHostPortIPv4 and TestLoopbackHostPortIPv6. then improve error handling, going to fail with explicit error message when run host that does not support ipv6 or ipv4 --- .../pkg/server/config_selfclient_test.go | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/config_selfclient_test.go b/staging/src/k8s.io/apiserver/pkg/server/config_selfclient_test.go index 9374403ff9d..f8b53537e98 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config_selfclient_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config_selfclient_test.go @@ -21,7 +21,15 @@ import ( "testing" ) -func TestLoopbackHostPort(t *testing.T) { +func TestLoopbackHostPortIPv4(t *testing.T) { + _, ipv6only, err := isIPv6LoopbackSupported() + if err != nil { + t.Fatalf("fail to enumerate network interface, %s", err) + } + if ipv6only { + t.Fatalf("no ipv4 loopback interface") + } + host, port, err := LoopbackHostPort("1.2.3.4:443") if err != nil { t.Fatalf("unexpected error: %v", err) @@ -43,8 +51,17 @@ func TestLoopbackHostPort(t *testing.T) { if port != "443" { t.Fatalf("expected 443 as port, got %q", port) } +} +func TestLoopbackHostPortIPv6(t *testing.T) { + ipv6, _, err := isIPv6LoopbackSupported() + if err != nil { + t.Fatalf("fail to enumerate network interface, %s", err) + } + if !ipv6 { + t.Fatalf("no ipv6 loopback interface") + } - host, port, err = LoopbackHostPort("[ff06:0:0:0:0:0:0:c3]:443") + host, port, err := LoopbackHostPort("[ff06:0:0:0:0:0:0:c3]:443") if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -62,8 +79,28 @@ func TestLoopbackHostPort(t *testing.T) { if ip := net.ParseIP(host); ip == nil || !ip.IsLoopback() || ip.To4() != nil { t.Fatalf("expected IPv6 host to be loopback, got %q", host) } - if port != "443" { t.Fatalf("expected 443 as port, got %q", port) } } + +func isIPv6LoopbackSupported() (ipv6 bool, ipv6only bool, err error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return false, false, err + } + ipv4 := false + for _, address := range addrs { + ipnet, ok := address.(*net.IPNet) + if !ok || !ipnet.IP.IsLoopback() { + continue + } + if ipnet.IP.To4() == nil { + ipv6 = true + continue + } + ipv4 = true + } + ipv6only = ipv6 && !ipv4 + return ipv6, ipv6only, nil +}