// get performs an HTTPS GET to the specified path for a specific node. func get(t *testing.T, base, rel string) []byte { // TODO(bram) #2059: Remove retry logic. url := fmt.Sprintf("%s/%s", base, rel) for r := retry.Start(retryOptions); r.Next(); { resp, err := cluster.HTTPClient().Get(url) if err != nil { log.Infof("could not GET %s - %s", url, err) continue } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Infof("could not read body for %s - %s", url, err) continue } if resp.StatusCode != http.StatusOK { log.Infof("could not GET %s - statuscode: %d - body: %s", url, resp.StatusCode, body) continue } if log.V(1) { log.Infof("OK response from %s", url) } return body } t.Fatalf("There was an error retrieving %s", url) return []byte("") }
func postFreeze(c cluster.Cluster, freeze bool) (server.ClusterFreezeResponse, error) { httpClient := cluster.HTTPClient() httpClient.Timeout = 10 * time.Second var resp server.ClusterFreezeResponse err := postJSON(httpClient, c.URL(0), "/_admin/v1/cluster/freeze", &server.ClusterFreezeRequest{Freeze: freeze}, &resp) return resp, err }
func testAdminLossOfQuorumInner(t *testing.T, c cluster.Cluster, cfg cluster.TestConfig) { if c.NumNodes() < 2 { t.Logf("skipping test %s because given cluster has too few nodes", cfg.Name) return } // Get the ids for each node. idMap := make(map[int]string) for i := 0; i < c.NumNodes(); i++ { var detail details if err := getJSON(c.URL(i), "/_status/details/local", &detail); err != nil { t.Fatal(err) } idMap[i] = detail.NodeID.String() } // Leave only the first node alive. for i := 1; i < c.NumNodes(); i++ { if err := c.Kill(i); err != nil { t.Fatal(err) } } // Retrieve node statuses. var nodeStatuses interface{} if err := getJSON(c.URL(0), "/_status/nodes/", &nodeStatuses); err != nil { t.Fatal(err) } for i := 0; i < c.NumNodes(); i++ { var nodeStatus interface{} url := fmt.Sprintf("/_status/nodes/%s", idMap[i]) if err := getJSON(c.URL(0), url, &nodeStatus); err != nil { t.Fatal(err) } } // Retrieve time-series data. nowNanos := timeutil.Now().UnixNano() queryRequest := ts.TimeSeriesQueryRequest{ StartNanos: nowNanos - 10*time.Second.Nanoseconds(), EndNanos: nowNanos, Queries: []ts.Query{ {Name: "doesnt_matter", Sources: []string{}}, }, } var queryResponse ts.TimeSeriesQueryResponse if err := postJSON(cluster.HTTPClient(), c.URL(0), "/ts/query", &queryRequest, &queryResponse); err != nil { t.Fatal(err) } // TODO(cdo): When we're able to issue SQL queries without a quorum, test all // admin endpoints that issue SQL queries here. }
// getJSON retrieves the URL specified by the parameters and // and unmarshals the result into the supplied interface. func getJSON(url, rel string, v interface{}) error { resp, err := cluster.HTTPClient().Get(url + rel) if err != nil { if log.V(1) { log.Info(err) } return err } defer func() { _ = resp.Body.Close() }() b, err := ioutil.ReadAll(resp.Body) if err != nil { if log.V(1) { log.Info(err) } return err } return json.Unmarshal(b, v) }