14287: Add "kind" key to controller responses.
authorTom Clegg <tclegg@veritasgenetics.com>
Fri, 10 May 2019 20:00:37 +0000 (16:00 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Mon, 17 Jun 2019 13:54:39 +0000 (09:54 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

lib/controller/router/response.go
lib/controller/router/router_test.go

index ddbeee666ff13f3ce4bd6b0a601c2774efc46622..9a2891140155f80bb01a1c29f3250417077bda67 100644 (file)
@@ -6,7 +6,9 @@ package router
 
 import (
        "encoding/json"
+       "fmt"
        "net/http"
+       "regexp"
        "strings"
        "time"
 
@@ -68,6 +70,7 @@ func (rtr *router) sendResponse(w http.ResponseWriter, resp interface{}, opts re
                        tmp[k] = t.Format(rfc3339NanoFixed)
                }
        }
+       tmp["kind"] = kind(resp)
        json.NewEncoder(w).Encode(tmp)
 }
 
@@ -78,3 +81,12 @@ func (rtr *router) sendError(w http.ResponseWriter, err error) {
        }
        httpserver.Error(w, err.Error(), code)
 }
+
+var mungeKind = regexp.MustCompile(`\..`)
+
+func kind(resp interface{}) string {
+       return mungeKind.ReplaceAllStringFunc(fmt.Sprintf("%T", resp), func(s string) string {
+               // "arvados.CollectionList" => "arvados#collectionList"
+               return "#" + strings.ToLower(s[1:])
+       })
+}
index b3d5c9add6331e6800f707afa08866cc4be34696..9664907dae5e62e215960eabac2543fd0463c6d1 100644 (file)
@@ -64,18 +64,24 @@ func (s *RouterSuite) TestCollectionParams(c *check.C) {
        _, rw, jresp := s.doRequest(c, token, "GET", `/arvados/v1/collections?include_trash=true`, nil, nil)
        c.Check(rw.Code, check.Equals, http.StatusOK)
        c.Check(jresp["items_available"], check.FitsTypeOf, float64(0))
+       c.Check(jresp["kind"], check.Equals, "arvados#collectionList")
+       c.Check(jresp["items"].([]interface{})[0].(map[string]interface{})["kind"], check.Equals, "arvados#collection")
 
        _, rw, jresp = s.doRequest(c, token, "GET", `/arvados/v1/collections`, nil, bytes.NewBufferString(`{"include_trash":true}`))
        c.Check(rw.Code, check.Equals, http.StatusOK)
        c.Check(jresp["items"], check.FitsTypeOf, []interface{}{})
+       c.Check(jresp["kind"], check.Equals, "arvados#collectionList")
+       c.Check(jresp["items"].([]interface{})[0].(map[string]interface{})["kind"], check.Equals, "arvados#collection")
 
        _, rw, jresp = s.doRequest(c, token, "POST", `/arvados/v1/collections`, http.Header{"Content-Type": {"application/x-www-form-urlencoded"}}, bytes.NewBufferString(`ensure_unique_name=true`))
        c.Check(rw.Code, check.Equals, http.StatusOK)
        c.Check(jresp["uuid"], check.FitsTypeOf, "")
+       c.Check(jresp["kind"], check.Equals, "arvados#collection")
 
        _, rw, jresp = s.doRequest(c, token, "POST", `/arvados/v1/collections?ensure_unique_name=true`, nil, nil)
        c.Check(rw.Code, check.Equals, http.StatusOK)
        c.Check(jresp["uuid"], check.FitsTypeOf, "")
+       c.Check(jresp["kind"], check.Equals, "arvados#collection")
 }
 
 func (s *RouterSuite) TestContainerList(c *check.C) {
@@ -165,6 +171,7 @@ func (s *RouterSuite) TestSelectParam(c *check.C) {
                _, rw, resp := s.doRequest(c, token, "GET", "/arvados/v1/containers/"+uuid+"?select="+string(j), nil, nil)
                c.Check(rw.Code, check.Equals, http.StatusOK)
 
+               c.Check(resp["kind"], check.Equals, "arvados#container")
                c.Check(resp["uuid"], check.HasLen, 27)
                c.Check(resp["command"], check.HasLen, 2)
                c.Check(resp["mounts"], check.IsNil)