Script settings

This commit is the x-plugins side of the refactoring of script settings.

Relates elastic/elasticsearchelastic/elasticsearch#16197

Original commit: elastic/x-pack-elasticsearch@4c429933b9
This commit is contained in:
Jason Tedor 2016-01-26 20:18:22 -05:00
parent 4586ca2e06
commit 8eb97c5509
12 changed files with 50 additions and 27 deletions

View File

@ -10,8 +10,10 @@ import org.elasticsearch.common.SuppressForbidden;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment; import org.elasticsearch.env.Environment;
import org.elasticsearch.script.ScriptContextRegistry; import org.elasticsearch.script.ScriptContextRegistry;
import org.elasticsearch.script.ScriptEngineRegistry;
import org.elasticsearch.script.ScriptEngineService; import org.elasticsearch.script.ScriptEngineService;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import org.elasticsearch.script.ScriptSettings;
import org.elasticsearch.script.groovy.GroovyScriptEngineService; import org.elasticsearch.script.groovy.GroovyScriptEngineService;
import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.watcher.ResourceWatcherService; import org.elasticsearch.watcher.ResourceWatcherService;
@ -28,8 +30,8 @@ import java.util.Set;
public final class MessyTestUtils { public final class MessyTestUtils {
public static ScriptServiceProxy getScriptServiceProxy(ThreadPool tp) throws Exception { public static ScriptServiceProxy getScriptServiceProxy(ThreadPool tp) throws Exception {
Settings settings = Settings.settingsBuilder() Settings settings = Settings.settingsBuilder()
.put("script.inline", "on") .put("script.inline", "true")
.put("script.indexed", "on") .put("script.indexed", "true")
.put("path.home", LuceneTestCase.createTempDir()) .put("path.home", LuceneTestCase.createTempDir())
.build(); .build();
XMustacheScriptEngineService mustacheScriptEngineService = new XMustacheScriptEngineService(settings); XMustacheScriptEngineService mustacheScriptEngineService = new XMustacheScriptEngineService(settings);
@ -37,8 +39,15 @@ public final class MessyTestUtils {
Set<ScriptEngineService> engineServiceSet = new HashSet<>(); Set<ScriptEngineService> engineServiceSet = new HashSet<>();
engineServiceSet.add(mustacheScriptEngineService); engineServiceSet.add(mustacheScriptEngineService);
engineServiceSet.add(groovyScriptEngineService); engineServiceSet.add(groovyScriptEngineService);
ScriptContextRegistry registry = new ScriptContextRegistry(Arrays.asList(ScriptServiceProxy.INSTANCE)); ScriptEngineRegistry scriptEngineRegistry = new ScriptEngineRegistry(
Arrays.asList(
new ScriptEngineRegistry.ScriptEngineRegistration(GroovyScriptEngineService.class, GroovyScriptEngineService.TYPES),
new ScriptEngineRegistry.ScriptEngineRegistration(XMustacheScriptEngineService.class, XMustacheScriptEngineService.TYPES)
)
);
ScriptContextRegistry scriptContextRegistry = new ScriptContextRegistry(Arrays.asList(ScriptServiceProxy.INSTANCE));
return ScriptServiceProxy.of(new ScriptService(settings, new Environment(settings), engineServiceSet, new ResourceWatcherService(settings, tp), registry)); ScriptSettings scriptSettings = new ScriptSettings(scriptEngineRegistry, scriptContextRegistry);
return ScriptServiceProxy.of(new ScriptService(settings, new Environment(settings), engineServiceSet, new ResourceWatcherService(settings, tp), scriptEngineRegistry, scriptContextRegistry, scriptSettings));
} }
} }

View File

@ -68,7 +68,7 @@ public class ScriptConditionTests extends ESTestCase {
public void testExecuteMergedParams() throws Exception { public void testExecuteMergedParams() throws Exception {
ScriptServiceProxy scriptService = getScriptServiceProxy(tp); ScriptServiceProxy scriptService = getScriptServiceProxy(tp);
Script script = Script.inline("ctx.payload.hits.total > threshold").lang(ScriptService.DEFAULT_LANG).params(singletonMap("threshold", 1)).build(); Script script = Script.inline("ctx.payload.hits.total > threshold").lang(Script.DEFAULT_LANG).params(singletonMap("threshold", 1)).build();
ExecutableScriptCondition executable = new ExecutableScriptCondition(new ScriptCondition(script), logger, scriptService); ExecutableScriptCondition executable = new ExecutableScriptCondition(new ScriptCondition(script), logger, scriptService);
SearchResponse response = new SearchResponse(InternalSearchResponse.empty(), "", 3, 3, 500l, new ShardSearchFailure[0]); SearchResponse response = new SearchResponse(InternalSearchResponse.empty(), "", 3, 3, 500l, new ShardSearchFailure[0]);
WatchExecutionContext ctx = mockExecutionContext("_name", new Payload.XContent(response)); WatchExecutionContext ctx = mockExecutionContext("_name", new Payload.XContent(response));

View File

@ -8,7 +8,7 @@ dependencies {
integTest { integTest {
cluster { cluster {
plugin 'x-pack', project(':x-plugins:elasticsearch:x-pack') plugin 'x-pack', project(':x-plugins:elasticsearch:x-pack')
systemProperty 'es.script.inline', 'on' systemProperty 'es.script.inline', 'true'
systemProperty 'es.shield.enabled', 'false' systemProperty 'es.shield.enabled', 'false'
systemProperty 'es.marvel.enabled', 'false' systemProperty 'es.marvel.enabled', 'false'
} }

View File

@ -27,7 +27,7 @@ public class MarvelF {
public static void main(String[] args) throws Throwable { public static void main(String[] args) throws Throwable {
Settings.Builder settings = Settings.builder(); Settings.Builder settings = Settings.builder();
settings.put("script.inline", "on"); settings.put("script.inline", "true");
settings.put("security.manager.enabled", "false"); settings.put("security.manager.enabled", "false");
settings.put("plugins.load_classpath_plugins", "false"); settings.put("plugins.load_classpath_plugins", "false");
settings.put("cluster.name", MarvelF.class.getSimpleName()); settings.put("cluster.name", MarvelF.class.getSimpleName());

View File

@ -36,7 +36,7 @@ public class ShieldF {
Settings.Builder settings = Settings.builder(); Settings.Builder settings = Settings.builder();
settings.put("http.cors.enabled", "true"); settings.put("http.cors.enabled", "true");
settings.put("http.cors.allow-origin", "*"); settings.put("http.cors.allow-origin", "*");
settings.put("script.inline", "on"); settings.put("script.inline", "true");
settings.put("shield.enabled", "true"); settings.put("shield.enabled", "true");
settings.put("security.manager.enabled", "false"); settings.put("security.manager.enabled", "false");
// Disable Marvel to prevent cluster activity // Disable Marvel to prevent cluster activity

View File

@ -20,6 +20,7 @@ import org.elasticsearch.common.regex.Regex;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.common.settings.SettingsModule;
import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.Plugin;
import org.elasticsearch.script.ScriptEngineRegistry;
import org.elasticsearch.script.ScriptModule; import org.elasticsearch.script.ScriptModule;
import org.elasticsearch.shield.authz.AuthorizationModule; import org.elasticsearch.shield.authz.AuthorizationModule;
import org.elasticsearch.watcher.actions.WatcherActionModule; import org.elasticsearch.watcher.actions.WatcherActionModule;
@ -185,7 +186,7 @@ public class WatcherPlugin extends Plugin {
public void onModule(ScriptModule module) { public void onModule(ScriptModule module) {
module.registerScriptContext(ScriptServiceProxy.INSTANCE); module.registerScriptContext(ScriptServiceProxy.INSTANCE);
if (enabled && !transportClient) { if (enabled && !transportClient) {
module.addScriptEngine(XMustacheScriptEngineService.class); module.addScriptEngine(new ScriptEngineRegistry.ScriptEngineRegistration(XMustacheScriptEngineService.class, XMustacheScriptEngineService.TYPES));
} }
} }

View File

@ -14,6 +14,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import org.elasticsearch.script.ScriptService.ScriptType; import org.elasticsearch.script.ScriptService.ScriptType;
import org.elasticsearch.script.ScriptSettings;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
@ -25,7 +26,7 @@ import java.util.Map;
public class Script implements ToXContent { public class Script implements ToXContent {
public static final ScriptType DEFAULT_TYPE = ScriptType.INLINE; public static final ScriptType DEFAULT_TYPE = ScriptType.INLINE;
public static final String DEFAULT_LANG = ScriptService.DEFAULT_LANG; public static final String DEFAULT_LANG = ScriptSettings.DEFAULT_LANG;
private final String script; private final String script;
private final @Nullable ScriptType type; private final @Nullable ScriptType type;

View File

@ -23,6 +23,7 @@ import org.elasticsearch.search.lookup.SearchLookup;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -33,6 +34,8 @@ public class XMustacheScriptEngineService extends AbstractComponent implements S
public static final String NAME = "xmustache"; public static final String NAME = "xmustache";
public static final List<String> TYPES = Collections.singletonList(NAME);
/** /**
* @param settings automatically wired by Guice. * @param settings automatically wired by Guice.
* */ * */
@ -58,17 +61,17 @@ public class XMustacheScriptEngineService extends AbstractComponent implements S
} }
@Override @Override
public String[] types() { public List<String> getTypes() {
return new String[] { NAME }; return TYPES;
} }
@Override @Override
public String[] extensions() { public List<String> getExtensions() {
return new String[] { NAME }; return TYPES;
} }
@Override @Override
public boolean sandboxed() { public boolean isSandboxed() {
return true; return true;
} }

View File

@ -11,14 +11,18 @@ import org.elasticsearch.search.lookup.SearchLookup;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* A dummy script engine used for testing. Scripts must be a number. Running the script * A dummy script engine used for testing. Scripts must be a number. Running the script
*/ */
public class SleepScriptEngine implements ScriptEngineService { public class SleepScriptEngine implements ScriptEngineService {
public static final String NAME = "sleep"; public static final String NAME = "sleep";
public static final List<String> TYPES = Collections.singletonList(NAME);
public static class TestPlugin extends Plugin { public static class TestPlugin extends Plugin {
public TestPlugin() { public TestPlugin() {
@ -35,23 +39,23 @@ public class SleepScriptEngine implements ScriptEngineService {
} }
public void onModule(ScriptModule module) { public void onModule(ScriptModule module) {
module.addScriptEngine(SleepScriptEngine.class); module.addScriptEngine(new ScriptEngineRegistry.ScriptEngineRegistration(SleepScriptEngine.class, SleepScriptEngine.TYPES));
} }
} }
@Override @Override
public String[] types() { public List<String> getTypes() {
return new String[]{ NAME }; return TYPES;
} }
@Override @Override
public String[] extensions() { public List<String> getExtensions() {
return types(); return TYPES;
} }
@Override @Override
public boolean sandboxed() { public boolean isSandboxed() {
return true; return true;
} }

View File

@ -29,7 +29,7 @@ public class WatcherF {
Settings.Builder settings = Settings.builder(); Settings.Builder settings = Settings.builder();
settings.put("http.cors.enabled", "true"); settings.put("http.cors.enabled", "true");
settings.put("http.cors.allow-origin", "*"); settings.put("http.cors.allow-origin", "*");
settings.put("script.inline", "on"); settings.put("script.inline", "true");
settings.put("shield.enabled", "false"); settings.put("shield.enabled", "false");
settings.put("security.manager.enabled", "false"); settings.put("security.manager.enabled", "false");
settings.put("cluster.name", WatcherF.class.getSimpleName()); settings.put("cluster.name", WatcherF.class.getSimpleName());

View File

@ -67,7 +67,7 @@ public class ScriptConditionTests extends ESTestCase {
public void testExecuteMergedParams() throws Exception { public void testExecuteMergedParams() throws Exception {
ScriptServiceProxy scriptService = getScriptServiceProxy(tp); ScriptServiceProxy scriptService = getScriptServiceProxy(tp);
Script script = Script.inline("ctx.payload.hits.total > threshold").lang(ScriptService.DEFAULT_LANG).params(singletonMap("threshold", 1)).build(); Script script = Script.inline("ctx.payload.hits.total > threshold").lang(Script.DEFAULT_LANG).params(singletonMap("threshold", 1)).build();
ExecutableScriptCondition executable = new ExecutableScriptCondition(new ScriptCondition(script), logger, scriptService); ExecutableScriptCondition executable = new ExecutableScriptCondition(new ScriptCondition(script), logger, scriptService);
SearchResponse response = new SearchResponse(InternalSearchResponse.empty(), "", 3, 3, 500l, new ShardSearchFailure[0]); SearchResponse response = new SearchResponse(InternalSearchResponse.empty(), "", 3, 3, 500l, new ShardSearchFailure[0]);
WatchExecutionContext ctx = mockExecutionContext("_name", new Payload.XContent(response)); WatchExecutionContext ctx = mockExecutionContext("_name", new Payload.XContent(response));

View File

@ -21,8 +21,10 @@ import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.env.Environment; import org.elasticsearch.env.Environment;
import org.elasticsearch.script.ScriptContextRegistry; import org.elasticsearch.script.ScriptContextRegistry;
import org.elasticsearch.script.ScriptEngineRegistry;
import org.elasticsearch.script.ScriptEngineService; import org.elasticsearch.script.ScriptEngineService;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import org.elasticsearch.script.ScriptSettings;
import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.test.ESIntegTestCase; import org.elasticsearch.test.ESIntegTestCase;
import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.threadpool.ThreadPool;
@ -240,16 +242,19 @@ public final class WatcherTestUtils {
public static ScriptServiceProxy getScriptServiceProxy(ThreadPool tp) throws Exception { public static ScriptServiceProxy getScriptServiceProxy(ThreadPool tp) throws Exception {
Settings settings = Settings.settingsBuilder() Settings settings = Settings.settingsBuilder()
.put("script.inline", "on") .put("script.inline", "true")
.put("script.indexed", "on") .put("script.indexed", "true")
.put("path.home", createTempDir()) .put("path.home", createTempDir())
.build(); .build();
XMustacheScriptEngineService mustacheScriptEngineService = new XMustacheScriptEngineService(settings); XMustacheScriptEngineService mustacheScriptEngineService = new XMustacheScriptEngineService(settings);
Set<ScriptEngineService> engineServiceSet = new HashSet<>(); Set<ScriptEngineService> engineServiceSet = new HashSet<>();
engineServiceSet.add(mustacheScriptEngineService); engineServiceSet.add(mustacheScriptEngineService);
ScriptContextRegistry registry = new ScriptContextRegistry(Arrays.asList(ScriptServiceProxy.INSTANCE)); ScriptContextRegistry scriptContextRegistry = new ScriptContextRegistry(Arrays.asList(ScriptServiceProxy.INSTANCE));
return ScriptServiceProxy.of(new ScriptService(settings, new Environment(settings), engineServiceSet, new ResourceWatcherService(settings, tp), registry)); ScriptEngineRegistry scriptEngineRegistry =
new ScriptEngineRegistry(Collections.singletonList(new ScriptEngineRegistry.ScriptEngineRegistration(XMustacheScriptEngineService.class, XMustacheScriptEngineService.TYPES)));
ScriptSettings scriptSettings = new ScriptSettings(scriptEngineRegistry, scriptContextRegistry);
return ScriptServiceProxy.of(new ScriptService(settings, new Environment(settings), engineServiceSet, new ResourceWatcherService(settings, tp), scriptEngineRegistry, scriptContextRegistry, scriptSettings));
} }
public static SearchType getRandomSupportedSearchType() { public static SearchType getRandomSupportedSearchType() {