diff options
7 files changed, 37 insertions, 11 deletions
diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java index ca26df75de..d35a26d9c3 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequest.java @@ -38,6 +38,7 @@ public class PutStoredScriptRequest extends AcknowledgedRequest<PutStoredScriptR private String id; private String lang; + private String context; private BytesReference content; private XContentType xContentType; @@ -45,10 +46,11 @@ public class PutStoredScriptRequest extends AcknowledgedRequest<PutStoredScriptR super(); } - public PutStoredScriptRequest(String id, String lang, BytesReference content, XContentType xContentType) { + public PutStoredScriptRequest(String id, String lang, String context, BytesReference content, XContentType xContentType) { super(); this.id = id; this.lang = lang; + this.context = context; this.content = content; this.xContentType = Objects.requireNonNull(xContentType); } @@ -94,6 +96,15 @@ public class PutStoredScriptRequest extends AcknowledgedRequest<PutStoredScriptR return this; } + public String context() { + return context; + } + + public PutStoredScriptRequest context(String context) { + this.context = context; + return this; + } + public BytesReference content() { return content; } @@ -128,6 +139,9 @@ public class PutStoredScriptRequest extends AcknowledgedRequest<PutStoredScriptR } else { xContentType = XContentFactory.xContentType(content); } + if (in.getVersion().onOrAfter(Version.V_6_0_0_alpha2)) { + context = in.readOptionalString(); + } } @Override @@ -140,6 +154,9 @@ public class PutStoredScriptRequest extends AcknowledgedRequest<PutStoredScriptR if (out.getVersion().onOrAfter(Version.V_5_3_0)) { xContentType.writeTo(out); } + if (out.getVersion().onOrAfter(Version.V_6_0_0_alpha2)) { + out.writeOptionalString(context); + } } @Override diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutStoredScriptAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutStoredScriptAction.java index 358c3656ce..a7e9c6c8e8 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutStoredScriptAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutStoredScriptAction.java @@ -50,6 +50,7 @@ public class RestPutStoredScriptAction extends BaseRestHandler { public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException { String id = request.param("id"); String lang = request.param("lang"); + String context = request.param("context"); // In the case where only {lang} is not null, we make it {id} because of // name ordering issues in the handlers' paths. @@ -65,7 +66,7 @@ public class RestPutStoredScriptAction extends BaseRestHandler { "specifying lang [" + lang + "] as part of the url path is deprecated, use request content instead"); } - PutStoredScriptRequest putRequest = new PutStoredScriptRequest(id, lang, content, request.getXContentType()); + PutStoredScriptRequest putRequest = new PutStoredScriptRequest(id, lang, context, content, request.getXContentType()); return channel -> client.admin().cluster().putStoredScript(putRequest, new AcknowledgedRestListener<>(channel)); } } diff --git a/core/src/main/java/org/elasticsearch/script/ScriptService.java b/core/src/main/java/org/elasticsearch/script/ScriptService.java index 2634cbda8d..981d952d63 100644 --- a/core/src/main/java/org/elasticsearch/script/ScriptService.java +++ b/core/src/main/java/org/elasticsearch/script/ScriptService.java @@ -431,14 +431,12 @@ public class ScriptService extends AbstractComponent implements Closeable, Clust } else if (isAnyContextEnabled() == false) { throw new IllegalArgumentException( "cannot put [" + ScriptType.STORED + "] script, no script contexts are enabled"); - } else { - // TODO: executable context here is just a placeholder, replace with optional context name passed into PUT stored script req - Object compiled = scriptEngine.compile(request.id(), source.getCode(), ExecutableScript.CONTEXT, Collections.emptyMap()); - - if (compiled == null) { - throw new IllegalArgumentException("failed to parse/compile stored script [" + request.id() + "]" + - (source.getCode() == null ? "" : " using code [" + source.getCode() + "]")); + } else if (request.context() != null) { + ScriptContext<?> context = contexts.get(request.context()); + if (context == null) { + throw new IllegalArgumentException("Unknown context [" + request.context() + "]"); } + scriptEngine.compile(request.id(), source.getCode(), context, Collections.emptyMap()); } } catch (ScriptException good) { throw good; diff --git a/core/src/test/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java b/core/src/test/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java index aec8349ea8..a60722d3f4 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/cluster/storedscripts/PutStoredScriptRequestTests.java @@ -32,7 +32,8 @@ import java.util.Base64; public class PutStoredScriptRequestTests extends ESTestCase { public void testSerialization() throws IOException { - PutStoredScriptRequest storedScriptRequest = new PutStoredScriptRequest("foo", "bar", new BytesArray("{}"), XContentType.JSON); + PutStoredScriptRequest storedScriptRequest = + new PutStoredScriptRequest("foo", "bar", "context", new BytesArray("{}"), XContentType.JSON); assertEquals(XContentType.JSON, storedScriptRequest.xContentType()); try (BytesStreamOutput output = new BytesStreamOutput()) { @@ -44,6 +45,7 @@ public class PutStoredScriptRequestTests extends ESTestCase { assertEquals(XContentType.JSON, serialized.xContentType()); assertEquals(storedScriptRequest.lang(), serialized.lang()); assertEquals(storedScriptRequest.id(), serialized.id()); + assertEquals(storedScriptRequest.context(), serialized.context()); } } } diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java index 83925f0ec0..6d75dbf6b6 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestPutSearchTemplateAction.java @@ -26,6 +26,7 @@ import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.action.AcknowledgedRestListener; +import org.elasticsearch.script.ExecutableScript; import org.elasticsearch.script.Script; import java.io.IOException; @@ -47,7 +48,8 @@ public class RestPutSearchTemplateAction extends BaseRestHandler { String id = request.param("id"); BytesReference content = request.content(); - PutStoredScriptRequest put = new PutStoredScriptRequest(id, Script.DEFAULT_TEMPLATE_LANG, content, request.getXContentType()); + PutStoredScriptRequest put = new PutStoredScriptRequest(id, Script.DEFAULT_TEMPLATE_LANG, ExecutableScript.CONTEXT.name, + content, request.getXContentType()); return channel -> client.admin().cluster().putStoredScript(put, new AcknowledgedRestListener<>(channel)); } } diff --git a/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/16_update2.yml b/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/16_update2.yml index 88c40f7ddb..c96bec29ec 100644 --- a/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/16_update2.yml +++ b/modules/lang-painless/src/test/resources/rest-api-spec/test/painless/16_update2.yml @@ -38,10 +38,12 @@ catch: request put_script: id: "1" + context: "search" body: { "script": {"lang": "painless", "code": "_score * foo bar + doc['myParent.weight'].value"} } - do: catch: /compile error/ put_script: id: "1" + context: "search" body: { "script": {"lang": "painless", "code": "_score * foo bar + doc['myParent.weight'].value"} } diff --git a/rest-api-spec/src/main/resources/rest-api-spec/api/put_script.json b/rest-api-spec/src/main/resources/rest-api-spec/api/put_script.json index c29fdbbca0..dce52f787c 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/api/put_script.json +++ b/rest-api-spec/src/main/resources/rest-api-spec/api/put_script.json @@ -18,6 +18,10 @@ } }, "params" : { + "context": { + "type" : "string", + "description" : "Context name to compile script against" + } } }, "body": { |