Skip to content

Commit 1e83b29

Browse files
[7.7][ML] Get ML filters size should default to 100 (#54207) (#54279)
When get filters is called without setting the `size` paramter only up to 10 filters are returned. However, 100 filters should be returned. This commit fixes this and adds an integ test to guard it. It seems this was accidentally broken in #39976. Closes #54206 Backport of #54207
1 parent 7491f7f commit 1e83b29

File tree

9 files changed

+68
-80
lines changed

9 files changed

+68
-80
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/GetFiltersAction.java

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,18 @@
66
package org.elasticsearch.xpack.core.ml.action;
77

88
import org.elasticsearch.action.ActionRequestBuilder;
9-
import org.elasticsearch.action.ActionRequestValidationException;
109
import org.elasticsearch.action.ActionType;
1110
import org.elasticsearch.client.ElasticsearchClient;
1211
import org.elasticsearch.common.io.stream.StreamInput;
1312
import org.elasticsearch.common.xcontent.StatusToXContentObject;
1413
import org.elasticsearch.rest.RestStatus;
1514
import org.elasticsearch.xpack.core.action.AbstractGetResourcesRequest;
1615
import org.elasticsearch.xpack.core.action.AbstractGetResourcesResponse;
17-
import org.elasticsearch.xpack.core.action.util.PageParams;
1816
import org.elasticsearch.xpack.core.action.util.QueryPage;
1917
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
2018

2119
import java.io.IOException;
2220

23-
import static org.elasticsearch.action.ValidateActions.addValidationError;
24-
2521

2622
public class GetFiltersAction extends ActionType<GetFiltersAction.Response> {
2723

@@ -35,31 +31,16 @@ private GetFiltersAction() {
3531
public static class Request extends AbstractGetResourcesRequest {
3632

3733
public Request() {
38-
// Put our own defaults for backwards compatibility
39-
super(null, null, true);
40-
}
41-
42-
public Request(StreamInput in) throws IOException {
43-
super(in);
34+
setAllowNoResources(true);
4435
}
4536

46-
public void setFilterId(String filterId) {
37+
public Request(String filterId) {
4738
setResourceId(filterId);
39+
setAllowNoResources(true);
4840
}
4941

50-
public String getFilterId() {
51-
return getResourceId();
52-
}
53-
54-
@Override
55-
public ActionRequestValidationException validate() {
56-
ActionRequestValidationException validationException = null;
57-
if (getPageParams() != null && getResourceId() != null) {
58-
validationException = addValidationError("Params [" + PageParams.FROM.getPreferredName() +
59-
", " + PageParams.SIZE.getPreferredName() + "] are incompatible with ["
60-
+ MlFilter.ID.getPreferredName() + "]", validationException);
61-
}
62-
return validationException;
42+
public Request(StreamInput in) throws IOException {
43+
super(in);
6344
}
6445

6546
@Override

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/action/GetFiltersActionRequestTests.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,22 @@
77

88
import org.elasticsearch.common.io.stream.Writeable;
99
import org.elasticsearch.test.AbstractWireSerializingTestCase;
10-
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction.Request;
1110
import org.elasticsearch.xpack.core.action.util.PageParams;
11+
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction.Request;
1212

1313
public class GetFiltersActionRequestTests extends AbstractWireSerializingTestCase<Request> {
1414

1515

1616
@Override
1717
protected Request createTestInstance() {
18+
if (randomBoolean()) {
19+
return new Request(randomAlphaOfLength(10));
20+
}
1821
Request request = new Request();
1922
if (randomBoolean()) {
20-
request.setFilterId(randomAlphaOfLengthBetween(1, 20));
21-
} else {
22-
if (randomBoolean()) {
23-
int from = randomInt(10000);
24-
int size = randomInt(10000);
25-
request.setPageParams(new PageParams(from, size));
26-
}
23+
int from = randomInt(10000);
24+
int size = randomInt(10000);
25+
request.setPageParams(new PageParams(from, size));
2726
}
2827
return request;
2928
}

x-pack/plugin/ml/qa/ml-with-security/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ integTest.runner {
127127
'ml/filter_crud/Test create filter api with mismatching body ID',
128128
'ml/filter_crud/Test create filter given invalid filter_id',
129129
'ml/filter_crud/Test get filter API with bad ID',
130-
'ml/filter_crud/Test invalid param combinations',
131130
'ml/filter_crud/Test non-existing filter',
132131
'ml/filter_crud/Test update filter given remove item is not present',
133132
'ml/filter_crud/Test get all filter given index exists but no mapping for filter_id',

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeAutodetectIntegTestCase.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.elasticsearch.xpack.core.ml.action.PostDataAction;
4040
import org.elasticsearch.xpack.core.ml.action.PutCalendarAction;
4141
import org.elasticsearch.xpack.core.ml.action.PutDatafeedAction;
42-
import org.elasticsearch.xpack.core.ml.action.PutFilterAction;
4342
import org.elasticsearch.xpack.core.ml.action.PutJobAction;
4443
import org.elasticsearch.xpack.core.ml.action.RevertModelSnapshotAction;
4544
import org.elasticsearch.xpack.core.ml.action.StartDatafeedAction;
@@ -53,7 +52,6 @@
5352
import org.elasticsearch.xpack.core.ml.job.config.Job;
5453
import org.elasticsearch.xpack.core.ml.job.config.JobState;
5554
import org.elasticsearch.xpack.core.ml.job.config.JobUpdate;
56-
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
5755
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
5856
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.DataCounts;
5957
import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.ModelSnapshot;
@@ -353,10 +351,6 @@ protected List<Forecast> getForecasts(String jobId, ForecastRequestStats forecas
353351
return forecasts;
354352
}
355353

356-
protected PutFilterAction.Response putMlFilter(MlFilter filter) {
357-
return client().execute(PutFilterAction.INSTANCE, new PutFilterAction.Request(filter)).actionGet();
358-
}
359-
360354
protected PutCalendarAction.Response putCalendar(String calendarId, List<String> jobIds, String description) {
361355
PutCalendarAction.Request request = new PutCalendarAction.Request(new Calendar(calendarId, jobIds, description));
362356
return client().execute(PutCalendarAction.INSTANCE, request).actionGet();

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlNativeIntegTestCase.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@
3131
import org.elasticsearch.xpack.core.ml.MlMetadata;
3232
import org.elasticsearch.xpack.core.ml.MlTasks;
3333
import org.elasticsearch.xpack.core.ml.action.DeleteExpiredDataAction;
34+
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction;
3435
import org.elasticsearch.xpack.core.ml.action.OpenJobAction;
36+
import org.elasticsearch.xpack.core.ml.action.PutFilterAction;
3537
import org.elasticsearch.xpack.core.ml.action.StartDataFrameAnalyticsAction;
3638
import org.elasticsearch.xpack.core.ml.action.StartDatafeedAction;
3739
import org.elasticsearch.xpack.core.ml.datafeed.DatafeedState;
3840
import org.elasticsearch.xpack.core.ml.dataframe.DataFrameAnalyticsTaskState;
3941
import org.elasticsearch.xpack.core.ml.job.config.JobTaskState;
42+
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
4043
import org.elasticsearch.xpack.core.security.SecurityField;
4144
import org.elasticsearch.xpack.core.security.authc.TokenMetaData;
4245
import org.elasticsearch.xpack.ilm.IndexLifecycle;
@@ -136,6 +139,14 @@ protected DeleteExpiredDataAction.Response deleteExpiredData() throws Exception
136139
return response;
137140
}
138141

142+
protected PutFilterAction.Response putMlFilter(MlFilter filter) {
143+
return client().execute(PutFilterAction.INSTANCE, new PutFilterAction.Request(filter)).actionGet();
144+
}
145+
146+
protected GetFiltersAction.Response getMlFilters() {
147+
return client().execute(GetFiltersAction.INSTANCE, new GetFiltersAction.Request()).actionGet();
148+
}
149+
139150
@Override
140151
protected void ensureClusterStateConsistency() throws IOException {
141152
if (cluster() != null && cluster().size() > 0) {

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/autodetect/AutodetectProcessManager.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -357,21 +357,11 @@ public void onFailure(Exception e) {
357357
if (updateParams.getFilter() == null) {
358358
filterListener.onResponse(null);
359359
} else {
360-
GetFiltersAction.Request getFilterRequest = new GetFiltersAction.Request();
361-
getFilterRequest.setFilterId(updateParams.getFilter().getId());
362-
executeAsyncWithOrigin(client, ML_ORIGIN, GetFiltersAction.INSTANCE, getFilterRequest,
363-
new ActionListener<GetFiltersAction.Response>() {
364-
365-
@Override
366-
public void onResponse(GetFiltersAction.Response response) {
367-
filterListener.onResponse(response.getFilters().results().get(0));
368-
}
369-
370-
@Override
371-
public void onFailure(Exception e) {
372-
handler.accept(e);
373-
}
374-
});
360+
GetFiltersAction.Request getFilterRequest = new GetFiltersAction.Request(updateParams.getFilter().getId());
361+
executeAsyncWithOrigin(client, ML_ORIGIN, GetFiltersAction.INSTANCE, getFilterRequest, ActionListener.wrap(
362+
getFilterResponse -> filterListener.onResponse(getFilterResponse.getFilters().results().get(0)),
363+
handler::accept
364+
));
375365
}
376366
}
377367

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/rest/filter/RestGetFiltersAction.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,17 @@ public String getName() {
4747

4848
@Override
4949
protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient client) throws IOException {
50-
GetFiltersAction.Request getListRequest = new GetFiltersAction.Request();
50+
GetFiltersAction.Request request = new GetFiltersAction.Request();
5151
String filterId = restRequest.param(MlFilter.ID.getPreferredName());
5252
if (!Strings.isNullOrEmpty(filterId)) {
53-
getListRequest.setFilterId(filterId);
53+
request.setResourceId(filterId);
5454
}
5555
if (restRequest.hasParam(PageParams.FROM.getPreferredName()) || restRequest.hasParam(PageParams.SIZE.getPreferredName())) {
56-
getListRequest.setPageParams(
56+
request.setPageParams(
5757
new PageParams(restRequest.paramAsInt(PageParams.FROM.getPreferredName(), PageParams.DEFAULT_FROM),
5858
restRequest.paramAsInt(PageParams.SIZE.getPreferredName(), PageParams.DEFAULT_SIZE)));
5959
}
60-
return channel -> client.execute(GetFiltersAction.INSTANCE, getListRequest, new RestStatusToXContentListener<>(channel));
60+
return channel -> client.execute(GetFiltersAction.INSTANCE, request, new RestStatusToXContentListener<>(channel));
6161
}
6262

6363
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.ml.integration;
8+
9+
import org.elasticsearch.xpack.core.ml.action.GetFiltersAction;
10+
import org.elasticsearch.xpack.core.ml.action.PutFilterAction;
11+
import org.elasticsearch.xpack.core.ml.job.config.MlFilter;
12+
import org.elasticsearch.xpack.ml.MlSingleNodeTestCase;
13+
import org.junit.Before;
14+
15+
import static org.hamcrest.Matchers.equalTo;
16+
17+
public class MlFiltersIT extends MlSingleNodeTestCase {
18+
19+
@Before
20+
public void beforeTests() throws Exception {
21+
waitForMlTemplates();
22+
}
23+
24+
public void testGetFilters_ShouldReturnUpTo100ByDefault() {
25+
int filtersCount = randomIntBetween(11, 100);
26+
for (int i = 0; i < filtersCount; i++) {
27+
PutFilterAction.Request putFilterRequest = new PutFilterAction.Request(
28+
MlFilter.builder("filter-" + i).setItems("item-" + i).build());
29+
client().execute(PutFilterAction.INSTANCE, putFilterRequest).actionGet();
30+
}
31+
32+
GetFiltersAction.Response filters = client().execute(GetFiltersAction.INSTANCE, new GetFiltersAction.Request()).actionGet();
33+
assertThat((int) filters.getFilters().count(), equalTo(filtersCount));
34+
assertThat(filters.getFilters().results().size(), equalTo(filtersCount));
35+
}
36+
}

x-pack/plugin/src/test/resources/rest-api-spec/test/ml/filter_crud.yml

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -129,28 +129,6 @@ setup:
129129
description: "This filter has a description"
130130
items: ["123", "lmnop"]
131131

132-
---
133-
"Test invalid param combinations":
134-
135-
- do:
136-
catch: bad_request
137-
ml.get_filters:
138-
filter_id: "filter-foo"
139-
from: 0
140-
141-
- do:
142-
catch: bad_request
143-
ml.get_filters:
144-
filter_id: "filter-foo"
145-
size: 1
146-
147-
- do:
148-
catch: bad_request
149-
ml.get_filters:
150-
filter_id: "filter-foo"
151-
from: 0
152-
size: 1
153-
154132
---
155133
"Test create filter given invalid filter_id":
156134
- do:

0 commit comments

Comments
 (0)