From c06d4d1b0018b6ba56918225b6b512143e6d6a57 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Fri, 21 Aug 2015 16:43:07 +0000 Subject: [PATCH] Add GET /ip handler to return all IPAM mappings. --- ipam/http.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ipam/http.go b/ipam/http.go index 04eb2088..d6e08e51 100644 --- a/ipam/http.go +++ b/ipam/http.go @@ -1,6 +1,7 @@ package ipam import ( + "encoding/json" "fmt" "net/http" @@ -127,6 +128,39 @@ func (alloc *Allocator) HandleHTTP(router *mux.Router, defaultSubnet address.CID writeAddresses(w, addrs) }) + router.Methods("GET").Path("/ip").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + type mapping struct { + ContainerID string `json:"containerid"` + Addrs []string `json:"addrs"` + } + + type mappings struct { + Owned []mapping `json:"owned"` + } + + resultChan := make(chan mappings) + alloc.actionChan <- func() { + ms := mappings{} + for containerid, d := range alloc.owned { + m := mapping{ + ContainerID: containerid, + Addrs: []string{}, + } + for _, addr := range d.Cidrs { + m.Addrs = append(m.Addrs, addr.String()) + } + ms.Owned = append(ms.Owned, m) + } + resultChan <- ms + } + ms := <-resultChan + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(ms); err != nil { + common.Log.Warningln("[allocator]:", err.Error()) + } + }) + router.Methods("POST").Path("/ip/{id}/{ip}/{prefixlen}").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) if subnet, ok := parseCIDR(w, vars["ip"]+"/"+vars["prefixlen"], true); ok {