From e1bc4d2eba243be923ec5d9b454558a13e126f12 Mon Sep 17 00:00:00 2001 From: Daniel Smith Date: Thu, 12 Jun 2014 17:18:19 -0700 Subject: [PATCH] Port 2223 is in use on my machine sometimes, so this test was flaky. --- pkg/proxy/proxier.go | 25 ++++++++++++++++++---- pkg/proxy/proxier_test.go | 45 ++++++++++++++++++++++----------------- 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/pkg/proxy/proxier.go b/pkg/proxy/proxier.go index 7eed34a050d..eaf7aedf6bb 100644 --- a/pkg/proxy/proxier.go +++ b/pkg/proxy/proxier.go @@ -90,16 +90,33 @@ func (proxier Proxier) AcceptHandler(service string, listener net.Listener) { // AddService starts listening for a new service on a given port. func (proxier Proxier) AddService(service string, port int) error { // Make sure we can start listening on the port before saying all's well. - ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) + l, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) if err != nil { return err } - log.Printf("Listening for %s on %d", service, port) - // If that succeeds, start the accepting loop. - go proxier.AcceptHandler(service, ln) + proxier.addServiceCommon(service, l) return nil } +// addService starts listening for a new service, returning the port it's using. +// For testing on a system with unknown ports used. +func (proxier Proxier) addServiceOnUnusedPort(service string) (string, error) { + // Make sure we can start listening on the port before saying all's well. + l, err := net.Listen("tcp", ":") + if err != nil { + return "", err + } + proxier.addServiceCommon(service, l) + _, port, err := net.SplitHostPort(l.Addr().String()) + return port, nil +} + +func (proxier Proxier) addServiceCommon(service string, l net.Listener) { + log.Printf("Listening for %s on %s", service, l.Addr().String()) + // If that succeeds, start the accepting loop. + go proxier.AcceptHandler(service, l) +} + func (proxier Proxier) OnUpdate(services []api.Service) { log.Printf("Received update notice: %+v", services) for _, service := range services { diff --git a/pkg/proxy/proxier_test.go b/pkg/proxy/proxier_test.go index f3eba3b6daa..7c917803252 100644 --- a/pkg/proxy/proxier_test.go +++ b/pkg/proxy/proxier_test.go @@ -25,37 +25,42 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api" ) -// a simple echoServer that only accept one connection -func echoServer(addr string) error { +// a simple echoServer that only accepts one connection. Returns port actually +// being listened on, or an error. +func echoServer(t *testing.T, addr string) (string, error) { l, err := net.Listen("tcp", addr) if err != nil { - return fmt.Errorf("failed to start echo service: %v", err) + return "", fmt.Errorf("failed to start echo service: %v", err) } - defer l.Close() - conn, err := l.Accept() - if err != nil { - return fmt.Errorf("failed to accept new conn to echo service: %v", err) - } - io.Copy(conn, conn) - conn.Close() - return nil + go func() { + defer l.Close() + conn, err := l.Accept() + if err != nil { + t.Errorf("failed to accept new conn to echo service: %v", err) + } + io.Copy(conn, conn) + conn.Close() + }() + _, port, err := net.SplitHostPort(l.Addr().String()) + return port, err } func TestProxy(t *testing.T) { - go func() { - if err := echoServer("127.0.0.1:2222"); err != nil { - t.Fatal(err) - } - }() + port, err := echoServer(t, "127.0.0.1:") + if err != nil { + t.Fatal(err) + } lb := NewLoadBalancerRR() - lb.OnUpdate([]api.Endpoints{{"echo", []string{"127.0.0.1:2222"}}}) + lb.OnUpdate([]api.Endpoints{{"echo", []string{net.JoinHostPort("127.0.0.1", port)}}}) p := NewProxier(lb) - if err := p.AddService("echo", 2223); err != nil { - t.Fatalf("error adding new service: %v", err) + + proxyPort, err := p.addServiceOnUnusedPort("echo") + if err != nil { + t.Fatalf("error adding new service: %#v", err) } - conn, err := net.Dial("tcp", "127.0.0.1:2223") + conn, err := net.Dial("tcp", net.JoinHostPort("127.0.0.1", proxyPort)) if err != nil { t.Fatalf("error connecting to proxy: %v", err) }