func TestSpanStatsResponse(t *testing.T) { defer leaktest.AfterTest(t)() ts := startServer(t) defer ts.Stopper().Stop() httpClient, err := ts.GetHTTPClient() if err != nil { t.Fatal(err) } var response serverpb.SpanStatsResponse request := serverpb.SpanStatsRequest{ NodeID: "1", StartKey: []byte(roachpb.RKeyMin), EndKey: []byte(roachpb.RKeyMax), } url := ts.AdminURL() + statusPrefix + "span" if err := util.PostJSON(httpClient, url, &request, &response); err != nil { t.Fatal(err) } if a, e := int(response.RangeCount), ExpectedInitialRangeCount(); a != e { t.Errorf("expected %d ranges, found %d", e, a) } }
// apiPost issues a POST to the provided server using the given API path and // request body, marshalling the result into the v parameter. func apiPost(s *TestServer, path, body string, v interface{}) error { apiPath := apiEndpoint + path client, err := s.Ctx.GetHTTPClient() if err != nil { return err } return util.PostJSON(client, s.Ctx.HTTPRequestScheme(), s.HTTPAddr(), apiPath, body, v) }
// apiPost issues a POST to the provided server using the given API path and // request, marshalling the result into response. func apiPost(s TestServer, path string, request, response proto.Message) error { apiPath := apiEndpoint + path client, err := s.Ctx.GetHTTPClient() if err != nil { return err } return util.PostJSON(client, s.Ctx.AdminURL()+apiPath, request, response) }
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. nodeIDs := make([]roachpb.NodeID, c.NumNodes()) for i := 0; i < c.NumNodes(); i++ { var details serverpb.DetailsResponse if err := util.GetJSON(cluster.HTTPClient, c.URL(i)+"/_status/details/local", &details); err != nil { t.Fatal(err) } nodeIDs[i] = details.NodeID } // 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 nodes serverpb.NodesResponse if err := util.GetJSON(cluster.HTTPClient, c.URL(0)+"/_status/nodes", &nodes); err != nil { t.Fatal(err) } for _, nodeID := range nodeIDs { var nodeStatus status.NodeStatus if err := util.GetJSON(cluster.HTTPClient, c.URL(0)+"/_status/nodes/"+strconv.Itoa(int(nodeID)), &nodeStatus); err != nil { t.Fatal(err) } } // Retrieve time-series data. nowNanos := timeutil.Now().UnixNano() queryRequest := tspb.TimeSeriesQueryRequest{ StartNanos: nowNanos - 10*time.Second.Nanoseconds(), EndNanos: nowNanos, Queries: []tspb.Query{ {Name: "doesnt_matter", Sources: []string{}}, }, } var queryResponse tspb.TimeSeriesQueryResponse if err := util.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. }
func postFreeze(c cluster.Cluster, freeze bool, timeout time.Duration) (server.ClusterFreezeResponse, error) { httpClient := cluster.HTTPClient httpClient.Timeout = timeout var resp server.ClusterFreezeResponse err := util.PostJSON( httpClient, c.URL(0)+"/_admin/v1/cluster/freeze", &server.ClusterFreezeRequest{Freeze: freeze}, &resp, ) return resp, err }