12260: Test case for one unhealthy service.
authorTom Clegg <tclegg@veritasgenetics.com>
Mon, 2 Oct 2017 21:17:29 +0000 (17:17 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Mon, 2 Oct 2017 21:17:29 +0000 (17:17 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/health/aggregator.go
sdk/go/health/aggregator_test.go

index 699318735f8922dd52ea7940f7e2370117a864f8..5c46c1aa710ffc53c3cc7e5ada32c4421eae571d 100644 (file)
@@ -38,6 +38,7 @@ func (agg *Aggregator) setup() {
 }
 
 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})
index 2cb7122543c62eb1be5f7d1f28aced9406e9759c..eb6adc8a2e912fc0e43c8faa0f3013c9950a6f00 100644 (file)
@@ -4,6 +4,7 @@ import (
        "encoding/json"
        "net/http"
        "net/http/httptest"
+       "strings"
 
        "git.curoverse.com/arvados.git/sdk/go/arvados"
        "git.curoverse.com/arvados.git/sdk/go/arvadostest"
@@ -56,6 +57,29 @@ func (s *AggregatorSuite) TestEmptyConfig(c *check.C) {
        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{}
@@ -64,6 +88,14 @@ func (s *AggregatorSuite) checkError(c *check.C) {
        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{}