Scripts: Remove ClusterState from compile api

Stored scripts are pulled from the cluster state, and the current api
requires passing the ClusterState on each call to compile. However, this
means every user of the ScriptService needs to depend on the
ClusterService. Instead, this change makes the ScriptService a
ClusterStateListener. It also simplifies tests a lot, as they no longer
need to create fake cluster states (except when testing stored scripts).
This commit is contained in:
Ryan Ernst 2016-06-28 13:20:00 -07:00
parent 6d52cec2a0
commit ecf6101798
31 changed files with 108 additions and 126 deletions

View File

@ -251,8 +251,7 @@ public class UpdateHelper extends AbstractComponent {
private Map<String, Object> executeScript(Script script, Map<String, Object> ctx) { private Map<String, Object> executeScript(Script script, Map<String, Object> ctx) {
try { try {
if (scriptService != null) { if (scriptService != null) {
ClusterState state = clusterService.state(); ExecutableScript executableScript = scriptService.executable(script, ScriptContext.Standard.UPDATE, Collections.emptyMap());
ExecutableScript executableScript = scriptService.executable(script, ScriptContext.Standard.UPDATE, Collections.emptyMap(), state);
executableScript.setNextVar("ctx", ctx); executableScript.setNextVar("ctx", ctx);
executableScript.run(); executableScript.run();
// we need to unwrap the ctx... // we need to unwrap the ctx...

View File

@ -504,7 +504,7 @@ public final class InnerHitBuilder extends ToXContentToBytes implements Writeabl
if (scriptFields != null) { if (scriptFields != null) {
for (ScriptField field : scriptFields) { for (ScriptField field : scriptFields) {
SearchScript searchScript = innerHitsContext.scriptService().search(innerHitsContext.lookup(), field.script(), SearchScript searchScript = innerHitsContext.scriptService().search(innerHitsContext.lookup(), field.script(),
ScriptContext.Standard.SEARCH, Collections.emptyMap(), context.getClusterState()); ScriptContext.Standard.SEARCH, Collections.emptyMap());
innerHitsContext.scriptFields().add(new org.elasticsearch.search.fetch.script.ScriptFieldsContext.ScriptField( innerHitsContext.scriptFields().add(new org.elasticsearch.search.fetch.script.ScriptFieldsContext.ScriptField(
field.fieldName(), searchScript, field.ignoreFailure())); field.fieldName(), searchScript, field.ignoreFailure()));
} }

View File

@ -157,7 +157,7 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
@Override @Override
protected Query doToQuery(QueryShardContext context) throws IOException { protected Query doToQuery(QueryShardContext context) throws IOException {
return new ScriptQuery(script, context.getScriptService(), context.lookup(), context.getClusterState()); return new ScriptQuery(script, context.getScriptService(), context.lookup());
} }
static class ScriptQuery extends Query { static class ScriptQuery extends Query {
@ -166,9 +166,9 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder<ScriptQueryBuilder>
private final SearchScript searchScript; private final SearchScript searchScript;
public ScriptQuery(Script script, ScriptService scriptService, SearchLookup searchLookup, ClusterState state) { public ScriptQuery(Script script, ScriptService scriptService, SearchLookup searchLookup) {
this.script = script; this.script = script;
this.searchScript = scriptService.search(searchLookup, script, ScriptContext.Standard.SEARCH, Collections.emptyMap(), state); this.searchScript = scriptService.search(searchLookup, script, ScriptContext.Standard.SEARCH, Collections.emptyMap());
} }
@Override @Override

View File

@ -177,7 +177,7 @@ public class TemplateQueryBuilder extends AbstractQueryBuilder<TemplateQueryBuil
@Override @Override
protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws IOException { protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws IOException {
ExecutableScript executable = queryRewriteContext.getScriptService().executable(template, ExecutableScript executable = queryRewriteContext.getScriptService().executable(template,
ScriptContext.Standard.SEARCH, Collections.emptyMap(), queryRewriteContext.getClusterState()); ScriptContext.Standard.SEARCH, Collections.emptyMap());
BytesReference querySource = (BytesReference) executable.run(); BytesReference querySource = (BytesReference) executable.run();
try (XContentParser qSourceParser = XContentFactory.xContent(querySource).createParser(querySource)) { try (XContentParser qSourceParser = XContentFactory.xContent(querySource).createParser(querySource)) {
final QueryParseContext queryParseContext = queryRewriteContext.newParseContext(qSourceParser); final QueryParseContext queryParseContext = queryRewriteContext.newParseContext(qSourceParser);

View File

@ -103,7 +103,7 @@ public class ScriptScoreFunctionBuilder extends ScoreFunctionBuilder<ScriptScore
protected ScoreFunction doToFunction(QueryShardContext context) { protected ScoreFunction doToFunction(QueryShardContext context) {
try { try {
SearchScript searchScript = context.getScriptService().search(context.lookup(), script, ScriptContext.Standard.SEARCH, SearchScript searchScript = context.getScriptService().search(context.lookup(), script, ScriptContext.Standard.SEARCH,
Collections.emptyMap(), context.getClusterState()); Collections.emptyMap());
return new ScriptScoreFunction(script, searchScript); return new ScriptScoreFunction(script, searchScript);
} catch (Exception e) { } catch (Exception e) {
throw new QueryShardException(context, "script_score: the script could not be loaded", e); throw new QueryShardException(context, "script_score: the script could not be loaded", e);

View File

@ -46,8 +46,7 @@ public class InternalTemplateService implements TemplateService {
CompiledScript compiledScript = scriptService.compile( CompiledScript compiledScript = scriptService.compile(
script, script,
ScriptContext.Standard.INGEST, ScriptContext.Standard.INGEST,
Collections.emptyMap(), Collections.emptyMap());
null); // null == OK, because ingest templates are only inline templates.
return new Template() { return new Template() {
@Override @Override
public String execute(Map<String, Object> model) { public String execute(Map<String, Object> model) {

View File

@ -246,6 +246,7 @@ public class Node implements Closeable {
resourcesToClose.add(resourceWatcherService); resourcesToClose.add(resourceWatcherService);
final NetworkService networkService = new NetworkService(settings); final NetworkService networkService = new NetworkService(settings);
final ClusterService clusterService = new ClusterService(settings, settingsModule.getClusterSettings(), threadPool); final ClusterService clusterService = new ClusterService(settings, settingsModule.getClusterSettings(), threadPool);
clusterService.add(scriptModule.getScriptService());
resourcesToClose.add(clusterService); resourcesToClose.add(clusterService);
final TribeService tribeService = new TribeService(settings, clusterService); final TribeService tribeService = new TribeService(settings, clusterService);
resourcesToClose.add(tribeService); resourcesToClose.add(tribeService);

View File

@ -28,7 +28,9 @@ import org.elasticsearch.action.admin.cluster.storedscripts.GetStoredScriptReque
import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest; import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptRequest;
import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptResponse; import org.elasticsearch.action.admin.cluster.storedscripts.PutStoredScriptResponse;
import org.elasticsearch.cluster.AckedClusterStateUpdateTask; import org.elasticsearch.cluster.AckedClusterStateUpdateTask;
import org.elasticsearch.cluster.ClusterChangedEvent;
import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.ClusterStateListener;
import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseField;
@ -75,7 +77,7 @@ import java.util.concurrent.ConcurrentMap;
import static java.util.Collections.unmodifiableMap; import static java.util.Collections.unmodifiableMap;
public class ScriptService extends AbstractComponent implements Closeable { public class ScriptService extends AbstractComponent implements Closeable, ClusterStateListener {
static final String DISABLE_DYNAMIC_SCRIPTING_SETTING = "script.disable_dynamic"; static final String DISABLE_DYNAMIC_SCRIPTING_SETTING = "script.disable_dynamic";
@ -105,6 +107,8 @@ public class ScriptService extends AbstractComponent implements Closeable {
private final ParseFieldMatcher parseFieldMatcher; private final ParseFieldMatcher parseFieldMatcher;
private final ScriptMetrics scriptMetrics = new ScriptMetrics(); private final ScriptMetrics scriptMetrics = new ScriptMetrics();
private ClusterState clusterState;
/** /**
* @deprecated Use {@link org.elasticsearch.script.Script.ScriptField} instead. This should be removed in * @deprecated Use {@link org.elasticsearch.script.Script.ScriptField} instead. This should be removed in
* 2.0 * 2.0
@ -217,7 +221,7 @@ public class ScriptService extends AbstractComponent implements Closeable {
/** /**
* Checks if a script can be executed and compiles it if needed, or returns the previously compiled and cached script. * Checks if a script can be executed and compiles it if needed, or returns the previously compiled and cached script.
*/ */
public CompiledScript compile(Script script, ScriptContext scriptContext, Map<String, String> params, ClusterState state) { public CompiledScript compile(Script script, ScriptContext scriptContext, Map<String, String> params) {
if (script == null) { if (script == null) {
throw new IllegalArgumentException("The parameter script (Script) must not be null."); throw new IllegalArgumentException("The parameter script (Script) must not be null.");
} }
@ -245,14 +249,14 @@ public class ScriptService extends AbstractComponent implements Closeable {
" operation [" + scriptContext.getKey() + "] and lang [" + lang + "] are not supported"); " operation [" + scriptContext.getKey() + "] and lang [" + lang + "] are not supported");
} }
return compileInternal(script, params, state); return compileInternal(script, params);
} }
/** /**
* Compiles a script straight-away, or returns the previously compiled and cached script, * Compiles a script straight-away, or returns the previously compiled and cached script,
* without checking if it can be executed based on settings. * without checking if it can be executed based on settings.
*/ */
CompiledScript compileInternal(Script script, Map<String, String> params, ClusterState state) { CompiledScript compileInternal(Script script, Map<String, String> params) {
if (script == null) { if (script == null) {
throw new IllegalArgumentException("The parameter script (Script) must not be null."); throw new IllegalArgumentException("The parameter script (Script) must not be null.");
} }
@ -289,7 +293,7 @@ public class ScriptService extends AbstractComponent implements Closeable {
//the script has been updated in the index since the last look up. //the script has been updated in the index since the last look up.
final IndexedScript indexedScript = new IndexedScript(lang, name); final IndexedScript indexedScript = new IndexedScript(lang, name);
name = indexedScript.id; name = indexedScript.id;
code = getScriptFromClusterState(state, indexedScript.lang, indexedScript.id); code = getScriptFromClusterState(indexedScript.lang, indexedScript.id);
} }
CacheKey cacheKey = new CacheKey(scriptEngineService, type == ScriptType.INLINE ? null : name, code, params); CacheKey cacheKey = new CacheKey(scriptEngineService, type == ScriptType.INLINE ? null : name, code, params);
@ -328,9 +332,9 @@ public class ScriptService extends AbstractComponent implements Closeable {
return scriptLang; return scriptLang;
} }
String getScriptFromClusterState(ClusterState state, String scriptLang, String id) { String getScriptFromClusterState(String scriptLang, String id) {
scriptLang = validateScriptLanguage(scriptLang); scriptLang = validateScriptLanguage(scriptLang);
ScriptMetaData scriptMetadata = state.metaData().custom(ScriptMetaData.TYPE); ScriptMetaData scriptMetadata = clusterState.metaData().custom(ScriptMetaData.TYPE);
if (scriptMetadata == null) { if (scriptMetadata == null) {
throw new ResourceNotFoundException("Unable to find script [" + scriptLang + "/" + id + "] in cluster state"); throw new ResourceNotFoundException("Unable to find script [" + scriptLang + "/" + id + "] in cluster state");
} }
@ -443,8 +447,8 @@ public class ScriptService extends AbstractComponent implements Closeable {
/** /**
* Compiles (or retrieves from cache) and executes the provided script * Compiles (or retrieves from cache) and executes the provided script
*/ */
public ExecutableScript executable(Script script, ScriptContext scriptContext, Map<String, String> params, ClusterState state) { public ExecutableScript executable(Script script, ScriptContext scriptContext, Map<String, String> params) {
return executable(compile(script, scriptContext, params, state), script.getParams()); return executable(compile(script, scriptContext, params), script.getParams());
} }
/** /**
@ -457,8 +461,8 @@ public class ScriptService extends AbstractComponent implements Closeable {
/** /**
* Compiles (or retrieves from cache) and executes the provided search script * Compiles (or retrieves from cache) and executes the provided search script
*/ */
public SearchScript search(SearchLookup lookup, Script script, ScriptContext scriptContext, Map<String, String> params, ClusterState state) { public SearchScript search(SearchLookup lookup, Script script, ScriptContext scriptContext, Map<String, String> params) {
CompiledScript compiledScript = compile(script, scriptContext, params, state); CompiledScript compiledScript = compile(script, scriptContext, params);
return getScriptEngineServiceForLang(compiledScript.lang()).search(compiledScript, lookup, script.getParams()); return getScriptEngineServiceForLang(compiledScript.lang()).search(compiledScript, lookup, script.getParams());
} }
@ -496,6 +500,11 @@ public class ScriptService extends AbstractComponent implements Closeable {
} }
} }
@Override
public void clusterChanged(ClusterChangedEvent event) {
clusterState = event.state();
}
/** /**
* A small listener for the script cache that calls each * A small listener for the script cache that calls each
* {@code ScriptEngineService}'s {@code scriptRemoved} method when the * {@code ScriptEngineService}'s {@code scriptRemoved} method when the

View File

@ -740,7 +740,7 @@ public class SearchService extends AbstractLifecycleComponent<SearchService> imp
if (source.scriptFields() != null) { if (source.scriptFields() != null) {
for (org.elasticsearch.search.builder.SearchSourceBuilder.ScriptField field : source.scriptFields()) { for (org.elasticsearch.search.builder.SearchSourceBuilder.ScriptField field : source.scriptFields()) {
SearchScript searchScript = context.scriptService().search(context.lookup(), field.script(), ScriptContext.Standard.SEARCH, SearchScript searchScript = context.scriptService().search(context.lookup(), field.script(), ScriptContext.Standard.SEARCH,
Collections.emptyMap(), context.getQueryShardContext().getClusterState()); Collections.emptyMap());
context.scriptFields().add(new ScriptField(field.fieldName(), searchScript, field.ignoreFailure())); context.scriptFields().add(new ScriptField(field.fieldName(), searchScript, field.ignoreFailure()));
} }
} }

View File

@ -79,16 +79,16 @@ public class ScriptHeuristic extends SignificanceHeuristic {
@Override @Override
public void initialize(InternalAggregation.ReduceContext context) { public void initialize(InternalAggregation.ReduceContext context) {
initialize(context.scriptService(), context.clusterState()); initialize(context.scriptService());
} }
@Override @Override
public void initialize(SearchContext context) { public void initialize(SearchContext context) {
initialize(context.scriptService(), context.getQueryShardContext().getClusterState()); initialize(context.scriptService());
} }
public void initialize(ScriptService scriptService, ClusterState state) { public void initialize(ScriptService scriptService) {
searchScript = scriptService.executable(script, ScriptContext.Standard.AGGS, Collections.emptyMap(), state); searchScript = scriptService.executable(script, ScriptContext.Standard.AGGS, Collections.emptyMap());
searchScript.setNextVar("_subset_freq", subsetDfHolder); searchScript.setNextVar("_subset_freq", subsetDfHolder);
searchScript.setNextVar("_subset_size", subsetSizeHolder); searchScript.setNextVar("_subset_size", subsetSizeHolder);
searchScript.setNextVar("_superset_freq", supersetDfHolder); searchScript.setNextVar("_superset_freq", supersetDfHolder);

View File

@ -92,7 +92,7 @@ public class InternalScriptedMetric extends InternalMetricsAggregation implement
vars.putAll(firstAggregation.reduceScript.getParams()); vars.putAll(firstAggregation.reduceScript.getParams());
} }
CompiledScript compiledScript = reduceContext.scriptService().compile(firstAggregation.reduceScript, CompiledScript compiledScript = reduceContext.scriptService().compile(firstAggregation.reduceScript,
ScriptContext.Standard.AGGS, Collections.emptyMap(), reduceContext.clusterState()); ScriptContext.Standard.AGGS, Collections.emptyMap());
ExecutableScript script = reduceContext.scriptService().executable(compiledScript, vars); ExecutableScript script = reduceContext.scriptService().executable(compiledScript, vars);
aggregation = script.run(); aggregation = script.run();
} else { } else {

View File

@ -54,11 +54,11 @@ public class ScriptedMetricAggregator extends MetricsAggregator {
ScriptService scriptService = context.searchContext().scriptService(); ScriptService scriptService = context.searchContext().scriptService();
ClusterState state = context.searchContext().getQueryShardContext().getClusterState(); ClusterState state = context.searchContext().getQueryShardContext().getClusterState();
if (initScript != null) { if (initScript != null) {
scriptService.executable(initScript, ScriptContext.Standard.AGGS, Collections.emptyMap(), state).run(); scriptService.executable(initScript, ScriptContext.Standard.AGGS, Collections.emptyMap()).run();
} }
this.mapScript = scriptService.search(context.searchContext().lookup(), mapScript, ScriptContext.Standard.AGGS, Collections.emptyMap(), state); this.mapScript = scriptService.search(context.searchContext().lookup(), mapScript, ScriptContext.Standard.AGGS, Collections.emptyMap());
if (combineScript != null) { if (combineScript != null) {
this.combineScript = scriptService.executable(combineScript, ScriptContext.Standard.AGGS, Collections.emptyMap(), state); this.combineScript = scriptService.executable(combineScript, ScriptContext.Standard.AGGS, Collections.emptyMap());
} else { } else {
this.combineScript = null; this.combineScript = null;
} }

View File

@ -106,7 +106,7 @@ public class TopHitsAggregatorFactory extends AggregatorFactory<TopHitsAggregato
if (scriptFields != null) { if (scriptFields != null) {
for (ScriptField field : scriptFields) { for (ScriptField field : scriptFields) {
SearchScript searchScript = subSearchContext.scriptService().search(subSearchContext.lookup(), field.script(), SearchScript searchScript = subSearchContext.scriptService().search(subSearchContext.lookup(), field.script(),
ScriptContext.Standard.SEARCH, Collections.emptyMap(), subSearchContext.getQueryShardContext().getClusterState()); ScriptContext.Standard.SEARCH, Collections.emptyMap());
subSearchContext.scriptFields().add(new org.elasticsearch.search.fetch.script.ScriptFieldsContext.ScriptField( subSearchContext.scriptFields().add(new org.elasticsearch.search.fetch.script.ScriptFieldsContext.ScriptField(
field.fieldName(), searchScript, field.ignoreFailure())); field.fieldName(), searchScript, field.ignoreFailure()));
} }

View File

@ -93,7 +93,7 @@ public class BucketScriptPipelineAggregator extends PipelineAggregator {
List<? extends Bucket> buckets = originalAgg.getBuckets(); List<? extends Bucket> buckets = originalAgg.getBuckets();
CompiledScript compiledScript = reduceContext.scriptService().compile(script, ScriptContext.Standard.AGGS, CompiledScript compiledScript = reduceContext.scriptService().compile(script, ScriptContext.Standard.AGGS,
Collections.emptyMap(), reduceContext.clusterState()); Collections.emptyMap());
List newBuckets = new ArrayList<>(); List newBuckets = new ArrayList<>();
for (Bucket bucket : buckets) { for (Bucket bucket : buckets) {
Map<String, Object> vars = new HashMap<>(); Map<String, Object> vars = new HashMap<>();

View File

@ -90,7 +90,7 @@ public class BucketSelectorPipelineAggregator extends PipelineAggregator {
List<? extends Bucket> buckets = originalAgg.getBuckets(); List<? extends Bucket> buckets = originalAgg.getBuckets();
CompiledScript compiledScript = reduceContext.scriptService().compile(script, ScriptContext.Standard.AGGS, CompiledScript compiledScript = reduceContext.scriptService().compile(script, ScriptContext.Standard.AGGS,
Collections.emptyMap(), reduceContext.clusterState()); Collections.emptyMap());
List newBuckets = new ArrayList<>(); List newBuckets = new ArrayList<>();
for (Bucket bucket : buckets) { for (Bucket bucket : buckets) {
Map<String, Object> vars = new HashMap<>(); Map<String, Object> vars = new HashMap<>();

View File

@ -377,8 +377,7 @@ public abstract class ValuesSourceAggregationBuilder<VS extends ValuesSource, AB
private SearchScript createScript(Script script, SearchContext context) { private SearchScript createScript(Script script, SearchContext context) {
return script == null ? null return script == null ? null
: context.scriptService().search(context.lookup(), script, ScriptContext.Standard.AGGS, Collections.emptyMap(), : context.scriptService().search(context.lookup(), script, ScriptContext.Standard.AGGS, Collections.emptyMap());
context.getQueryShardContext().getClusterState());
} }
private static DocValueFormat resolveFormat(@Nullable String format, @Nullable ValueType valueType) { private static DocValueFormat resolveFormat(@Nullable String format, @Nullable ValueType valueType) {

View File

@ -304,7 +304,7 @@ public class ScriptSortBuilder extends SortBuilder<ScriptSortBuilder> {
@Override @Override
public SortFieldAndFormat build(QueryShardContext context) throws IOException { public SortFieldAndFormat build(QueryShardContext context) throws IOException {
final SearchScript searchScript = context.getScriptService().search( final SearchScript searchScript = context.getScriptService().search(
context.lookup(), script, ScriptContext.Standard.SEARCH, Collections.emptyMap(), context.getClusterState()); context.lookup(), script, ScriptContext.Standard.SEARCH, Collections.emptyMap());
MultiValueMode valueMode = null; MultiValueMode valueMode = null;
if (sortMode != null) { if (sortMode != null) {

View File

@ -631,7 +631,7 @@ public class PhraseSuggestionBuilder extends SuggestionBuilder<PhraseSuggestionB
if (this.collateQuery != null) { if (this.collateQuery != null) {
CompiledScript compiledScript = context.getScriptService().compile(this.collateQuery, ScriptContext.Standard.SEARCH, CompiledScript compiledScript = context.getScriptService().compile(this.collateQuery, ScriptContext.Standard.SEARCH,
Collections.emptyMap(), context.getClusterState()); Collections.emptyMap());
suggestionContext.setCollateQueryScript(compiledScript); suggestionContext.setCollateQueryScript(compiledScript);
if (this.collateParams != null) { if (this.collateParams != null) {
suggestionContext.setCollateScriptParams(this.collateParams); suggestionContext.setCollateScriptParams(this.collateParams);

View File

@ -55,7 +55,7 @@ public class FileScriptTests extends ESTestCase {
.put("script.engine." + MockScriptEngine.NAME + ".file.aggs", "false").build(); .put("script.engine." + MockScriptEngine.NAME + ".file.aggs", "false").build();
ScriptService scriptService = makeScriptService(settings); ScriptService scriptService = makeScriptService(settings);
Script script = new Script("script1", ScriptService.ScriptType.FILE, MockScriptEngine.NAME, null); Script script = new Script("script1", ScriptService.ScriptType.FILE, MockScriptEngine.NAME, null);
CompiledScript compiledScript = scriptService.compile(script, ScriptContext.Standard.SEARCH, Collections.emptyMap(), null); CompiledScript compiledScript = scriptService.compile(script, ScriptContext.Standard.SEARCH, Collections.emptyMap());
assertNotNull(compiledScript); assertNotNull(compiledScript);
MockCompiledScript executable = (MockCompiledScript) compiledScript.compiled(); MockCompiledScript executable = (MockCompiledScript) compiledScript.compiled();
assertEquals("script1.mockscript", executable.name); assertEquals("script1.mockscript", executable.name);
@ -72,7 +72,7 @@ public class FileScriptTests extends ESTestCase {
Script script = new Script("script1", ScriptService.ScriptType.FILE, MockScriptEngine.NAME, null); Script script = new Script("script1", ScriptService.ScriptType.FILE, MockScriptEngine.NAME, null);
for (ScriptContext context : ScriptContext.Standard.values()) { for (ScriptContext context : ScriptContext.Standard.values()) {
try { try {
scriptService.compile(script, context, Collections.emptyMap(), null); scriptService.compile(script, context, Collections.emptyMap());
fail(context.getKey() + " script should have been rejected"); fail(context.getKey() + " script should have been rejected");
} catch(Exception e) { } catch(Exception e) {
assertTrue(e.getMessage(), e.getMessage().contains("scripts of type [file], operation [" + context.getKey() + "] and lang [" + MockScriptEngine.NAME + "] are disabled")); assertTrue(e.getMessage(), e.getMessage().contains("scripts of type [file], operation [" + context.getKey() + "] and lang [" + MockScriptEngine.NAME + "] are disabled"));

View File

@ -19,8 +19,13 @@
package org.elasticsearch.script; package org.elasticsearch.script;
import org.elasticsearch.cluster.ClusterName; import java.io.IOException;
import org.elasticsearch.cluster.ClusterState; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
@ -30,13 +35,6 @@ import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.InternalSettingsPlugin;
import org.elasticsearch.watcher.ResourceWatcherService; import org.elasticsearch.watcher.ResourceWatcherService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap; import static java.util.Collections.singletonMap;
@ -55,10 +53,9 @@ public class NativeScriptTests extends ESTestCase {
List<Setting<?>> scriptSettings = scriptModule.getSettings(); List<Setting<?>> scriptSettings = scriptModule.getSettings();
scriptSettings.add(InternalSettingsPlugin.VERSION_CREATED); scriptSettings.add(InternalSettingsPlugin.VERSION_CREATED);
ClusterState state = ClusterState.builder(new ClusterName("_name")).build();
ExecutableScript executable = scriptModule.getScriptService().executable( ExecutableScript executable = scriptModule.getScriptService().executable(
new Script("my", ScriptType.INLINE, NativeScriptEngineService.NAME, null), ScriptContext.Standard.SEARCH, new Script("my", ScriptType.INLINE, NativeScriptEngineService.NAME, null), ScriptContext.Standard.SEARCH,
Collections.emptyMap(), state); Collections.emptyMap());
assertThat(executable.run().toString(), equalTo("test")); assertThat(executable.run().toString(), equalTo("test"));
} }
@ -85,7 +82,7 @@ public class NativeScriptTests extends ESTestCase {
for (ScriptContext scriptContext : scriptContextRegistry.scriptContexts()) { for (ScriptContext scriptContext : scriptContextRegistry.scriptContexts()) {
assertThat(scriptService.compile(new Script("my", ScriptType.INLINE, NativeScriptEngineService.NAME, null), scriptContext, assertThat(scriptService.compile(new Script("my", ScriptType.INLINE, NativeScriptEngineService.NAME, null), scriptContext,
Collections.emptyMap(), null), notNullValue()); Collections.emptyMap()), notNullValue());
} }
} }

View File

@ -59,7 +59,7 @@ public class ScriptContextTests extends ESTestCase {
for (ScriptService.ScriptType scriptType : ScriptService.ScriptType.values()) { for (ScriptService.ScriptType scriptType : ScriptService.ScriptType.values()) {
try { try {
Script script = new Script("1", scriptType, MockScriptEngine.NAME, null); Script script = new Script("1", scriptType, MockScriptEngine.NAME, null);
scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "custom_globally_disabled_op"), Collections.emptyMap(), null); scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "custom_globally_disabled_op"), Collections.emptyMap());
fail("script compilation should have been rejected"); fail("script compilation should have been rejected");
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
assertThat(e.getMessage(), containsString("scripts of type [" + scriptType + "], operation [" + PLUGIN_NAME + "_custom_globally_disabled_op] and lang [" + MockScriptEngine.NAME + "] are disabled")); assertThat(e.getMessage(), containsString("scripts of type [" + scriptType + "], operation [" + PLUGIN_NAME + "_custom_globally_disabled_op] and lang [" + MockScriptEngine.NAME + "] are disabled"));
@ -71,16 +71,16 @@ public class ScriptContextTests extends ESTestCase {
ScriptService scriptService = makeScriptService(); ScriptService scriptService = makeScriptService();
Script script = new Script("1", ScriptService.ScriptType.INLINE, MockScriptEngine.NAME, null); Script script = new Script("1", ScriptService.ScriptType.INLINE, MockScriptEngine.NAME, null);
try { try {
scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "custom_exp_disabled_op"), Collections.emptyMap(), null); scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "custom_exp_disabled_op"), Collections.emptyMap());
fail("script compilation should have been rejected"); fail("script compilation should have been rejected");
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
assertTrue(e.getMessage(), e.getMessage().contains("scripts of type [inline], operation [" + PLUGIN_NAME + "_custom_exp_disabled_op] and lang [" + MockScriptEngine.NAME + "] are disabled")); assertTrue(e.getMessage(), e.getMessage().contains("scripts of type [inline], operation [" + PLUGIN_NAME + "_custom_exp_disabled_op] and lang [" + MockScriptEngine.NAME + "] are disabled"));
} }
// still works for other script contexts // still works for other script contexts
assertNotNull(scriptService.compile(script, ScriptContext.Standard.AGGS, Collections.emptyMap(), null)); assertNotNull(scriptService.compile(script, ScriptContext.Standard.AGGS, Collections.emptyMap()));
assertNotNull(scriptService.compile(script, ScriptContext.Standard.SEARCH, Collections.emptyMap(), null)); assertNotNull(scriptService.compile(script, ScriptContext.Standard.SEARCH, Collections.emptyMap()));
assertNotNull(scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "custom_op"), Collections.emptyMap(), null)); assertNotNull(scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "custom_op"), Collections.emptyMap()));
} }
public void testUnknownPluginScriptContext() throws Exception { public void testUnknownPluginScriptContext() throws Exception {
@ -88,7 +88,7 @@ public class ScriptContextTests extends ESTestCase {
for (ScriptService.ScriptType scriptType : ScriptService.ScriptType.values()) { for (ScriptService.ScriptType scriptType : ScriptService.ScriptType.values()) {
try { try {
Script script = new Script("1", scriptType, MockScriptEngine.NAME, null); Script script = new Script("1", scriptType, MockScriptEngine.NAME, null);
scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "unknown"), Collections.emptyMap(), null); scriptService.compile(script, new ScriptContext.Plugin(PLUGIN_NAME, "unknown"), Collections.emptyMap());
fail("script compilation should have been rejected"); fail("script compilation should have been rejected");
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
assertTrue(e.getMessage(), e.getMessage().contains("script context [" + PLUGIN_NAME + "_unknown] not supported")); assertTrue(e.getMessage(), e.getMessage().contains("script context [" + PLUGIN_NAME + "_unknown] not supported"));
@ -107,7 +107,7 @@ public class ScriptContextTests extends ESTestCase {
for (ScriptService.ScriptType scriptType : ScriptService.ScriptType.values()) { for (ScriptService.ScriptType scriptType : ScriptService.ScriptType.values()) {
try { try {
Script script = new Script("1", scriptType, MockScriptEngine.NAME, null); Script script = new Script("1", scriptType, MockScriptEngine.NAME, null);
scriptService.compile(script, context, Collections.emptyMap(), null); scriptService.compile(script, context, Collections.emptyMap());
fail("script compilation should have been rejected"); fail("script compilation should have been rejected");
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
assertTrue(e.getMessage(), e.getMessage().contains("script context [test] not supported")); assertTrue(e.getMessage(), e.getMessage().contains("script context [test] not supported"));

View File

@ -114,9 +114,10 @@ public class ScriptServiceTests extends ESTestCase {
private void buildScriptService(Settings additionalSettings) throws IOException { private void buildScriptService(Settings additionalSettings) throws IOException {
Settings finalSettings = Settings.builder().put(baseSettings).put(additionalSettings).build(); Settings finalSettings = Settings.builder().put(baseSettings).put(additionalSettings).build();
Environment environment = new Environment(finalSettings); Environment environment = new Environment(finalSettings);
// TODO:
scriptService = new ScriptService(finalSettings, environment, resourceWatcherService, scriptEngineRegistry, scriptContextRegistry, scriptSettings) { scriptService = new ScriptService(finalSettings, environment, resourceWatcherService, scriptEngineRegistry, scriptContextRegistry, scriptSettings) {
@Override @Override
String getScriptFromClusterState(ClusterState state, String scriptLang, String id) { String getScriptFromClusterState(String scriptLang, String id) {
//mock the script that gets retrieved from an index //mock the script that gets retrieved from an index
return "100"; return "100";
} }
@ -141,7 +142,7 @@ public class ScriptServiceTests extends ESTestCase {
resourceWatcherService.notifyNow(); resourceWatcherService.notifyNow();
CompiledScript compiledScript = scriptService.compile(new Script("test_script", ScriptType.FILE, "test", null), CompiledScript compiledScript = scriptService.compile(new Script("test_script", ScriptType.FILE, "test", null),
ScriptContext.Standard.SEARCH, Collections.emptyMap(), emptyClusterState()); ScriptContext.Standard.SEARCH, Collections.emptyMap());
assertThat(compiledScript.compiled(), equalTo((Object) "compiled_test_file")); assertThat(compiledScript.compiled(), equalTo((Object) "compiled_test_file"));
Files.delete(testFileNoExt); Files.delete(testFileNoExt);
@ -150,7 +151,7 @@ public class ScriptServiceTests extends ESTestCase {
try { try {
scriptService.compile(new Script("test_script", ScriptType.FILE, "test", null), ScriptContext.Standard.SEARCH, scriptService.compile(new Script("test_script", ScriptType.FILE, "test", null), ScriptContext.Standard.SEARCH,
Collections.emptyMap(), emptyClusterState()); Collections.emptyMap());
fail("the script test_script should no longer exist"); fail("the script test_script should no longer exist");
} catch (IllegalArgumentException ex) { } catch (IllegalArgumentException ex) {
assertThat(ex.getMessage(), containsString("Unable to find on disk file script [test_script] using lang [test]")); assertThat(ex.getMessage(), containsString("Unable to find on disk file script [test_script] using lang [test]"));
@ -168,7 +169,7 @@ public class ScriptServiceTests extends ESTestCase {
resourceWatcherService.notifyNow(); resourceWatcherService.notifyNow();
CompiledScript compiledScript = scriptService.compile(new Script("file_script", ScriptType.FILE, "test", null), CompiledScript compiledScript = scriptService.compile(new Script("file_script", ScriptType.FILE, "test", null),
ScriptContext.Standard.SEARCH, Collections.emptyMap(), emptyClusterState()); ScriptContext.Standard.SEARCH, Collections.emptyMap());
assertThat(compiledScript.compiled(), equalTo((Object) "compiled_test_file_script")); assertThat(compiledScript.compiled(), equalTo((Object) "compiled_test_file_script"));
Files.delete(testHiddenFile); Files.delete(testHiddenFile);
@ -179,9 +180,9 @@ public class ScriptServiceTests extends ESTestCase {
public void testInlineScriptCompiledOnceCache() throws IOException { public void testInlineScriptCompiledOnceCache() throws IOException {
buildScriptService(Settings.EMPTY); buildScriptService(Settings.EMPTY);
CompiledScript compiledScript1 = scriptService.compile(new Script("1+1", ScriptType.INLINE, "test", null), CompiledScript compiledScript1 = scriptService.compile(new Script("1+1", ScriptType.INLINE, "test", null),
randomFrom(scriptContexts), Collections.emptyMap(), emptyClusterState()); randomFrom(scriptContexts), Collections.emptyMap());
CompiledScript compiledScript2 = scriptService.compile(new Script("1+1", ScriptType.INLINE, "test", null), CompiledScript compiledScript2 = scriptService.compile(new Script("1+1", ScriptType.INLINE, "test", null),
randomFrom(scriptContexts), Collections.emptyMap(), emptyClusterState()); randomFrom(scriptContexts), Collections.emptyMap());
assertThat(compiledScript1.compiled(), sameInstance(compiledScript2.compiled())); assertThat(compiledScript1.compiled(), sameInstance(compiledScript2.compiled()));
} }
@ -304,7 +305,7 @@ public class ScriptServiceTests extends ESTestCase {
String type = scriptEngineService.getType(); String type = scriptEngineService.getType();
try { try {
scriptService.compile(new Script("test", randomFrom(ScriptType.values()), type, null), new ScriptContext.Plugin( scriptService.compile(new Script("test", randomFrom(ScriptType.values()), type, null), new ScriptContext.Plugin(
pluginName, unknownContext), Collections.emptyMap(), emptyClusterState()); pluginName, unknownContext), Collections.emptyMap());
fail("script compilation should have been rejected"); fail("script compilation should have been rejected");
} catch(IllegalArgumentException e) { } catch(IllegalArgumentException e) {
assertThat(e.getMessage(), containsString("script context [" + pluginName + "_" + unknownContext + "] not supported")); assertThat(e.getMessage(), containsString("script context [" + pluginName + "_" + unknownContext + "] not supported"));
@ -314,22 +315,20 @@ public class ScriptServiceTests extends ESTestCase {
public void testCompileCountedInCompilationStats() throws IOException { public void testCompileCountedInCompilationStats() throws IOException {
buildScriptService(Settings.EMPTY); buildScriptService(Settings.EMPTY);
scriptService.compile(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), scriptService.compile(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts),
Collections.emptyMap(), emptyClusterState()); Collections.emptyMap());
assertEquals(1L, scriptService.stats().getCompilations()); assertEquals(1L, scriptService.stats().getCompilations());
} }
public void testExecutableCountedInCompilationStats() throws IOException { public void testExecutableCountedInCompilationStats() throws IOException {
buildScriptService(Settings.EMPTY); buildScriptService(Settings.EMPTY);
ClusterState state = ClusterState.builder(new ClusterName("_name")).build(); scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap());
scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap(), state);
assertEquals(1L, scriptService.stats().getCompilations()); assertEquals(1L, scriptService.stats().getCompilations());
} }
public void testSearchCountedInCompilationStats() throws IOException { public void testSearchCountedInCompilationStats() throws IOException {
buildScriptService(Settings.EMPTY); buildScriptService(Settings.EMPTY);
ClusterState state = ClusterState.builder(new ClusterName("_name")).build();
scriptService.search(null, new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), scriptService.search(null, new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts),
Collections.emptyMap(), state); Collections.emptyMap());
assertEquals(1L, scriptService.stats().getCompilations()); assertEquals(1L, scriptService.stats().getCompilations());
} }
@ -339,7 +338,7 @@ public class ScriptServiceTests extends ESTestCase {
for (int i = 0; i < numberOfCompilations; i++) { for (int i = 0; i < numberOfCompilations; i++) {
scriptService scriptService
.compile(new Script(i + " + " + i, ScriptType.INLINE, "test", null), randomFrom(scriptContexts), .compile(new Script(i + " + " + i, ScriptType.INLINE, "test", null), randomFrom(scriptContexts),
Collections.emptyMap(), emptyClusterState()); Collections.emptyMap());
} }
assertEquals(numberOfCompilations, scriptService.stats().getCompilations()); assertEquals(numberOfCompilations, scriptService.stats().getCompilations());
} }
@ -349,9 +348,8 @@ public class ScriptServiceTests extends ESTestCase {
builder.put(ScriptService.SCRIPT_CACHE_SIZE_SETTING.getKey(), 1); builder.put(ScriptService.SCRIPT_CACHE_SIZE_SETTING.getKey(), 1);
builder.put("script.inline", "true"); builder.put("script.inline", "true");
buildScriptService(builder.build()); buildScriptService(builder.build());
ClusterState state = ClusterState.builder(new ClusterName("_name")).build(); scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap());
scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap(), state); scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap());
scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap(), state);
assertEquals(1L, scriptService.stats().getCompilations()); assertEquals(1L, scriptService.stats().getCompilations());
} }
@ -359,14 +357,14 @@ public class ScriptServiceTests extends ESTestCase {
buildScriptService(Settings.EMPTY); buildScriptService(Settings.EMPTY);
createFileScripts("test"); createFileScripts("test");
scriptService.compile(new Script("file_script", ScriptType.FILE, "test", null), randomFrom(scriptContexts), scriptService.compile(new Script("file_script", ScriptType.FILE, "test", null), randomFrom(scriptContexts),
Collections.emptyMap(), emptyClusterState()); Collections.emptyMap());
assertEquals(1L, scriptService.stats().getCompilations()); assertEquals(1L, scriptService.stats().getCompilations());
} }
public void testIndexedScriptCountedInCompilationStats() throws IOException { public void testIndexedScriptCountedInCompilationStats() throws IOException {
buildScriptService(Settings.EMPTY); buildScriptService(Settings.EMPTY);
scriptService.compile(new Script("script", ScriptType.STORED, "test", null), randomFrom(scriptContexts), scriptService.compile(new Script("script", ScriptType.STORED, "test", null), randomFrom(scriptContexts),
Collections.emptyMap(), emptyClusterState()); Collections.emptyMap());
assertEquals(1L, scriptService.stats().getCompilations()); assertEquals(1L, scriptService.stats().getCompilations());
} }
@ -375,9 +373,8 @@ public class ScriptServiceTests extends ESTestCase {
builder.put(ScriptService.SCRIPT_CACHE_SIZE_SETTING.getKey(), 1); builder.put(ScriptService.SCRIPT_CACHE_SIZE_SETTING.getKey(), 1);
builder.put("script.inline", "true"); builder.put("script.inline", "true");
buildScriptService(builder.build()); buildScriptService(builder.build());
ClusterState state = ClusterState.builder(new ClusterName("_name")).build(); scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap());
scriptService.executable(new Script("1+1", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap(), state); scriptService.executable(new Script("2+2", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap());
scriptService.executable(new Script("2+2", ScriptType.INLINE, "test", null), randomFrom(scriptContexts), Collections.emptyMap(), state);
assertEquals(2L, scriptService.stats().getCompilations()); assertEquals(2L, scriptService.stats().getCompilations());
assertEquals(1L, scriptService.stats().getCacheEvictions()); assertEquals(1L, scriptService.stats().getCacheEvictions());
} }
@ -388,7 +385,7 @@ public class ScriptServiceTests extends ESTestCase {
builder.put("script.inline", "true"); builder.put("script.inline", "true");
buildScriptService(builder.build()); buildScriptService(builder.build());
CompiledScript script = scriptService.compile(new Script("1 + 1", ScriptType.INLINE, null, null), CompiledScript script = scriptService.compile(new Script("1 + 1", ScriptType.INLINE, null, null),
randomFrom(scriptContexts), Collections.emptyMap(), emptyClusterState()); randomFrom(scriptContexts), Collections.emptyMap());
assertEquals(script.lang(), "test"); assertEquals(script.lang(), "test");
} }
@ -469,7 +466,7 @@ public class ScriptServiceTests extends ESTestCase {
private void assertCompileRejected(String lang, String script, ScriptType scriptType, ScriptContext scriptContext) { private void assertCompileRejected(String lang, String script, ScriptType scriptType, ScriptContext scriptContext) {
try { try {
scriptService.compile(new Script(script, scriptType, lang, null), scriptContext, Collections.emptyMap(), emptyClusterState()); scriptService.compile(new Script(script, scriptType, lang, null), scriptContext, Collections.emptyMap());
fail("compile should have been rejected for lang [" + lang + "], script_type [" + scriptType + "], scripted_op [" + scriptContext + "]"); fail("compile should have been rejected for lang [" + lang + "], script_type [" + scriptType + "], scripted_op [" + scriptContext + "]");
} catch(IllegalStateException e) { } catch(IllegalStateException e) {
//all good //all good
@ -477,9 +474,8 @@ public class ScriptServiceTests extends ESTestCase {
} }
private void assertCompileAccepted(String lang, String script, ScriptType scriptType, ScriptContext scriptContext) { private void assertCompileAccepted(String lang, String script, ScriptType scriptType, ScriptContext scriptContext) {
ClusterState state = emptyClusterState();
assertThat( assertThat(
scriptService.compile(new Script(script, scriptType, lang, null), scriptContext, Collections.emptyMap(), state), scriptService.compile(new Script(script, scriptType, lang, null), scriptContext, Collections.emptyMap()),
notNullValue() notNullValue()
); );
} }
@ -528,8 +524,6 @@ public class ScriptServiceTests extends ESTestCase {
public static final String NAME = "dtest"; public static final String NAME = "dtest";
public static final List<String> EXTENSIONS = Collections.unmodifiableList(Arrays.asList("dtest"));
@Override @Override
public String getType() { public String getType() {
return NAME; return NAME;
@ -559,9 +553,4 @@ public class ScriptServiceTests extends ESTestCase {
public void close() { public void close() {
} }
} }
private static ClusterState emptyClusterState() {
return ClusterState.builder(new ClusterName("_name")).build();
}
} }

View File

@ -100,7 +100,7 @@ public abstract class AbstractSortTestCase<T extends SortBuilder<T>> extends EST
scriptService = new ScriptService(baseSettings, environment, scriptService = new ScriptService(baseSettings, environment,
new ResourceWatcherService(baseSettings, null), scriptEngineRegistry, scriptContextRegistry, scriptSettings) { new ResourceWatcherService(baseSettings, null), scriptEngineRegistry, scriptContextRegistry, scriptSettings) {
@Override @Override
public CompiledScript compile(Script script, ScriptContext scriptContext, Map<String, String> params, ClusterState state) { public CompiledScript compile(Script script, ScriptContext scriptContext, Map<String, String> params) {
return new CompiledScript(ScriptType.INLINE, "mockName", "test", script); return new CompiledScript(ScriptType.INLINE, "mockName", "test", script);
} }
}; };

View File

@ -60,7 +60,7 @@ public class IngestCommonPlugin extends Plugin {
nodeModule.registerProcessor(SortProcessor.TYPE, (registry) -> new SortProcessor.Factory()); nodeModule.registerProcessor(SortProcessor.TYPE, (registry) -> new SortProcessor.Factory());
nodeModule.registerProcessor(GrokProcessor.TYPE, (registry) -> new GrokProcessor.Factory(builtinPatterns)); nodeModule.registerProcessor(GrokProcessor.TYPE, (registry) -> new GrokProcessor.Factory(builtinPatterns));
nodeModule.registerProcessor(ScriptProcessor.TYPE, (registry) -> nodeModule.registerProcessor(ScriptProcessor.TYPE, (registry) ->
new ScriptProcessor.Factory(registry.getScriptService(), registry.getClusterService())); new ScriptProcessor.Factory(registry.getScriptService()));
} }
// Code for loading built-in grok patterns packaged with the jar file: // Code for loading built-in grok patterns packaged with the jar file:

View File

@ -19,7 +19,9 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.service.ClusterService; import java.util.HashMap;
import java.util.Map;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.AbstractProcessorFactory; import org.elasticsearch.ingest.AbstractProcessorFactory;
@ -30,9 +32,6 @@ import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptContext; import org.elasticsearch.script.ScriptContext;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import java.util.HashMap;
import java.util.Map;
import static java.util.Collections.emptyMap; import static java.util.Collections.emptyMap;
import static org.elasticsearch.common.Strings.hasLength; import static org.elasticsearch.common.Strings.hasLength;
import static org.elasticsearch.ingest.ConfigurationUtils.newConfigurationException; import static org.elasticsearch.ingest.ConfigurationUtils.newConfigurationException;
@ -52,14 +51,12 @@ public final class ScriptProcessor extends AbstractProcessor {
private final Script script; private final Script script;
private final ScriptService scriptService; private final ScriptService scriptService;
private final ClusterService clusterService;
private final String field; private final String field;
ScriptProcessor(String tag, Script script, ScriptService scriptService, ClusterService clusterService, String field) { ScriptProcessor(String tag, Script script, ScriptService scriptService, String field) {
super(tag); super(tag);
this.script = script; this.script = script;
this.scriptService = scriptService; this.scriptService = scriptService;
this.clusterService = clusterService;
this.field = field; this.field = field;
} }
@ -67,7 +64,7 @@ public final class ScriptProcessor extends AbstractProcessor {
public void execute(IngestDocument document) { public void execute(IngestDocument document) {
Map<String, Object> vars = new HashMap<>(); Map<String, Object> vars = new HashMap<>();
vars.put("ctx", document.getSourceAndMetadata()); vars.put("ctx", document.getSourceAndMetadata());
CompiledScript compiledScript = scriptService.compile(script, ScriptContext.Standard.INGEST, emptyMap(), clusterService.state()); CompiledScript compiledScript = scriptService.compile(script, ScriptContext.Standard.INGEST, emptyMap());
ExecutableScript executableScript = scriptService.executable(compiledScript, vars); ExecutableScript executableScript = scriptService.executable(compiledScript, vars);
Object value = executableScript.run(); Object value = executableScript.run();
if (field != null) { if (field != null) {
@ -83,11 +80,9 @@ public final class ScriptProcessor extends AbstractProcessor {
public static final class Factory extends AbstractProcessorFactory<ScriptProcessor> { public static final class Factory extends AbstractProcessorFactory<ScriptProcessor> {
private final ScriptService scriptService; private final ScriptService scriptService;
private final ClusterService clusterService;
public Factory(ScriptService scriptService, ClusterService clusterService) { public Factory(ScriptService scriptService) {
this.scriptService = scriptService; this.scriptService = scriptService;
this.clusterService = clusterService;
} }
@Override @Override
@ -120,7 +115,7 @@ public final class ScriptProcessor extends AbstractProcessor {
throw newConfigurationException(TYPE, processorTag, null, "Could not initialize script"); throw newConfigurationException(TYPE, processorTag, null, "Could not initialize script");
} }
return new ScriptProcessor(processorTag, script, scriptService, clusterService, field); return new ScriptProcessor(processorTag, script, scriptService, field);
} }
} }
} }

View File

@ -37,7 +37,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
@Before @Before
public void init() { public void init() {
factory = new ScriptProcessor.Factory(mock(ScriptService.class), mock(ClusterService.class)); factory = new ScriptProcessor.Factory(mock(ScriptService.class));
} }

View File

@ -19,7 +19,9 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.service.ClusterService; import java.util.HashMap;
import java.util.Map;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
import org.elasticsearch.ingest.RandomDocumentPicks; import org.elasticsearch.ingest.RandomDocumentPicks;
import org.elasticsearch.script.CompiledScript; import org.elasticsearch.script.CompiledScript;
@ -28,9 +30,6 @@ import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.is;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
@ -42,16 +41,15 @@ public class ScriptProcessorTests extends ESTestCase {
public void testScripting() throws Exception { public void testScripting() throws Exception {
int randomInt = randomInt(); int randomInt = randomInt();
ScriptService scriptService = mock(ScriptService.class); ScriptService scriptService = mock(ScriptService.class);
ClusterService clusterService = mock(ClusterService.class);
CompiledScript compiledScript = mock(CompiledScript.class); CompiledScript compiledScript = mock(CompiledScript.class);
Script script = mock(Script.class); Script script = mock(Script.class);
when(scriptService.compile(any(), any(), any(), any())).thenReturn(compiledScript); when(scriptService.compile(any(), any(), any())).thenReturn(compiledScript);
ExecutableScript executableScript = mock(ExecutableScript.class); ExecutableScript executableScript = mock(ExecutableScript.class);
when(scriptService.executable(any(), any())).thenReturn(executableScript); when(scriptService.executable(any(), any())).thenReturn(executableScript);
when(executableScript.run()).thenReturn(randomInt); when(executableScript.run()).thenReturn(randomInt);
ScriptProcessor processor = new ScriptProcessor(randomAsciiOfLength(10), script, ScriptProcessor processor = new ScriptProcessor(randomAsciiOfLength(10), script,
scriptService, clusterService, "bytes_total"); scriptService, "bytes_total");
Map<String, Object> document = new HashMap<>(); Map<String, Object> document = new HashMap<>();
document.put("bytes_in", 1234); document.put("bytes_in", 1234);

View File

@ -53,7 +53,6 @@ public class TransportSearchTemplateAction extends HandledTransportAction<Search
private static final String TEMPLATE_LANG = MustacheScriptEngineService.NAME; private static final String TEMPLATE_LANG = MustacheScriptEngineService.NAME;
private final ClusterService clusterService;
private final ScriptService scriptService; private final ScriptService scriptService;
private final TransportSearchAction searchAction; private final TransportSearchAction searchAction;
private final IndicesQueriesRegistry queryRegistry; private final IndicesQueriesRegistry queryRegistry;
@ -63,11 +62,10 @@ public class TransportSearchTemplateAction extends HandledTransportAction<Search
@Inject @Inject
public TransportSearchTemplateAction(Settings settings, ThreadPool threadPool, TransportService transportService, public TransportSearchTemplateAction(Settings settings, ThreadPool threadPool, TransportService transportService,
ActionFilters actionFilters, IndexNameExpressionResolver resolver, ActionFilters actionFilters, IndexNameExpressionResolver resolver,
ClusterService clusterService, ScriptService scriptService, ScriptService scriptService,
TransportSearchAction searchAction, IndicesQueriesRegistry indicesQueryRegistry, TransportSearchAction searchAction, IndicesQueriesRegistry indicesQueryRegistry,
AggregatorParsers aggregatorParsers, Suggesters suggesters) { AggregatorParsers aggregatorParsers, Suggesters suggesters) {
super(settings, SearchTemplateAction.NAME, threadPool, transportService, actionFilters, resolver, SearchTemplateRequest::new); super(settings, SearchTemplateAction.NAME, threadPool, transportService, actionFilters, resolver, SearchTemplateRequest::new);
this.clusterService = clusterService;
this.scriptService = scriptService; this.scriptService = scriptService;
this.searchAction = searchAction; this.searchAction = searchAction;
this.queryRegistry = indicesQueryRegistry; this.queryRegistry = indicesQueryRegistry;
@ -80,7 +78,7 @@ public class TransportSearchTemplateAction extends HandledTransportAction<Search
final SearchTemplateResponse response = new SearchTemplateResponse(); final SearchTemplateResponse response = new SearchTemplateResponse();
try { try {
Script script = new Script(request.getScript(), request.getScriptType(), TEMPLATE_LANG, request.getScriptParams()); Script script = new Script(request.getScript(), request.getScriptType(), TEMPLATE_LANG, request.getScriptParams());
ExecutableScript executable = scriptService.executable(script, SEARCH, emptyMap(), clusterService.state()); ExecutableScript executable = scriptService.executable(script, SEARCH, emptyMap());
BytesReference source = (BytesReference) executable.run(); BytesReference source = (BytesReference) executable.run();
response.setSource(source); response.setSource(source);

View File

@ -439,19 +439,17 @@ public abstract class AbstractAsyncBulkIndexByScrollAction<Request extends Abstr
private final BulkByScrollTask task; private final BulkByScrollTask task;
private final ScriptService scriptService; private final ScriptService scriptService;
private final ClusterState state;
private final Script script; private final Script script;
private final Map<String, Object> params; private final Map<String, Object> params;
private ExecutableScript executable; private ExecutableScript executable;
private Map<String, Object> context; private Map<String, Object> context;
public ScriptApplier(BulkByScrollTask task, ScriptService scriptService, Script script, ClusterState state, public ScriptApplier(BulkByScrollTask task, ScriptService scriptService, Script script,
Map<String, Object> params) { Map<String, Object> params) {
this.task = task; this.task = task;
this.scriptService = scriptService; this.scriptService = scriptService;
this.script = script; this.script = script;
this.state = state;
this.params = params; this.params = params;
} }
@ -462,7 +460,7 @@ public abstract class AbstractAsyncBulkIndexByScrollAction<Request extends Abstr
return request; return request;
} }
if (executable == null) { if (executable == null) {
CompiledScript compiled = scriptService.compile(script, ScriptContext.Standard.UPDATE, emptyMap(), state); CompiledScript compiled = scriptService.compile(script, ScriptContext.Standard.UPDATE, emptyMap());
executable = scriptService.executable(compiled, params); executable = scriptService.executable(compiled, params);
} }
if (context == null) { if (context == null) {

View File

@ -128,7 +128,7 @@ public class TransportReindexAction extends HandledTransportAction<ReindexReques
protected BiFunction<RequestWrapper<?>, SearchHit, RequestWrapper<?>> buildScriptApplier() { protected BiFunction<RequestWrapper<?>, SearchHit, RequestWrapper<?>> buildScriptApplier() {
Script script = mainRequest.getScript(); Script script = mainRequest.getScript();
if (script != null) { if (script != null) {
return new ReindexScriptApplier(task, scriptService, script, clusterState, script.getParams()); return new ReindexScriptApplier(task, scriptService, script, script.getParams());
} }
return super.buildScriptApplier(); return super.buildScriptApplier();
} }
@ -205,9 +205,9 @@ public class TransportReindexAction extends HandledTransportAction<ReindexReques
class ReindexScriptApplier extends ScriptApplier { class ReindexScriptApplier extends ScriptApplier {
ReindexScriptApplier(BulkByScrollTask task, ScriptService scriptService, Script script, ClusterState state, ReindexScriptApplier(BulkByScrollTask task, ScriptService scriptService, Script script,
Map<String, Object> params) { Map<String, Object> params) {
super(task, scriptService, script, state, params); super(task, scriptService, script, params);
} }
/* /*

View File

@ -92,7 +92,7 @@ public class TransportUpdateByQueryAction extends HandledTransportAction<UpdateB
protected BiFunction<RequestWrapper<?>, SearchHit, RequestWrapper<?>> buildScriptApplier() { protected BiFunction<RequestWrapper<?>, SearchHit, RequestWrapper<?>> buildScriptApplier() {
Script script = mainRequest.getScript(); Script script = mainRequest.getScript();
if (script != null) { if (script != null) {
return new UpdateByQueryScriptApplier(task, scriptService, script, clusterState, script.getParams()); return new UpdateByQueryScriptApplier(task, scriptService, script, script.getParams());
} }
return super.buildScriptApplier(); return super.buildScriptApplier();
} }
@ -112,9 +112,9 @@ public class TransportUpdateByQueryAction extends HandledTransportAction<UpdateB
class UpdateByQueryScriptApplier extends ScriptApplier { class UpdateByQueryScriptApplier extends ScriptApplier {
UpdateByQueryScriptApplier(BulkByScrollTask task, ScriptService scriptService, Script script, ClusterState state, UpdateByQueryScriptApplier(BulkByScrollTask task, ScriptService scriptService, Script script,
Map<String, Object> params) { Map<String, Object> params) {
super(task, scriptService, script, state, params); super(task, scriptService, script, params);
} }
@Override @Override