[ML] Tolerate a body without timestamp for get_buckets with a timestamp (elastic/x-pack-elasticsearch#2640)
When getting a single bucket, the get_buckets API can take a timestamp either in the body or in the URL. Prior to this change, if a timestamp was specified in the URL but a body not containing a timestamp was specified (either empty or containing other parameters like exclude_interim or sort) then it would cause a bad_request exception. This in turn causes problems for clients that cannot send a body when GETting and always send a body when POSTing. This change fixes get_buckets to always read any timestamp in the URL, even when a body is sent. relates elastic/x-pack-elasticsearch#2515 Original commit: elastic/x-pack-elasticsearch@5c23dd972e
This commit is contained in:
parent
feabaad46a
commit
90b2b74e76
|
@ -6,6 +6,7 @@
|
||||||
package org.elasticsearch.xpack.ml.rest.results;
|
package org.elasticsearch.xpack.ml.rest.results;
|
||||||
|
|
||||||
import org.elasticsearch.client.node.NodeClient;
|
import org.elasticsearch.client.node.NodeClient;
|
||||||
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.rest.BaseRestHandler;
|
import org.elasticsearch.rest.BaseRestHandler;
|
||||||
|
@ -45,20 +46,23 @@ public class RestGetBucketsAction extends BaseRestHandler {
|
||||||
@Override
|
@Override
|
||||||
protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException {
|
protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException {
|
||||||
String jobId = restRequest.param(Job.ID.getPreferredName());
|
String jobId = restRequest.param(Job.ID.getPreferredName());
|
||||||
|
String timestamp = restRequest.param(GetBucketsAction.Request.TIMESTAMP.getPreferredName());
|
||||||
final GetBucketsAction.Request request;
|
final GetBucketsAction.Request request;
|
||||||
if (restRequest.hasContentOrSourceParam()) {
|
if (restRequest.hasContentOrSourceParam()) {
|
||||||
XContentParser parser = restRequest.contentOrSourceParamParser();
|
XContentParser parser = restRequest.contentOrSourceParamParser();
|
||||||
request = GetBucketsAction.Request.parseRequest(jobId, parser);
|
request = GetBucketsAction.Request.parseRequest(jobId, parser);
|
||||||
|
|
||||||
|
// A timestamp in the URL overrides any timestamp that may also have been set in the body
|
||||||
|
if (!Strings.isNullOrEmpty(timestamp)) {
|
||||||
|
request.setTimestamp(timestamp);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
request = new GetBucketsAction.Request(jobId);
|
request = new GetBucketsAction.Request(jobId);
|
||||||
|
|
||||||
// Check if the REST param is set first so mutually exclusive
|
// Check if the REST param is set first so mutually exclusive
|
||||||
// options will only cause an error if set
|
// options will cause an error if set
|
||||||
if (restRequest.hasParam(GetBucketsAction.Request.TIMESTAMP.getPreferredName())) {
|
if (!Strings.isNullOrEmpty(timestamp)) {
|
||||||
String timestamp = restRequest.param(GetBucketsAction.Request.TIMESTAMP.getPreferredName());
|
request.setTimestamp(timestamp);
|
||||||
if (timestamp != null && !timestamp.isEmpty()) {
|
|
||||||
request.setTimestamp(timestamp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// multiple bucket options
|
// multiple bucket options
|
||||||
if (restRequest.hasParam(PageParams.FROM.getPreferredName()) || restRequest.hasParam(PageParams.SIZE.getPreferredName())) {
|
if (restRequest.hasParam(PageParams.FROM.getPreferredName()) || restRequest.hasParam(PageParams.SIZE.getPreferredName())) {
|
||||||
|
|
|
@ -170,6 +170,18 @@ setup:
|
||||||
- match: { buckets.0.job_id: jobs-get-result-buckets }
|
- match: { buckets.0.job_id: jobs-get-result-buckets }
|
||||||
- match: { buckets.0.result_type: bucket}
|
- match: { buckets.0.result_type: bucket}
|
||||||
|
|
||||||
|
---
|
||||||
|
"Test result single bucket api with empty body":
|
||||||
|
- do:
|
||||||
|
xpack.ml.get_buckets:
|
||||||
|
job_id: "jobs-get-result-buckets"
|
||||||
|
timestamp: "2016-06-01T00:00:00Z"
|
||||||
|
body: {}
|
||||||
|
|
||||||
|
- match: { buckets.0.timestamp: 1464739200000}
|
||||||
|
- match: { buckets.0.job_id: jobs-get-result-buckets }
|
||||||
|
- match: { buckets.0.result_type: bucket}
|
||||||
|
|
||||||
---
|
---
|
||||||
"Test mutually-exclusive params":
|
"Test mutually-exclusive params":
|
||||||
- do:
|
- do:
|
||||||
|
|
Loading…
Reference in New Issue