}
func (agg *Aggregator) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
+ agg.setupOnce.Do(agg.setup)
sendErr := func(statusCode int, err error) {
resp.WriteHeader(statusCode)
json.NewEncoder(resp).Encode(map[string]interface{}{"error": err})
"encoding/json"
"net/http"
"net/http/httptest"
+ "strings"
"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/arvadostest"
s.checkOK(c)
}
+type unhealthyHandler struct{}
+
+func (*unhealthyHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
+ resp.Write([]byte(`{"health":"ERROR"}`))
+}
+
+func (s *AggregatorSuite) TestUnhealthy(c *check.C) {
+ srv := httptest.NewServer(&unhealthyHandler{})
+ defer srv.Close()
+
+ var port string
+ if parts := strings.Split(srv.URL, ":"); len(parts) < 3 {
+ panic(srv.URL)
+ } else {
+ port = parts[len(parts)-1]
+ }
+ s.handler.Config.Clusters["zzzzz"].SystemNodes["localhost"] = arvados.SystemNode{
+ Keepstore: arvados.Keepstore{Listen: ":" + port},
+ }
+ s.handler.ServeHTTP(s.resp, s.req)
+ s.checkUnhealthy(c)
+}
+
func (s *AggregatorSuite) checkError(c *check.C) {
c.Check(s.resp.Code, check.Not(check.Equals), http.StatusOK)
var body map[string]interface{}
c.Check(body["health"], check.Not(check.Equals), "OK")
}
+func (s *AggregatorSuite) checkUnhealthy(c *check.C) {
+ c.Check(s.resp.Code, check.Equals, http.StatusOK)
+ var body map[string]interface{}
+ err := json.NewDecoder(s.resp.Body).Decode(&body)
+ c.Check(err, check.IsNil)
+ c.Check(body["health"], check.Equals, "ERROR")
+}
+
func (s *AggregatorSuite) checkOK(c *check.C) {
c.Check(s.resp.Code, check.Equals, http.StatusOK)
var body map[string]interface{}