Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Matthias Radestock committed 2015-06-02 18:46:30 +01:00
commit 5e7d1cd0eb
3 files changed
+37 -1

No files matched your search

+14
View File
@@ -208,6 +208,20 @@ func (alloc *Allocator) Allocate(ident string, cancelChan <-chan bool) (address.
return result.addr, result.err
}
func (alloc *Allocator) Lookup(ident string) (address.Address, error) {
resultChan := make(chan allocateResult)
alloc.actionChan <- func() {
addr, found := alloc.owned[ident]
if found {
resultChan <- allocateResult{addr: addr}
return
}
resultChan <- allocateResult{err: fmt.Errorf("lookup: no address found")}
}
result := <-resultChan
return result.addr, result.err
}
// Claim an address that we think we should own (Sync)
func (alloc *Allocator) Claim(ident string, addr address.Address, cancelChan <-chan bool) error {
resultChan := make(chan error)
+9
View File
@@ -33,6 +33,15 @@ func (alloc *Allocator) HandleHTTP(router *mux.Router) {
w.WriteHeader(204)
})
router.Methods("GET").Path("/ip/{id}").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
addr, err := alloc.Lookup(mux.Vars(r)["id"])
if err != nil {
http.NotFound(w, r)
return
}
fmt.Fprintf(w, "%s/%d", addr.String(), alloc.prefixLen)
})
router.Methods("POST").Path("/ip/{id}").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
closedChan := w.(http.CloseNotifier).CloseNotify()
ident := mux.Vars(r)["id"]
+14 -1
View File
@@ -25,6 +25,14 @@ func HTTPPost(t *testing.T, url string) string {
return string(body)
}
func HTTPGet(t *testing.T, url string) string {
resp, err := http.Get(url)
wt.AssertNoErr(t, err)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
return string(body)
}
func doHTTP(method string, url string) (resp *http.Response, err error) {
req, _ := http.NewRequest(method, url, nil)
return http.DefaultClient.Do(req)
@@ -72,6 +80,8 @@ func TestHttp(t *testing.T) {
// Ask the http server for a new address
cidr1 := HTTPPost(t, allocURL(port, containerID))
wt.AssertEqualString(t, cidr1, testAddr1+netSuffix, "address")
check := HTTPGet(t, allocURL(port, containerID))
wt.AssertEqualString(t, check, cidr1, "address")
// Ask the http server for another address and check it's different
cidr2 := HTTPPost(t, allocURL(port, container2))
@@ -80,9 +90,12 @@ func TestHttp(t *testing.T) {
// Ask for the first container again and we should get the same address again
cidr1a := HTTPPost(t, allocURL(port, containerID))
wt.AssertEqualString(t, cidr1a, testAddr1+netSuffix, "address")
// Now free the first one, and we should get it back when we ask
doHTTP("DELETE", allocURL(port, containerID))
resp, err := doHTTP("GET", allocURL(port, containerID))
wt.AssertNoErr(t, err)
wt.AssertStatus(t, resp.StatusCode, http.StatusNotFound, "http response")
cidr3 := HTTPPost(t, allocURL(port, container3))
wt.AssertEqualString(t, cidr3, testAddr1+netSuffix, "address")