Disallow the use of SCAN search type

This change disallows the SCAN search type in our search requests used by search input and search transform.
Add tests for this and update the current tests to both detect SCAN and not use SCAN in valid tests.

Original commit: elastic/x-pack-elasticsearch@c9d61930c8
This commit is contained in:
Brian Murphy 2015-05-01 11:08:21 -04:00
parent 56e422b9e8
commit b57e887095
5 changed files with 64 additions and 15 deletions

View File

@ -208,6 +208,9 @@ public final class WatcherUtils {
searchRequest.types(Strings.delimitedListToStringArray(typesStr, ",", " \t"));
} else if (SEARCH_TYPE_FIELD.match(currentFieldName)) {
searchType = SearchType.fromString(parser.text().toLowerCase(Locale.ROOT));
if (searchType == SearchType.SCAN){
throw new SearchRequestParseException("could not read search request. value [" + searchType.name() + "] is not supported for field [" + SEARCH_TYPE_FIELD.getPreferredName() + "]" );
}
} else {
throw new SearchRequestParseException("could not read search request. unexpected string field [" + currentFieldName + "]");
}

View File

@ -39,10 +39,7 @@ import org.elasticsearch.watcher.watch.Watch;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import static org.elasticsearch.common.joda.time.DateTimeZone.UTC;
import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
@ -51,6 +48,7 @@ import static org.elasticsearch.index.query.FilterBuilders.rangeFilter;
import static org.elasticsearch.index.query.QueryBuilders.filteredQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource;
import static org.elasticsearch.watcher.test.WatcherTestUtils.getRandomSupportedSearchType;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
@ -178,13 +176,13 @@ public class SearchInputTests extends ElasticsearchIntegrationTest {
executeSearchInput(request).executedRequest();
}
@Test
public void testDifferentSearchType() throws Exception {
SearchSourceBuilder searchSourceBuilder = searchSource().query(
filteredQuery(matchQuery("event_type", "a"), rangeFilter("_timestamp").from("{{ctx.trigger.scheduled_time}}||-30s").to("{{ctx.trigger.triggered_time}}"))
);
SearchType searchType = randomFrom(SearchType.values());
SearchType searchType = getRandomSupportedSearchType();
SearchRequest request = client()
.prepareSearch()
.setSearchType(searchType)
@ -237,6 +235,26 @@ public class SearchInputTests extends ElasticsearchIntegrationTest {
assertEquals(SearchInput.TYPE, searchInput.type());
}
@Test(expected = SearchInputException.class)
public void testParser_ScanNotSupported() throws Exception {
SearchRequest request = client().prepareSearch()
.setSearchType(SearchType.SCAN)
.request()
.source(searchSource()
.query(filteredQuery(matchQuery("event_type", "a"), rangeFilter("_timestamp").from("{{ctx.trigger.scheduled_time}}||-30s").to("{{ctx.trigger.triggered_time}}"))));
XContentBuilder builder = jsonBuilder().value(new SearchInput(request, null));
XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes());
parser.nextToken();
SearchInputFactory factory = new SearchInputFactory(ImmutableSettings.EMPTY,
ScriptServiceProxy.of(internalCluster().getInstance(ScriptService.class)),
ClientProxy.of(client()));
factory.parseInput("_id", parser);
fail("expected a SearchInputException as search type SCAN should not be supported");
}
@Test(expected = SearchInputException.class)
public void testParser_Invalid() throws Exception {
SearchInputFactory factory = new SearchInputFactory(settingsBuilder().build(),

View File

@ -30,6 +30,7 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.elasticsearch.watcher.support.WatcherDateUtils.formatDate;
import static org.elasticsearch.watcher.support.WatcherUtils.DEFAULT_INDICES_OPTIONS;
import static org.elasticsearch.watcher.support.WatcherUtils.flattenModel;
import static org.elasticsearch.watcher.test.WatcherTestUtils.getRandomSupportedSearchType;
import static org.hamcrest.Matchers.*;
/**
@ -96,7 +97,7 @@ public class WatcherUtilsTests extends ElasticsearchTestCase {
}
expectedRequest.indicesOptions(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean(), WatcherUtils.DEFAULT_INDICES_OPTIONS));
expectedRequest.searchType(randomFrom(SearchType.values()));
expectedRequest.searchType(getRandomSupportedSearchType());
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.searchSource().query(QueryBuilders.matchAllQuery()).size(11);
XContentBuilder searchSourceJsonBuilder = jsonBuilder();
@ -173,7 +174,7 @@ public class WatcherUtilsTests extends ElasticsearchTestCase {
SearchType searchType = SearchType.DEFAULT;
if (randomBoolean()) {
searchType = randomFrom(SearchType.values());
searchType = getRandomSupportedSearchType();
builder.field("search_type", randomBoolean() ? searchType.name() : searchType.name().toLowerCase(Locale.ROOT));
}

View File

@ -6,6 +6,7 @@
package org.elasticsearch.watcher.test;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.collect.ImmutableMap;
@ -68,6 +69,7 @@ import java.util.*;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.search.builder.SearchSourceBuilder.searchSource;
import static org.elasticsearch.test.ElasticsearchTestCase.randomFrom;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ -211,4 +213,12 @@ public final class WatcherTestUtils {
return ScriptServiceProxy.of(new ScriptService(settings, new Environment(), engineServiceSet, new ResourceWatcherService(settings, tp), nodeSettingsService));
}
public static SearchType getRandomSupportedSearchType() {
Set<SearchType> searchTypes = new HashSet<>();
searchTypes.addAll(Arrays.asList(SearchType.values()));
searchTypes.remove(SearchType.SCAN);
return randomFrom(searchTypes.toArray(new SearchType[searchTypes.size()]));
}
}

View File

@ -42,10 +42,7 @@ import org.elasticsearch.watcher.watch.Watch;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import static org.elasticsearch.common.joda.time.DateTimeZone.UTC;
import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
@ -169,7 +166,7 @@ public class SearchTransformTests extends AbstractWatcherIntegrationTests {
@Test
public void testParser() throws Exception {
String[] indices = rarely() ? null : randomBoolean() ? new String[] { "idx" } : new String[] { "idx1", "idx2" };
SearchType searchType = randomBoolean() ? null : randomFrom(SearchType.values());
SearchType searchType = getRandomSupportedSearchType();
String templateName = randomBoolean() ? null : "template1";
ScriptService.ScriptType templateType = templateName != null && randomBoolean() ? randomFrom(ScriptService.ScriptType.values()) : null;
XContentBuilder builder = jsonBuilder().startObject();
@ -225,6 +222,27 @@ public class SearchTransformTests extends AbstractWatcherIntegrationTests {
assertThat(executable.transform().getRequest().source().toBytes(), equalTo(source.toBytes()));
}
@Test(expected = SearchTransformException.class)
public void testParser_ScanNotSupported() throws Exception {
SearchRequest request = client().prepareSearch()
.setSearchType(SearchType.SCAN)
.request()
.source(searchSource()
.query(filteredQuery(matchQuery("event_type", "a"), rangeFilter("_timestamp").from("{{ctx.trigger.scheduled_time}}||-30s").to("{{ctx.trigger.triggered_time}}"))));
XContentBuilder builder = jsonBuilder().value(new SearchTransform(request));
XContentParser parser = JsonXContent.jsonXContent.createParser(builder.bytes());
parser.nextToken();
SearchTransformFactory factory = new SearchTransformFactory(ImmutableSettings.EMPTY,
scriptService(),
ClientProxy.of(client()));
factory.parseTransform("_id", parser);
fail("expected a SearchTransformException as search type SCAN should not be supported");
}
@Test
public void testSearch_InlineTemplate() throws Exception {
final String templateQuery = "{\"query\":{\"filtered\":{\"query\":{\"match\":{\"event_type\":{\"query\":\"a\"," +
@ -250,7 +268,6 @@ public class SearchTransformTests extends AbstractWatcherIntegrationTests {
.setTemplateType(scriptType)
.request();
SearchTransform.Result executedResult = executeSearchTransform(request);
assertThat(executedResult.executedRequest().source().toUtf8(), equalTo(expectedQuery));
@ -310,7 +327,7 @@ public class SearchTransformTests extends AbstractWatcherIntegrationTests {
SearchSourceBuilder searchSourceBuilder = searchSource().query(
filteredQuery(matchQuery("event_type", "a"), rangeFilter("_timestamp").from("{{ctx.trigger.scheduled_time}}||-30s").to("{{ctx.trigger.triggered_time}}"))
);
SearchType searchType = randomFrom(SearchType.values());
SearchType searchType = getRandomSupportedSearchType();
SearchRequest request = client()
.prepareSearch()
.setSearchType(searchType)