diff --git a/src/main/java/org/elasticsearch/alerts/condition/script/ScriptCondition.java b/src/main/java/org/elasticsearch/alerts/condition/script/ScriptCondition.java index bdadcf42f78..300a8551ae7 100644 --- a/src/main/java/org/elasticsearch/alerts/condition/script/ScriptCondition.java +++ b/src/main/java/org/elasticsearch/alerts/condition/script/ScriptCondition.java @@ -5,12 +5,12 @@ */ package org.elasticsearch.alerts.condition.script; +import org.elasticsearch.alerts.AlertsSettingsException; import org.elasticsearch.alerts.ExecutionContext; -import org.elasticsearch.alerts.Payload; import org.elasticsearch.alerts.condition.Condition; import org.elasticsearch.alerts.condition.ConditionException; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ScriptServiceProxy; -import org.elasticsearch.common.ParseField; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.logging.ESLogger; @@ -18,10 +18,8 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.script.ExecutableScript; -import org.elasticsearch.script.ScriptService; import java.io.IOException; -import java.util.Locale; /** * This class executes a script against the ctx payload and returns a boolean @@ -30,18 +28,13 @@ public class ScriptCondition extends Condition { public static final String TYPE = "script"; - private final String script; - private final ScriptService.ScriptType scriptType; - private final String scriptLang; - private final ScriptServiceProxy scriptService; + private final Script script; - public ScriptCondition(ESLogger logger, ScriptServiceProxy scriptService, String script, ScriptService.ScriptType scriptType, String scriptLang) { + public ScriptCondition(ESLogger logger, ScriptServiceProxy scriptService, Script script) { super(logger); - this.script = script; - this.scriptType = scriptType; - this.scriptLang = scriptLang; this.scriptService = scriptService; + this.script = script; } @Override @@ -49,13 +42,13 @@ public class ScriptCondition extends Condition { return TYPE; } - @Override - public Result execute(ExecutionContext ctx) throws IOException { - return processPayload(ctx.payload()); + public Script script() { + return script; } - protected Result processPayload(Payload payload) { - ExecutableScript executable = scriptService.executable(scriptLang, script, scriptType, payload.data()); + @Override + public Result execute(ExecutionContext ctx) throws IOException { + ExecutableScript executable = scriptService.executable(script.lang(), script.script(), script.type(), ctx.payload().data()); Object value = executable.run(); if (value instanceof Boolean) { return (Boolean) value ? Result.MET : Result.UNMET; @@ -65,17 +58,11 @@ public class ScriptCondition extends Condition { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - builder.field(ScriptService.SCRIPT_INLINE.getPreferredName(), script); - builder.field(Parser.SCRIPT_TYPE_FIELD.getPreferredName(), scriptType); - builder.field(ScriptService.SCRIPT_LANG.getPreferredName(), scriptLang); - return builder.endObject(); + return script.toXContent(builder, params); } public static class Parser extends AbstractComponent implements Condition.Parser { - public static ParseField SCRIPT_TYPE_FIELD = new ParseField("script_type"); - private final ScriptServiceProxy scriptService; @Inject @@ -91,41 +78,12 @@ public class ScriptCondition extends Condition { @Override public ScriptCondition parse(XContentParser parser) throws IOException { - String scriptLang = null; - String script = null; - ScriptService.ScriptType scriptType = ScriptService.ScriptType.INLINE; - - String currentFieldName = null; - XContentParser.Token token; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if ((token.isValue() || token == XContentParser.Token.START_OBJECT) && currentFieldName != null) { - if (ScriptService.SCRIPT_ID.match(currentFieldName)) { - script = parser.text(); - scriptType = ScriptService.ScriptType.INDEXED; - } else if (ScriptService.SCRIPT_INLINE.match(currentFieldName)) { - script = parser.text(); - } else if (SCRIPT_TYPE_FIELD.match(currentFieldName)) { - String value = parser.text(); - try { - scriptType = ScriptService.ScriptType.valueOf(value.toUpperCase(Locale.ROOT)); - } catch (IllegalArgumentException iae) { - throw new ConditionException("could not parse [script] condition. unknown script type [" + value + "]"); - } - } else if (ScriptService.SCRIPT_LANG.match(currentFieldName)) { - scriptLang = parser.text(); - } else { - throw new ConditionException("could not parse [script] condition. unexpected field [" + currentFieldName + "]"); - } - } + try { + Script script = Script.parse(parser); + return new ScriptCondition(logger, scriptService, script); + } catch (Script.ParseException pe) { + throw new AlertsSettingsException("could not parse [script] condition", pe); } - - if (script == null) { - throw new ConditionException("could not parse [script] condition. either [script] or [script_id] must be provided"); - } - - return new ScriptCondition(logger, scriptService, script, scriptType, scriptLang); } @Override diff --git a/src/main/java/org/elasticsearch/alerts/support/Script.java b/src/main/java/org/elasticsearch/alerts/support/Script.java index 91c4b10a47f..f26509fb078 100644 --- a/src/main/java/org/elasticsearch/alerts/support/Script.java +++ b/src/main/java/org/elasticsearch/alerts/support/Script.java @@ -36,6 +36,10 @@ public class Script implements ToXContent { this(script, ScriptService.ScriptType.INLINE, ScriptService.DEFAULT_LANG, Collections.emptyMap()); } + public Script(String script, ScriptService.ScriptType type, String lang) { + this(script, type, lang, Collections.emptyMap()); + } + public Script(String script, ScriptService.ScriptType type, String lang, Map params) { this.script = script; this.type = type; @@ -87,9 +91,9 @@ public class Script implements ToXContent { public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { return builder.startObject() .field(SCRIPT_FIELD.getPreferredName(), script) - .field(TYPE_FIELD.getPreferredName(), script) + .field(TYPE_FIELD.getPreferredName(), type) .field(LANG_FIELD.getPreferredName(), lang) - .field(PARAMS_FIELD.getPreferredName(), params) + .field(PARAMS_FIELD.getPreferredName(), this.params) .endObject(); } diff --git a/src/main/java/org/elasticsearch/alerts/support/template/ScriptTemplate.java b/src/main/java/org/elasticsearch/alerts/support/template/ScriptTemplate.java index 9d59fc6824a..e99d4469d55 100644 --- a/src/main/java/org/elasticsearch/alerts/support/template/ScriptTemplate.java +++ b/src/main/java/org/elasticsearch/alerts/support/template/ScriptTemplate.java @@ -5,14 +5,9 @@ */ package org.elasticsearch.alerts.support.template; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ScriptServiceProxy; -import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.base.Function; -import org.elasticsearch.common.base.Joiner; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.collect.Collections2; -import org.elasticsearch.common.collect.ImmutableList; -import org.elasticsearch.common.collect.ImmutableMap; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; @@ -25,7 +20,6 @@ import org.elasticsearch.script.ScriptService; import java.io.IOException; import java.util.Collections; import java.util.HashMap; -import java.util.Locale; import java.util.Map; /** @@ -33,60 +27,33 @@ import java.util.Map; */ public class ScriptTemplate implements ToXContent, Template { - static final ParseField TEXT_FIELD = new ParseField("script", "text"); - static final ParseField LANG_FIELD = new ParseField("lang", "language", "script_lang"); - static final ParseField TYPE_FIELD = new ParseField("type", "script_type"); - static final ParseField PARAMS_FIELD = new ParseField("model", "params"); - public static final String DEFAULT_LANG = "mustache"; - private final String text; - private final String lang; - private final ScriptService.ScriptType type; - private final Map params; + private final Script script; private final ScriptServiceProxy service; - public ScriptTemplate(ScriptServiceProxy service, String text) { - this(service, text, DEFAULT_LANG, ScriptService.ScriptType.INLINE, Collections.emptyMap()); + public ScriptTemplate(ScriptServiceProxy service, String script) { + this(service, new Script(script, ScriptService.ScriptType.INLINE, DEFAULT_LANG, Collections.emptyMap())); } - public ScriptTemplate(ScriptServiceProxy service, String text, String lang, ScriptService.ScriptType type) { - this(service, text, lang, type, Collections.emptyMap()); - } - - public ScriptTemplate(ScriptServiceProxy service, String text, String lang, ScriptService.ScriptType type, Map params) { + public ScriptTemplate(ScriptServiceProxy service, Script script) { + this.script = script; this.service = service; - this.text = text; - this.lang = lang; - this.type = type; - this.params = params; } - public String text() { - return text; - } - - public ScriptService.ScriptType type() { - return type; - } - - public String lang() { - return lang; - } - - public Map params() { - return params; + public Script script() { + return script; } @Override public String render(Map model) { Map mergedModel = new HashMap<>(); - mergedModel.putAll(params); + mergedModel.putAll(script.params()); mergedModel.putAll(model); - ExecutableScript script = service.executable(lang, text, type, mergedModel); - Object result = script.run(); + ExecutableScript executable = service.executable(script.lang(), script.script(), script.type(), mergedModel); + Object result = executable.run(); if (result instanceof BytesReference) { - return ((BytesReference) script.run()).toUtf8(); + return ((BytesReference) result).toUtf8(); } return result.toString(); } @@ -98,31 +65,19 @@ public class ScriptTemplate implements ToXContent, Template { ScriptTemplate template = (ScriptTemplate) o; - if (!lang.equals(template.lang)) return false; - if (!params.equals(template.params)) return false; - if (!text.equals(template.text)) return false; - if (type != template.type) return false; + if (!script.equals(template.script)) return false; return true; } @Override public int hashCode() { - int result = text.hashCode(); - result = 31 * result + lang.hashCode(); - result = 31 * result + type.hashCode(); - result = 31 * result + params.hashCode(); - return result; + return script.hashCode(); } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - return builder.startObject() - .field(TEXT_FIELD.getPreferredName(), text) - .field(TYPE_FIELD.getPreferredName(), type.name().toLowerCase(Locale.ROOT)) - .field(LANG_FIELD.getPreferredName(), lang) - .field(PARAMS_FIELD.getPreferredName(), this.params) - .endObject(); + return script.toXContent(builder, params); } /** @@ -139,62 +94,18 @@ public class ScriptTemplate implements ToXContent, Template { @Override public ScriptTemplate parse(XContentParser parser) throws IOException { + // we need to parse the string here, because the default script lang is different + // than the one Script assumes if (parser.currentToken() == XContentParser.Token.VALUE_STRING) { return new ScriptTemplate(scriptService, parser.text()); } - if (parser.currentToken() != XContentParser.Token.START_OBJECT) { - throw new ParseException("expected either a string or an object, but found [" + parser.currentToken() + "] instead"); + try { + Script script = Script.parse(parser); + return new ScriptTemplate(scriptService, script); + } catch (Script.ParseException pe) { + throw new ParseException("could not parse script template", pe); } - String text = null; - ScriptService.ScriptType type = ScriptService.ScriptType.INLINE; - String lang = DEFAULT_LANG; - ImmutableMap.Builder params = ImmutableMap.builder(); - String currentFieldName = null; - XContentParser.Token token; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (TEXT_FIELD.match(currentFieldName)) { - if (token.isValue()) { - text = parser.text(); - } else { - throw new ParseException("expected a string value for [" + currentFieldName + "], but found [" + token + "] instead"); - } - } else if (LANG_FIELD.match(currentFieldName)) { - if (token == XContentParser.Token.VALUE_STRING) { - lang = parser.text(); - } else { - throw new ParseException("expected a string value for [" + currentFieldName + "], but found [" + token + "] instead"); - } - } else if (TYPE_FIELD.match(currentFieldName)) { - if (token == XContentParser.Token.VALUE_STRING) { - String value = parser.text(); - try { - type = ScriptService.ScriptType.valueOf(value.toUpperCase(Locale.ROOT)); - } catch (IllegalArgumentException iae) { - String typeOptions = Joiner.on(",").join(Collections2.transform(ImmutableList.copyOf(ScriptService.ScriptType.values()), new Function() { - @Override - public String apply(ScriptService.ScriptType scriptType) { - return scriptType.name().toLowerCase(Locale.ROOT); - } - })); - throw new ParseException("unknown template script type [" + currentFieldName + "]. type can only be on of: [" + typeOptions + "]"); - } - } - } else if (PARAMS_FIELD.match(currentFieldName)) { - if (token != XContentParser.Token.START_OBJECT) { - throw new ParseException("expected an object for [" + currentFieldName + "], but found [" + token + "]"); - } - params.putAll(parser.map()); - } else { - throw new ParseException("unexpected field [" + currentFieldName + "]"); - } - } - if (text == null) { - throw new ParseException("missing required field [" + TEXT_FIELD.getPreferredName() + "]"); - } - return new ScriptTemplate(scriptService, text, lang, type, params.build()); } } diff --git a/src/main/java/org/elasticsearch/alerts/support/template/Template.java b/src/main/java/org/elasticsearch/alerts/support/template/Template.java index b60bd317988..8acb47a40b6 100644 --- a/src/main/java/org/elasticsearch/alerts/support/template/Template.java +++ b/src/main/java/org/elasticsearch/alerts/support/template/Template.java @@ -28,6 +28,10 @@ public interface Template extends ToXContent { public ParseException(String msg) { super(msg); } + + public ParseException(String msg, Throwable cause) { + super(msg, cause); + } } } diff --git a/src/test/java/org/elasticsearch/alerts/AbstractAlertingTests.java b/src/test/java/org/elasticsearch/alerts/AbstractAlertingTests.java index 54cd00c00f9..55be8fbb1a5 100644 --- a/src/test/java/org/elasticsearch/alerts/AbstractAlertingTests.java +++ b/src/test/java/org/elasticsearch/alerts/AbstractAlertingTests.java @@ -24,6 +24,7 @@ import org.elasticsearch.alerts.history.HistoryStore; import org.elasticsearch.alerts.input.search.SearchInput; import org.elasticsearch.alerts.scheduler.schedule.CronSchedule; import org.elasticsearch.alerts.support.AlertUtils; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ClientProxy; import org.elasticsearch.alerts.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.alerts.support.template.ScriptTemplate; @@ -206,7 +207,7 @@ public abstract class AbstractAlertingTests extends ElasticsearchIntegrationTest new CronSchedule("0/5 * * * * ? *"), new SearchInput(logger, scriptService(), ClientProxy.of(client()), conditionRequest), - new ScriptCondition(logger, scriptService(), "return true", ScriptService.ScriptType.INLINE, "groovy"), + new ScriptCondition(logger, scriptService(), new Script("return true")), new SearchTransform(logger, scriptService(), ClientProxy.of(client()), transformRequest), new Actions(actions), metadata, new Alert.Status(), new TimeValue(0) ); } diff --git a/src/test/java/org/elasticsearch/alerts/AlertThrottleTests.java b/src/test/java/org/elasticsearch/alerts/AlertThrottleTests.java index b583e93ed40..53e9e441b62 100644 --- a/src/test/java/org/elasticsearch/alerts/AlertThrottleTests.java +++ b/src/test/java/org/elasticsearch/alerts/AlertThrottleTests.java @@ -20,6 +20,7 @@ import org.elasticsearch.alerts.history.FiredAlert; import org.elasticsearch.alerts.history.HistoryStore; import org.elasticsearch.alerts.input.search.SearchInput; import org.elasticsearch.alerts.scheduler.schedule.CronSchedule; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ClientProxy; import org.elasticsearch.alerts.transform.SearchTransform; import org.elasticsearch.alerts.transport.actions.ack.AckAlertResponse; @@ -30,7 +31,6 @@ import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.script.ScriptService; import org.elasticsearch.search.SearchHit; import org.junit.Test; @@ -69,7 +69,7 @@ public class AlertThrottleTests extends AbstractAlertingTests { new CronSchedule("0/5 * * * * ? *"), new SearchInput(logger, scriptService(), ClientProxy.of(client()), request), - new ScriptCondition(logger, scriptService(), "hits.total > 0", ScriptService.ScriptType.INLINE, "groovy"), + new ScriptCondition(logger, scriptService(), new Script("hits.total > 0")), new SearchTransform(logger, scriptService(), ClientProxy.of(client()), request), new Actions(actions), null, new Alert.Status(), new TimeValue(0) ); @@ -148,12 +148,9 @@ public class AlertThrottleTests extends AbstractAlertingTests { "test-time-throttle", new CronSchedule("0/5 * * * * ? *"), new SearchInput(logger, scriptService(), ClientProxy.of(client()), request), - new ScriptCondition(logger, scriptService(), "hits.total > 0", ScriptService.ScriptType.INLINE, "groovy"), + new ScriptCondition(logger, scriptService(), new Script("hits.total > 0")), new SearchTransform(logger, scriptService(), ClientProxy.of(client()), request), - new Actions(actions), null, new Alert.Status(), new TimeValue(10, TimeUnit.SECONDS) - ); - - + new Actions(actions), null, new Alert.Status(), new TimeValue(10, TimeUnit.SECONDS)); XContentBuilder jsonBuilder = XContentFactory.jsonBuilder(); alert.toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS); @@ -205,8 +202,8 @@ public class AlertThrottleTests extends AbstractAlertingTests { while(System.currentTimeMillis() < start + value.getMillis()){ try{ Thread.sleep(value.getMillis() - (System.currentTimeMillis() - start)); - } catch (InterruptedException ie){ - + } catch (InterruptedException ie) { + logger.error("interrupted", ie); } } } diff --git a/src/test/java/org/elasticsearch/alerts/BootStrapTest.java b/src/test/java/org/elasticsearch/alerts/BootStrapTest.java index 2998f21e101..582875ff0ee 100644 --- a/src/test/java/org/elasticsearch/alerts/BootStrapTest.java +++ b/src/test/java/org/elasticsearch/alerts/BootStrapTest.java @@ -16,6 +16,7 @@ import org.elasticsearch.alerts.history.FiredAlert; import org.elasticsearch.alerts.history.HistoryStore; import org.elasticsearch.alerts.input.search.SearchInput; import org.elasticsearch.alerts.scheduler.schedule.CronSchedule; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ClientProxy; import org.elasticsearch.alerts.transform.SearchTransform; import org.elasticsearch.alerts.transport.actions.put.PutAlertResponse; @@ -27,7 +28,6 @@ import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.script.ScriptService; import org.elasticsearch.test.junit.annotations.TestLogging; import org.junit.Test; @@ -80,7 +80,7 @@ public class BootStrapTest extends AbstractAlertingTests { "test-serialization", new CronSchedule("0/5 * * * * ? 2035"), //Set this into the future so we don't get any extra runs new SearchInput(logger, scriptService(), ClientProxy.of(client()), searchRequest), - new ScriptCondition(logger, scriptService(), "return true", ScriptService.ScriptType.INLINE, "groovy"), + new ScriptCondition(logger, scriptService(), new Script("return true")), new SearchTransform(logger, scriptService(), ClientProxy.of(client()), searchRequest), new Actions(new ArrayList()), null, new Alert.Status(), new TimeValue(0) @@ -139,7 +139,7 @@ public class BootStrapTest extends AbstractAlertingTests { new CronSchedule("0/5 * * * * ? 2035"), //Set a cron schedule far into the future so this alert is never scheduled new SearchInput(logger, scriptService(), ClientProxy.of(client()), searchRequest), - new ScriptCondition(logger, scriptService(), "return true", ScriptService.ScriptType.INLINE, "groovy"), + new ScriptCondition(logger, scriptService(), new Script("return true")), new SearchTransform(logger, scriptService(), ClientProxy.of(client()), searchRequest), new Actions(new ArrayList()), null, diff --git a/src/test/java/org/elasticsearch/alerts/TransformSearchTest.java b/src/test/java/org/elasticsearch/alerts/TransformSearchTest.java index c14f6412a29..36171492b3a 100644 --- a/src/test/java/org/elasticsearch/alerts/TransformSearchTest.java +++ b/src/test/java/org/elasticsearch/alerts/TransformSearchTest.java @@ -13,6 +13,7 @@ import org.elasticsearch.alerts.actions.index.IndexAction; import org.elasticsearch.alerts.condition.script.ScriptCondition; import org.elasticsearch.alerts.input.search.SearchInput; import org.elasticsearch.alerts.scheduler.schedule.CronSchedule; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ClientProxy; import org.elasticsearch.alerts.transform.SearchTransform; import org.elasticsearch.alerts.transport.actions.put.PutAlertResponse; @@ -61,7 +62,7 @@ public class TransformSearchTest extends AbstractAlertingTests { new CronSchedule("0/5 * * * * ? *"), new SearchInput(logger, scriptService(), ClientProxy.of(client()), conditionRequest), - new ScriptCondition(logger, scriptService(), "return true", ScriptService.ScriptType.INLINE, "groovy"), + new ScriptCondition(logger, scriptService(), new Script("return true")), new SearchTransform(logger, scriptService(), ClientProxy.of(client()), transformRequest), new Actions(actions), metadata, new Alert.Status(), new TimeValue(0) ); diff --git a/src/test/java/org/elasticsearch/alerts/actions/ActionsTest.java b/src/test/java/org/elasticsearch/alerts/actions/ActionsTest.java index 129bd41f35a..12f597d8a7f 100644 --- a/src/test/java/org/elasticsearch/alerts/actions/ActionsTest.java +++ b/src/test/java/org/elasticsearch/alerts/actions/ActionsTest.java @@ -14,6 +14,7 @@ import org.elasticsearch.alerts.condition.script.ScriptCondition; import org.elasticsearch.alerts.input.Input; import org.elasticsearch.alerts.input.search.SearchInput; import org.elasticsearch.alerts.scheduler.schedule.CronSchedule; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ClientProxy; import org.elasticsearch.alerts.transform.SearchTransform; import org.elasticsearch.alerts.transport.actions.delete.DeleteAlertRequest; @@ -60,7 +61,7 @@ public class ActionsTest extends AbstractAlertingTests { Input alertInput = new SearchInput(logger, scriptService(), ClientProxy.of(client()), createConditionSearchRequest()); - Condition alertCondition = new ScriptCondition(logger, scriptService(), "return true", ScriptService.ScriptType.INLINE, "groovy"); + Condition alertCondition = new ScriptCondition(logger, scriptService(), new Script("return true")); diff --git a/src/test/java/org/elasticsearch/alerts/actions/email/EmailActionTests.java b/src/test/java/org/elasticsearch/alerts/actions/email/EmailActionTests.java index 90f2f49f51e..f37dc3913de 100644 --- a/src/test/java/org/elasticsearch/alerts/actions/email/EmailActionTests.java +++ b/src/test/java/org/elasticsearch/alerts/actions/email/EmailActionTests.java @@ -163,21 +163,21 @@ public class EmailActionTests extends ElasticsearchTestCase { } if (subject != null) { if (randomBoolean()) { - builder.field("subject", subject.text()); + builder.field("subject", subject.script().script()); } else { builder.field("subject", subject); } } if (textBody != null) { if (randomBoolean()) { - builder.field("text_body", textBody.text()); + builder.field("text_body", textBody.script().script()); } else { builder.field("text_body", textBody); } } if (htmlBody != null) { if (randomBoolean()) { - builder.field("html_body", htmlBody.text()); + builder.field("html_body", htmlBody.script().script()); } else { builder.field("html_body", htmlBody); } diff --git a/src/test/java/org/elasticsearch/alerts/condition/script/ScriptConditionTests.java b/src/test/java/org/elasticsearch/alerts/condition/script/ScriptConditionTests.java index 4874a72568b..d5a16ccf0f2 100644 --- a/src/test/java/org/elasticsearch/alerts/condition/script/ScriptConditionTests.java +++ b/src/test/java/org/elasticsearch/alerts/condition/script/ScriptConditionTests.java @@ -7,8 +7,11 @@ package org.elasticsearch.alerts.condition.script; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.ShardSearchFailure; +import org.elasticsearch.alerts.AlertsSettingsException; +import org.elasticsearch.alerts.ExecutionContext; import org.elasticsearch.alerts.Payload; import org.elasticsearch.alerts.condition.ConditionException; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; @@ -32,6 +35,7 @@ import java.util.HashSet; import java.util.Set; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; +import static org.mockito.Mockito.*; /** */ @@ -53,9 +57,11 @@ public class ScriptConditionTests extends ElasticsearchTestCase { @Test public void testExecute() throws Exception { ScriptServiceProxy scriptService = getScriptServiceProxy(tp); - ScriptCondition condition = new ScriptCondition(logger, scriptService, "hits.total > 1", ScriptService.ScriptType.INLINE, "groovy"); + ScriptCondition condition = new ScriptCondition(logger, scriptService, new Script("hits.total > 1")); SearchResponse response = new SearchResponse(InternalSearchResponse.empty(), "", 3, 3, 500l, new ShardSearchFailure[0]); - assertFalse(condition.processPayload(new Payload.ActionResponse(response)).met()); + ExecutionContext ctx = mock(ExecutionContext.class); + when(ctx.payload()).thenReturn(new Payload.ActionResponse(response)); + assertFalse(condition.execute(ctx).met()); } @Test @@ -64,31 +70,35 @@ public class ScriptConditionTests extends ElasticsearchTestCase { XContentBuilder builder = createConditionContent("hits.total > 1", null, null); XContentParser parser = XContentFactory.xContent(builder.bytes()).createParser(builder.bytes()); + parser.nextToken(); ScriptCondition condition = conditionParser.parse(parser); SearchResponse response = new SearchResponse(InternalSearchResponse.empty(), "", 3, 3, 500l, new ShardSearchFailure[0]); + ExecutionContext ctx = mock(ExecutionContext.class); + when(ctx.payload()).thenReturn(new Payload.ActionResponse(response)); - assertFalse(condition.processPayload(new Payload.ActionResponse(response)).met()); + assertFalse(condition.execute(ctx).met()); builder = createConditionContent("return true", null, null); parser = XContentFactory.xContent(builder.bytes()).createParser(builder.bytes()); + parser.nextToken(); condition = conditionParser.parse(parser); - assertTrue(condition.processPayload(new Payload.ActionResponse(response)).met()); + reset(ctx); + when(ctx.payload()).thenReturn(new Payload.ActionResponse(response)); + + assertTrue(condition.execute(ctx).met()); } - @Test(expected = ConditionException.class) + @Test(expected = AlertsSettingsException.class) public void testParser_InValid() throws Exception { ScriptCondition.Parser conditionParser = new ScriptCondition.Parser(ImmutableSettings.settingsBuilder().build(), getScriptServiceProxy(tp)); XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject().endObject(); XContentParser parser = XContentFactory.xContent(builder.bytes()).createParser(builder.bytes()); - try { - conditionParser.parse(parser); - } catch (Throwable t) { - throw t; - } + parser.nextToken(); + conditionParser.parse(parser); fail("expected a condition exception trying to parse an invalid condition XContent"); } @@ -140,20 +150,15 @@ public class ScriptConditionTests extends ElasticsearchTestCase { } private static XContentBuilder createConditionContent(String script, String scriptLang, ScriptService.ScriptType scriptType) throws IOException { - XContentBuilder jsonBuilder = jsonBuilder(); - jsonBuilder.startObject(); - jsonBuilder.field("script"); - jsonBuilder.startObject(); - jsonBuilder.field("script", script); + XContentBuilder builder = jsonBuilder().startObject(); + builder.field("script", script); if (scriptLang != null) { - jsonBuilder.field("script_lang", scriptLang); + builder.field("lang", scriptLang); } if (scriptType != null) { - jsonBuilder.field("script_type", scriptType.toString()); + builder.field("type", scriptType.toString()); } - jsonBuilder.endObject(); - jsonBuilder.endObject(); - return jsonBuilder; + return builder.endObject(); } diff --git a/src/test/java/org/elasticsearch/alerts/support/template/ScriptTemplateTests.java b/src/test/java/org/elasticsearch/alerts/support/template/ScriptTemplateTests.java index 5880eee9546..b4bb487c341 100644 --- a/src/test/java/org/elasticsearch/alerts/support/template/ScriptTemplateTests.java +++ b/src/test/java/org/elasticsearch/alerts/support/template/ScriptTemplateTests.java @@ -5,6 +5,7 @@ */ package org.elasticsearch.alerts.support.template; +import org.elasticsearch.alerts.support.Script; import org.elasticsearch.alerts.support.init.proxy.ScriptServiceProxy; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.collect.ImmutableMap; @@ -51,7 +52,8 @@ public class ScriptTemplateTests extends ElasticsearchTestCase { when(script.run()).thenReturn("rendered_text"); when(proxy.executable(lang, templateText, scriptType, merged)).thenReturn(script); - ScriptTemplate template = new ScriptTemplate(proxy, templateText, lang, scriptType, params); + Script script = new Script(templateText, scriptType, lang, params); + ScriptTemplate template = new ScriptTemplate(proxy, script); assertThat(template.render(model), is("rendered_text")); } @@ -67,7 +69,8 @@ public class ScriptTemplateTests extends ElasticsearchTestCase { when(script.run()).thenReturn("rendered_text"); when(proxy.executable(lang, templateText, scriptType, model)).thenReturn(script); - ScriptTemplate template = new ScriptTemplate(proxy, templateText, lang, scriptType, params); + Script script = new Script(templateText, scriptType, lang, params); + ScriptTemplate template = new ScriptTemplate(proxy, script); assertThat(template.render(model), is("rendered_text")); } @@ -87,13 +90,14 @@ public class ScriptTemplateTests extends ElasticsearchTestCase { public void testParser() throws Exception { ScriptTemplate.Parser templateParser = new ScriptTemplate.Parser(ImmutableSettings.EMPTY, proxy); - ScriptTemplate template = new ScriptTemplate(proxy, "_template", "_lang", randomScriptType(), ImmutableMap.of("param_key", "param_val")); + Script script = new Script("_template", randomScriptType(), "_lang", ImmutableMap.of("param_key", "param_val")); + ScriptTemplate template = new ScriptTemplate(proxy, script); XContentBuilder builder = jsonBuilder().startObject() - .field(randomFrom("lang", "script_lang"), template.lang()) - .field(randomFrom("script", "text"), template.text()) - .field(randomFrom("type", "script_type"), template.type().name()) - .field(randomFrom("params", "model"), template.params()) + .field(randomFrom("lang"), template.script().lang()) + .field(randomFrom("script"), template.script().script()) + .field(randomFrom("type"), template.script().type().name()) + .field(randomFrom("params"), template.script().params()) .endObject(); BytesReference bytes = builder.bytes(); XContentParser parser = JsonXContent.jsonXContent.createParser(bytes); @@ -107,10 +111,12 @@ public class ScriptTemplateTests extends ElasticsearchTestCase { public void testParser_ParserSelfGenerated() throws Exception { ScriptTemplate.Parser templateParser = new ScriptTemplate.Parser(ImmutableSettings.EMPTY, proxy); - ScriptTemplate template = new ScriptTemplate(proxy, "_template", "_lang", randomScriptType(), ImmutableMap.of("param_key", "param_val")); + Script script = new Script("_template", randomScriptType(), "_lang", ImmutableMap.of("param_key", "param_val")); + ScriptTemplate template = new ScriptTemplate(proxy, script); XContentBuilder builder = jsonBuilder().value(template); BytesReference bytes = builder.bytes(); + System.out.println(bytes.toUtf8()); XContentParser parser = JsonXContent.jsonXContent.createParser(bytes); parser.nextToken(); ScriptTemplate parsed = templateParser.parse(parser); diff --git a/src/test/java/org/elasticsearch/alerts/test/AbstractAlertsSingleNodeTests.java b/src/test/java/org/elasticsearch/alerts/test/AbstractAlertsSingleNodeTests.java index af445c15dc2..1bf6ee724f8 100644 --- a/src/test/java/org/elasticsearch/alerts/test/AbstractAlertsSingleNodeTests.java +++ b/src/test/java/org/elasticsearch/alerts/test/AbstractAlertsSingleNodeTests.java @@ -42,7 +42,7 @@ public abstract class AbstractAlertsSingleNodeTests extends ElasticsearchSingleN @Override protected boolean resetNodeAfterTest() { - return true; + return false; } protected IndexResponse index(String index, String type, String id) {