13619: Test error reporting when one of the federates fails
authorPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 28 Sep 2018 18:52:40 +0000 (14:52 -0400)
committerPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 28 Sep 2018 18:52:40 +0000 (14:52 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz@veritasgenetics.com>

lib/controller/federation.go
lib/controller/federation_test.go

index 7ea37edf7b4957228b3865fd6145352502fffd5b..1d4844486ca3b24f78d92b7ffe15e478250fca75 100644 (file)
@@ -120,6 +120,7 @@ type multiClusterQueryResponseCollector struct {
        responses []interface{}
        error     error
        kind      string
+       clusterID string
 }
 
 func (c *multiClusterQueryResponseCollector) collectResponse(resp *http.Response,
@@ -128,19 +129,20 @@ func (c *multiClusterQueryResponseCollector) collectResponse(resp *http.Response
                c.error = requestError
                return nil, nil
        }
+
        defer resp.Body.Close()
        loadInto := make(map[string]interface{})
        err = json.NewDecoder(resp.Body).Decode(&loadInto)
 
        if err == nil {
                if resp.StatusCode != http.StatusOK {
-                       c.error = fmt.Errorf("error %v", loadInto["errors"])
+                       c.error = fmt.Errorf("error fetching from %v (%v): %v", c.clusterID, resp.Status, loadInto["errors"])
                } else {
                        c.responses = loadInto["items"].([]interface{})
                        c.kind, _ = loadInto["kind"].(string)
                }
        } else {
-               c.error = err
+               c.error = fmt.Errorf("error fetching from %v (%v): %v", c.clusterID, resp.Status, err)
        }
 
        return nil, nil
@@ -170,7 +172,7 @@ func (h *genericFederatedRequestHandler) remoteQueryUUIDs(w http.ResponseWriter,
                enc := remoteParams.Encode()
                remoteReq.Body = ioutil.NopCloser(bytes.NewBufferString(enc))
 
-               rc := multiClusterQueryResponseCollector{}
+               rc := multiClusterQueryResponseCollector{clusterID: clusterID}
 
                if clusterID == h.handler.Cluster.ClusterID {
                        h.handler.localClusterRequest(w, &remoteReq,
index 9b04628135f9674d0b4ec13646920fcf785ab590..0b62ce5ff9e8881b40ea0d0b7f6239e2a6bc8ace 100644 (file)
@@ -637,6 +637,19 @@ func (s *FederationSuite) TestListMultiRemoteContainers(c *check.C) {
        c.Check(mp["zhome-xvhdp-cr5queuedcontnr"].ContainerImage, check.Equals, "")
 }
 
+func (s *FederationSuite) TestListMultiRemoteContainerError(c *check.C) {
+       defer s.localServiceReturns404(c).Close()
+       req := httptest.NewRequest("GET", fmt.Sprintf("/arvados/v1/containers?count=none&filters=%s&select=%s",
+               url.QueryEscape(fmt.Sprintf(`[["uuid", "in", ["%v", "zhome-xvhdp-cr5queuedcontnr"]]]`,
+                       arvadostest.QueuedContainerUUID)),
+               url.QueryEscape(`["uuid", "command"]`)),
+               nil)
+       req.Header.Set("Authorization", "Bearer "+arvadostest.ActiveToken)
+       resp := s.testRequest(req)
+       c.Check(resp.StatusCode, check.Equals, http.StatusBadGateway)
+       s.checkJSONErrorMatches(c, resp, `error fetching from zhome \(404 Not Found\): EOF`)
+}
+
 func (s *FederationSuite) TestListMultiRemoteContainersPaged(c *check.C) {
 
        callCount := 0