diff --git a/ipam/http_test.go b/ipam/http_test.go index a42bf5ba..b8c972f0 100644 --- a/ipam/http_test.go +++ b/ipam/http_test.go @@ -4,7 +4,7 @@ import ( "fmt" "io" "io/ioutil" - "math/rand" + "net" "net/http" "strings" "testing" @@ -30,20 +30,25 @@ func doHTTP(method string, url string) (resp *http.Response, err error) { return http.DefaultClient.Do(req) } -func listenHTTP(port int, alloc *Allocator) { +func listenHTTP(alloc *Allocator) int { router := mux.NewRouter() router.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, fmt.Sprintln(alloc)) }) alloc.HandleHTTP(router) - srv := &http.Server{ - Addr: fmt.Sprintf(":%d", port), - Handler: router, - } - if err := srv.ListenAndServe(); err != nil { + httpListener, err := net.Listen("tcp", ":0") + if err != nil { common.Error.Fatal("Unable to create http listener: ", err) } + + go func() { + srv := &http.Server{Handler: router} + if err := srv.Serve(httpListener); err != nil { + common.Error.Fatal("Unable to serve http: ", err) + } + }() + return httpListener.Addr().(*net.TCPAddr).Port } func allocURL(port int, containerID string) string { @@ -61,11 +66,7 @@ func TestHttp(t *testing.T) { ) alloc := makeAllocatorWithMockGossip(t, "08:00:27:01:c3:9a", testCIDR1, 1) - port := rand.Intn(10000) + 32768 - fmt.Println("Http test on port", port) - go listenHTTP(port, alloc) - - time.Sleep(100 * time.Millisecond) // Allow for http server to get going + port := listenHTTP(alloc) alloc.claimRingForTesting() // Ask the http server for a new address @@ -98,9 +99,7 @@ func TestBadHttp(t *testing.T) { alloc := makeAllocatorWithMockGossip(t, "08:00:27:01:c3:9a", testCIDR1, 1) defer alloc.Stop() - port := rand.Intn(10000) + 32768 - fmt.Println("BadHttp test on port", port) - go listenHTTP(port, alloc) + port := listenHTTP(alloc) alloc.claimRingForTesting() cidr1 := HTTPPost(t, allocURL(port, containerID)) @@ -136,11 +135,7 @@ func impTestHTTPCancel(t *testing.T) { alloc := makeAllocatorWithMockGossip(t, "08:00:27:01:c3:9a", testCIDR1, 1) defer alloc.Stop() alloc.claimRingForTesting() - port := rand.Intn(10000) + 32768 - fmt.Println("Http test on port", port) - go listenHTTP(port, alloc) - - time.Sleep(100 * time.Millisecond) // Allow for http server to get going + port := listenHTTP(alloc) // Stop the alloc so nothing actually works unpause := alloc.pause() diff --git a/nameserver/http.go b/nameserver/http.go index 1f9a1e2b..64c0394a 100644 --- a/nameserver/http.go +++ b/nameserver/http.go @@ -17,7 +17,7 @@ func httpErrorAndLog(level *log.Logger, w http.ResponseWriter, msg string, level.Printf("[http] "+logmsg, logargs...) } -func ListenHTTP(version string, server *DNSServer, domain string, db Zone, port int) { +func ServeHTTP(listener net.Listener, version string, server *DNSServer, domain string, db Zone) { muxRouter := mux.NewRouter() @@ -90,8 +90,7 @@ func ListenHTTP(version string, server *DNSServer, domain string, db Zone, port http.Handle("/", muxRouter) - address := fmt.Sprintf(":%d", port) - if err := http.ListenAndServe(address, nil); err != nil { - Error.Fatal("[http] Unable to create http listener: ", err) + if err := http.Serve(listener, nil); err != nil { + Error.Fatal("[http] Unable to serve http: ", err) } } diff --git a/nameserver/http_test.go b/nameserver/http_test.go index b0175fe7..44e5bfc0 100644 --- a/nameserver/http_test.go +++ b/nameserver/http_test.go @@ -2,13 +2,11 @@ package nameserver import ( "fmt" - "math/rand" "net" "net/http" "net/url" "strings" "testing" - "time" wt "github.com/weaveworks/weave/testing" ) @@ -35,11 +33,13 @@ func TestHttp(t *testing.T) { wt.AssertNoErr(t, err) defer zone.Stop() - port := rand.Intn(10000) + 32768 - fmt.Println("Http test on port", port) - go ListenHTTP("", nil, testDomain, zone, port) + httpListener, err := net.Listen("tcp", ":0") + if err != nil { + t.Fatal("Unable to create http listener: ", err) + } - time.Sleep(100 * time.Millisecond) // Allow for http server to get going + port := httpListener.Addr().(*net.TCPAddr).Port + go ServeHTTP(httpListener, "", nil, testDomain, zone) // Ask the http server to add our test address into the database addrParts := strings.Split(testAddr1, "/") diff --git a/weavedns/main.go b/weavedns/main.go index bf0a89e3..0fc48523 100644 --- a/weavedns/main.go +++ b/weavedns/main.go @@ -127,8 +127,13 @@ func main() { Error.Fatal("[main] Failed to initialize the WeaveDNS server", err) } + httpListener, err := net.Listen("tcp", fmt.Sprintf(":%d", httpPort)) + if err != nil { + Error.Fatal("[main] Unable to create http listener: ", err) + } + go SignalHandlerLoop(srv) - go weavedns.ListenHTTP(version, srv, domain, zone, httpPort) + go weavedns.ServeHTTP(httpListener, version, srv, domain, zone) err = srv.Start() if err != nil {