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 := httputil.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) } }
// PostJSONProto uses the supplied client to POST request to the URL specified by // the parameters and unmarshals the result into response. func PostJSONProto(ts TestServerInterface, path string, request, response proto.Message) error { httpClient, err := ts.GetHTTPClient() if err != nil { return err } return httputil.PostJSON(httpClient, ts.AdminURL()+path, request, response) }
func testAdminLossOfQuorumInner( ctx context.Context, 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 := httputil.GetJSON(cluster.HTTPClient, c.URL(ctx, i)+"/_status/details/local", &details); err != nil { t.Fatalf("failed to get local details from node %d: %s", i, err) } nodeIDs[i] = details.NodeID } // Leave only the first node alive. for i := 1; i < c.NumNodes(); i++ { if err := c.Kill(ctx, i); err != nil { t.Fatal(err) } } // Retrieve node statuses. var nodes serverpb.NodesResponse if err := httputil.GetJSON(cluster.HTTPClient, c.URL(ctx, 0)+"/_status/nodes", &nodes); err != nil { t.Fatal(err) } for _, nodeID := range nodeIDs { var nodeStatus status.NodeStatus if err := httputil.GetJSON(cluster.HTTPClient, c.URL(ctx, 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: "doesn't_matter", Sources: []string{}}, }, } var queryResponse tspb.TimeSeriesQueryResponse if err := httputil.PostJSON(cluster.HTTPClient, c.URL(ctx, 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. }