From 54a895b30e072a71dac64c3035e6a3b6a0c91146 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Mon, 18 May 2015 13:17:49 -0400 Subject: [PATCH] Stop using ephemeral ports for integration tests --- test/integration/oauth_basicauth_test.go | 5 ++- test/util/server.go | 47 ++++++++++++++++++------ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/test/integration/oauth_basicauth_test.go b/test/integration/oauth_basicauth_test.go index d7cf00389636..3cce2b703deb 100644 --- a/test/integration/oauth_basicauth_test.go +++ b/test/integration/oauth_basicauth_test.go @@ -202,7 +202,10 @@ func TestOAuthBasicAuthPassword(t *testing.T) { }) // Start remote server - remoteAddr := testutil.FindAvailableBindAddress() + remoteAddr, err := testutil.FindAvailableBindAddress(9443, 9999) + if err != nil { + t.Fatalf("Couldn't get free address for test server: %v", err) + } remoteServer := &http.Server{ Addr: remoteAddr, Handler: remoteHandler, diff --git a/test/util/server.go b/test/util/server.go index 9674c2b6d141..e690d314fbf1 100644 --- a/test/util/server.go +++ b/test/util/server.go @@ -1,6 +1,7 @@ package util import ( + "errors" "fmt" "net" "net/url" @@ -11,6 +12,7 @@ import ( kclient "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/fields" "github.com/GoogleCloudPlatform/kubernetes/pkg/labels" + "github.com/golang/glog" "github.com/openshift/origin/pkg/client" newproject "github.com/openshift/origin/pkg/cmd/admin/project" @@ -41,13 +43,26 @@ func GetBaseDir() string { return cmdutil.Env("BASETMPDIR", path.Join(os.TempDir(), "openshift-"+Namespace())) } -func FindAvailableBindAddress() string { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - panic(err) +// FindAvailableBindAddress returns a bind address on 127.0.0.1 with a free port in the low-high range. +// If lowPort is 0, an ephemeral port is allocated. +func FindAvailableBindAddress(lowPort, highPort int) (string, error) { + if highPort < lowPort { + return "", errors.New("lowPort must be <= highPort") + } + for port := lowPort; port <= highPort; port++ { + l, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%d", port)) + if err != nil { + if port == 0 { + // Only get one shot to get an ephemeral port + return "", err + } + continue + } + defer l.Close() + return l.Addr().String(), nil } - defer l.Close() - return l.Addr().String() + + return "", fmt.Errorf("Could not find available port in the range %d-%d", lowPort, highPort) } func setupStartOptions() (*start.MasterArgs, *start.NodeArgs, *start.ListenArg, *start.ImageFormatArgs, *start.KubeConnectionArgs) { @@ -62,9 +77,13 @@ func setupStartOptions() (*start.MasterArgs, *start.NodeArgs, *start.ListenArg, nodeArgs.MasterCertDir = masterArgs.ConfigDir.Value() // don't wait for nodes to come up - masterAddr := FindAvailableBindAddress() - if len(os.Getenv("OS_MASTER_ADDR")) > 0 { - masterAddr = os.Getenv("OS_MASTER_ADDR") + masterAddr := os.Getenv("OS_MASTER_ADDR") + if len(masterAddr) == 0 { + if addr, err := FindAvailableBindAddress(8443, 8999); err != nil { + glog.Fatalf("Couldn't find free address for master: %v", err) + } else { + masterAddr = addr + } } fmt.Printf("masterAddr: %#v\n", masterAddr) @@ -72,9 +91,13 @@ func setupStartOptions() (*start.MasterArgs, *start.NodeArgs, *start.ListenArg, listenArg.ListenAddr.Set(masterAddr) masterArgs.EtcdAddr.Set(GetEtcdURL()) - dnsAddr := FindAvailableBindAddress() - if len(os.Getenv("OS_DNS_ADDR")) > 0 { - dnsAddr = os.Getenv("OS_DNS_ADDR") + dnsAddr := os.Getenv("OS_DNS_ADDR") + if len(dnsAddr) == 0 { + if addr, err := FindAvailableBindAddress(8053, 8100); err != nil { + glog.Fatalf("Couldn't find free address for DNS: %v", err) + } else { + dnsAddr = addr + } } fmt.Printf("dnsAddr: %#v\n", dnsAddr) masterArgs.DNSBindAddr.Set(dnsAddr)